From 15e8ca11618e4af082120a498f4bb8ac4c3bc267 Mon Sep 17 00:00:00 2001 From: Michael Dokolin Date: Fri, 16 Apr 2021 10:09:34 +0200 Subject: [PATCH 01/82] [Reporting] Remove legacy elasticsearch client usage from the reporting plugin (#97184) --- x-pack/plugins/reporting/common/types.ts | 4 +- x-pack/plugins/reporting/server/core.ts | 7 - .../export_types/csv/execute_job.test.ts | 541 ++++++++++-------- .../server/export_types/csv/execute_job.ts | 9 +- .../csv/generate_csv/hit_iterator.test.ts | 59 +- .../csv/generate_csv/hit_iterator.ts | 39 +- .../export_types/csv/generate_csv/index.ts | 8 +- .../png/execute_job/index.test.ts | 10 - .../printable_pdf/execute_job/index.test.ts | 10 - .../reporting/server/lib/store/report.ts | 4 +- .../reporting/server/lib/store/store.test.ts | 79 ++- .../reporting/server/lib/store/store.ts | 186 +++--- x-pack/plugins/reporting/server/plugin.ts | 3 +- .../server/routes/diagnostic/config.test.ts | 23 +- .../server/routes/diagnostic/config.ts | 10 +- .../server/routes/generation.test.ts | 17 +- .../reporting/server/routes/jobs.test.ts | 118 ++-- .../reporting/server/routes/lib/jobs_query.ts | 153 +++-- .../create_mock_reportingplugin.ts | 3 +- 19 files changed, 638 insertions(+), 645 deletions(-) diff --git a/x-pack/plugins/reporting/common/types.ts b/x-pack/plugins/reporting/common/types.ts index 5e20381e35898..2148cf983d889 100644 --- a/x-pack/plugins/reporting/common/types.ts +++ b/x-pack/plugins/reporting/common/types.ts @@ -40,8 +40,8 @@ export interface LayoutParams { export interface ReportDocumentHead { _id: string; _index: string; - _seq_no: unknown; - _primary_term: unknown; + _seq_no: number; + _primary_term: number; } export interface TaskRunResult { diff --git a/x-pack/plugins/reporting/server/core.ts b/x-pack/plugins/reporting/server/core.ts index b0f0a8c8c7ece..03c76941a6e99 100644 --- a/x-pack/plugins/reporting/server/core.ts +++ b/x-pack/plugins/reporting/server/core.ts @@ -10,7 +10,6 @@ import * as Rx from 'rxjs'; import { first, map, take } from 'rxjs/operators'; import { BasePath, - ElasticsearchServiceSetup, IClusterClient, KibanaRequest, PluginInitializerContext, @@ -38,7 +37,6 @@ export interface ReportingInternalSetup { basePath: Pick; router: ReportingPluginRouter; features: FeaturesPluginSetup; - elasticsearch: ElasticsearchServiceSetup; licensing: LicensingPluginSetup; security?: SecurityPluginSetup; spaces?: SpacesPluginSetup; @@ -212,11 +210,6 @@ export class ReportingCore { return this.pluginSetupDeps; } - // NOTE: Uses the Legacy API - public getElasticsearchService() { - return this.getPluginSetupDeps().elasticsearch; - } - private async getSavedObjectsClient(request: KibanaRequest) { const { savedObjects } = await this.getPluginStartDeps(); return savedObjects.getScopedClient(request) as SavedObjectsClientContract; diff --git a/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts b/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts index c0235ee56e00f..f63c07e51dd03 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/execute_job.test.ts @@ -5,8 +5,9 @@ * 2.0. */ +import type { DeeplyMockedKeys } from '@kbn/utility-types/jest'; import nodeCrypto from '@elastic/node-crypto'; -import { ElasticsearchServiceSetup, IUiSettingsClient } from 'kibana/server'; +import { ElasticsearchClient, IUiSettingsClient } from 'kibana/server'; import moment from 'moment'; // @ts-ignore import Puid from 'puid'; @@ -50,20 +51,12 @@ describe('CSV Execute Job', function () { let defaultElasticsearchResponse: any; let encryptedHeaders: any; - let clusterStub: any; let configGetStub: any; + let mockEsClient: DeeplyMockedKeys; let mockReportingConfig: ReportingConfig; let mockReportingCore: ReportingCore; - let callAsCurrentUserStub: any; let cancellationToken: any; - const mockElasticsearch = { - legacy: { - client: { - asScoped: () => clusterStub, - }, - }, - }; const mockUiSettingsClient = { get: sinon.stub(), }; @@ -85,10 +78,10 @@ describe('CSV Execute Job', function () { mockReportingCore = await createMockReportingCore(mockReportingConfig); mockReportingCore.getUiSettingsServiceFactory = () => Promise.resolve((mockUiSettingsClient as unknown) as IUiSettingsClient); - mockReportingCore.getElasticsearchService = () => - mockElasticsearch as ElasticsearchServiceSetup; mockReportingCore.setConfig(mockReportingConfig); + mockEsClient = (await mockReportingCore.getEsClient()).asScoped({} as any) + .asCurrentUser as typeof mockEsClient; cancellationToken = new CancellationToken(); defaultElasticsearchResponse = { @@ -97,14 +90,9 @@ describe('CSV Execute Job', function () { }, _scroll_id: 'defaultScrollId', }; - clusterStub = { - callAsCurrentUser() {}, - }; - - callAsCurrentUserStub = sinon - .stub(clusterStub, 'callAsCurrentUser') - .resolves(defaultElasticsearchResponse); + mockEsClient.search.mockResolvedValue({ body: defaultElasticsearchResponse } as any); + mockEsClient.scroll.mockResolvedValue({ body: defaultElasticsearchResponse } as any); mockUiSettingsClient.get.withArgs(CSV_SEPARATOR_SETTING).returns(','); mockUiSettingsClient.get.withArgs(CSV_QUOTE_VALUES_SETTING).returns(true); @@ -127,7 +115,7 @@ describe('CSV Execute Job', function () { }); describe('basic Elasticsearch call behavior', function () { - it('should decrypt encrypted headers and pass to callAsCurrentUser', async function () { + it('should decrypt encrypted headers and pass to the elasticsearch client', async function () { const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', @@ -138,8 +126,7 @@ describe('CSV Execute Job', function () { }), cancellationToken ); - expect(callAsCurrentUserStub.called).toBe(true); - expect(callAsCurrentUserStub.firstCall.args[0]).toEqual('search'); + expect(mockEsClient.search).toHaveBeenCalled(); }); it('should pass the index and body to execute the initial search', async function () { @@ -160,21 +147,22 @@ describe('CSV Execute Job', function () { await runTask('job777', job, cancellationToken); - const searchCall = callAsCurrentUserStub.firstCall; - expect(searchCall.args[0]).toBe('search'); - expect(searchCall.args[1].index).toBe(index); - expect(searchCall.args[1].body).toBe(body); + expect(mockEsClient.search).toHaveBeenCalledWith(expect.objectContaining({ body, index })); }); it('should pass the scrollId from the initial search to the subsequent scroll', async function () { const scrollId = getRandomScrollId(); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: scrollId, }, - _scroll_id: scrollId, - }); - callAsCurrentUserStub.onSecondCall().resolves(defaultElasticsearchResponse); + } as any); + mockEsClient.scroll.mockResolvedValue({ body: defaultElasticsearchResponse } as any); + const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( 'job456', @@ -186,10 +174,9 @@ describe('CSV Execute Job', function () { cancellationToken ); - const scrollCall = callAsCurrentUserStub.secondCall; - - expect(scrollCall.args[0]).toBe('scroll'); - expect(scrollCall.args[1].scrollId).toBe(scrollId); + expect(mockEsClient.scroll).toHaveBeenCalledWith( + expect.objectContaining({ scroll_id: scrollId }) + ); }); it('should not execute scroll if there are no hits from the search', async function () { @@ -204,28 +191,27 @@ describe('CSV Execute Job', function () { cancellationToken ); - expect(callAsCurrentUserStub.callCount).toBe(2); - - const searchCall = callAsCurrentUserStub.firstCall; - expect(searchCall.args[0]).toBe('search'); - - const clearScrollCall = callAsCurrentUserStub.secondCall; - expect(clearScrollCall.args[0]).toBe('clearScroll'); + expect(mockEsClient.search).toHaveBeenCalled(); + expect(mockEsClient.clearScroll).toHaveBeenCalled(); }); it('should stop executing scroll if there are no hits', async function () { - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); - callAsCurrentUserStub.onSecondCall().resolves({ - hits: { - hits: [], + } as any); + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + hits: { + hits: [], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( @@ -238,33 +224,30 @@ describe('CSV Execute Job', function () { cancellationToken ); - expect(callAsCurrentUserStub.callCount).toBe(3); - - const searchCall = callAsCurrentUserStub.firstCall; - expect(searchCall.args[0]).toBe('search'); - - const scrollCall = callAsCurrentUserStub.secondCall; - expect(scrollCall.args[0]).toBe('scroll'); - - const clearScroll = callAsCurrentUserStub.thirdCall; - expect(clearScroll.args[0]).toBe('clearScroll'); + expect(mockEsClient.search).toHaveBeenCalled(); + expect(mockEsClient.scroll).toHaveBeenCalled(); + expect(mockEsClient.clearScroll).toHaveBeenCalled(); }); it('should call clearScroll with scrollId when there are no more hits', async function () { const lastScrollId = getRandomScrollId(); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); - callAsCurrentUserStub.onSecondCall().resolves({ - hits: { - hits: [], + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + hits: { + hits: [], + }, + _scroll_id: lastScrollId, }, - _scroll_id: lastScrollId, - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); await runTask( @@ -277,26 +260,28 @@ describe('CSV Execute Job', function () { cancellationToken ); - const lastCall = callAsCurrentUserStub.getCall(callAsCurrentUserStub.callCount - 1); - expect(lastCall.args[0]).toBe('clearScroll'); - expect(lastCall.args[1].scrollId).toEqual([lastScrollId]); + expect(mockEsClient.clearScroll).toHaveBeenCalledWith( + expect.objectContaining({ scroll_id: lastScrollId }) + ); }); it('calls clearScroll when there is an error iterating the hits', async function () { const lastScrollId = getRandomScrollId(); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [ - { - _source: { - one: 'foo', - two: 'bar', + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [ + { + _source: { + one: 'foo', + two: 'bar', + }, }, - }, - ], + ], + }, + _scroll_id: lastScrollId, }, - _scroll_id: lastScrollId, - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -309,21 +294,23 @@ describe('CSV Execute Job', function () { `[TypeError: Cannot read property 'indexOf' of undefined]` ); - const lastCall = callAsCurrentUserStub.getCall(callAsCurrentUserStub.callCount - 1); - expect(lastCall.args[0]).toBe('clearScroll'); - expect(lastCall.args[1].scrollId).toEqual([lastScrollId]); + expect(mockEsClient.clearScroll).toHaveBeenCalledWith( + expect.objectContaining({ scroll_id: lastScrollId }) + ); }); }); describe('Warning when cells have formulas', () => { it('returns `csv_contains_formulas` when cells contain formulas', async function () { configGetStub.withArgs('csv', 'checkForFormulas').returns(true); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: '=SUM(A1:A2)', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: '=SUM(A1:A2)', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -343,12 +330,14 @@ describe('CSV Execute Job', function () { it('returns warnings when headings contain formulas', async function () { configGetStub.withArgs('csv', 'checkForFormulas').returns(true); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { '=SUM(A1:A2)': 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { '=SUM(A1:A2)': 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -369,12 +358,14 @@ describe('CSV Execute Job', function () { it('returns no warnings when cells have no formulas', async function () { configGetStub.withArgs('csv', 'checkForFormulas').returns(true); configGetStub.withArgs('csv', 'escapeFormulaValues').returns(false); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -395,12 +386,14 @@ describe('CSV Execute Job', function () { it('returns no warnings when cells have formulas but are escaped', async function () { configGetStub.withArgs('csv', 'checkForFormulas').returns(true); configGetStub.withArgs('csv', 'escapeFormulaValues').returns(true); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { '=SUM(A1:A2)': 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { '=SUM(A1:A2)': 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -421,12 +414,14 @@ describe('CSV Execute Job', function () { it('returns no warnings when configured not to', async () => { configGetStub.withArgs('csv', 'checkForFormulas').returns(false); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: '=SUM(A1:A2)', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: '=SUM(A1:A2)', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -448,12 +443,14 @@ describe('CSV Execute Job', function () { describe('Byte order mark encoding', () => { it('encodes CSVs with BOM', async () => { configGetStub.withArgs('csv', 'useByteOrderMarkEncoding').returns(true); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: 'one', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'one', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -469,12 +466,14 @@ describe('CSV Execute Job', function () { it('encodes CSVs without BOM', async () => { configGetStub.withArgs('csv', 'useByteOrderMarkEncoding').returns(false); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: 'one', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'one', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -492,12 +491,14 @@ describe('CSV Execute Job', function () { describe('Escaping cells with formulas', () => { it('escapes values with formulas', async () => { configGetStub.withArgs('csv', 'escapeFormulaValues').returns(true); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: `=cmd|' /C calc'!A0`, two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: `=cmd|' /C calc'!A0`, two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -513,12 +514,14 @@ describe('CSV Execute Job', function () { it('does not escapes values with formulas', async () => { configGetStub.withArgs('csv', 'escapeFormulaValues').returns(false); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: `=cmd|' /C calc'!A0`, two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: `=cmd|' /C calc'!A0`, two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -535,7 +538,7 @@ describe('CSV Execute Job', function () { describe('Elasticsearch call errors', function () { it('should reject Promise if search call errors out', async function () { - callAsCurrentUserStub.rejects(new Error()); + mockEsClient.search.mockRejectedValueOnce(new Error()); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ headers: encryptedHeaders, @@ -548,13 +551,15 @@ describe('CSV Execute Job', function () { }); it('should reject Promise if scroll call errors out', async function () { - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); - callAsCurrentUserStub.onSecondCall().rejects(new Error()); + } as any); + mockEsClient.scroll.mockRejectedValueOnce(new Error()); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ headers: encryptedHeaders, @@ -569,12 +574,14 @@ describe('CSV Execute Job', function () { describe('invalid responses', function () { it('should reject Promise if search returns hits but no _scroll_id', async function () { - callAsCurrentUserStub.resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: undefined, }, - _scroll_id: undefined, - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -588,12 +595,14 @@ describe('CSV Execute Job', function () { }); it('should reject Promise if search returns no hits and no _scroll_id', async function () { - callAsCurrentUserStub.resolves({ - hits: { - hits: [], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [], + }, + _scroll_id: undefined, }, - _scroll_id: undefined, - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -607,19 +616,23 @@ describe('CSV Execute Job', function () { }); it('should reject Promise if scroll returns hits but no _scroll_id', async function () { - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); - callAsCurrentUserStub.onSecondCall().resolves({ - hits: { - hits: [{}], + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: undefined, }, - _scroll_id: undefined, - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -633,19 +646,23 @@ describe('CSV Execute Job', function () { }); it('should reject Promise if scroll returns no hits and no _scroll_id', async function () { - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); - callAsCurrentUserStub.onSecondCall().resolves({ - hits: { - hits: [], + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + hits: { + hits: [], + }, + _scroll_id: undefined, }, - _scroll_id: undefined, - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -663,21 +680,20 @@ describe('CSV Execute Job', function () { const scrollId = getRandomScrollId(); beforeEach(function () { - // We have to "re-stub" the callAsCurrentUser stub here so that we can use the fakeFunction - // that delays the Promise resolution so we have a chance to call cancellationToken.cancel(). - // Otherwise, we get into an endless loop, and don't have a chance to call cancel - callAsCurrentUserStub.restore(); - callAsCurrentUserStub = sinon - .stub(clusterStub, 'callAsCurrentUser') - .callsFake(async function () { - await delay(1); - return { + const searchStub = async () => { + await delay(1); + return { + body: { hits: { hits: [{}], }, _scroll_id: scrollId, - }; - }); + }, + }; + }; + + mockEsClient.search.mockImplementation(searchStub as typeof mockEsClient.search); + mockEsClient.scroll.mockImplementation(searchStub as typeof mockEsClient.scroll); }); it('should stop calling Elasticsearch when cancellationToken.cancel is called', async function () { @@ -693,10 +709,15 @@ describe('CSV Execute Job', function () { ); await delay(250); - const callCount = callAsCurrentUserStub.callCount; + + expect(mockEsClient.search).toHaveBeenCalled(); + expect(mockEsClient.scroll).toHaveBeenCalled(); + expect(mockEsClient.clearScroll).not.toHaveBeenCalled(); + cancellationToken.cancel(); await delay(250); - expect(callAsCurrentUserStub.callCount).toBe(callCount + 1); // last call is to clear the scroll + + expect(mockEsClient.clearScroll).toHaveBeenCalled(); }); it(`shouldn't call clearScroll if it never got a scrollId`, async function () { @@ -712,9 +733,7 @@ describe('CSV Execute Job', function () { ); cancellationToken.cancel(); - for (let i = 0; i < callAsCurrentUserStub.callCount; ++i) { - expect(callAsCurrentUserStub.getCall(i).args[1]).not.toBe('clearScroll'); // dead code? - } + expect(mockEsClient.clearScroll).not.toHaveBeenCalled(); }); it('should call clearScroll if it got a scrollId', async function () { @@ -732,9 +751,11 @@ describe('CSV Execute Job', function () { cancellationToken.cancel(); await delay(100); - const lastCall = callAsCurrentUserStub.getCall(callAsCurrentUserStub.callCount - 1); - expect(lastCall.args[0]).toBe('clearScroll'); - expect(lastCall.args[1].scrollId).toEqual([scrollId]); + expect(mockEsClient.clearScroll).toHaveBeenCalledWith( + expect.objectContaining({ + scroll_id: scrollId, + }) + ); }); }); @@ -788,12 +809,14 @@ describe('CSV Execute Job', function () { it('should write column headers to output, when there are results', async function () { const runTask = runTaskFnFactory(mockReportingCore, mockLogger); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{ one: '1', two: '2' }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ one: '1', two: '2' }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const jobParams = getBasePayload({ headers: encryptedHeaders, @@ -809,12 +832,14 @@ describe('CSV Execute Job', function () { it('should use comma separated values of non-nested fields from _source', async function () { const runTask = runTaskFnFactory(mockReportingCore, mockLogger); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{ _source: { one: 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const jobParams = getBasePayload({ headers: encryptedHeaders, @@ -831,18 +856,22 @@ describe('CSV Execute Job', function () { it('should concatenate the hits from multiple responses', async function () { const runTask = runTaskFnFactory(mockReportingCore, mockLogger); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{ _source: { one: 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); - callAsCurrentUserStub.onSecondCall().resolves({ - hits: { - hits: [{ _source: { one: 'baz', two: 'qux' } }], + } as any); + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'baz', two: 'qux' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const jobParams = getBasePayload({ headers: encryptedHeaders, @@ -860,12 +889,14 @@ describe('CSV Execute Job', function () { it('should use field formatters to format fields', async function () { const runTask = runTaskFnFactory(mockReportingCore, mockLogger); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{ _source: { one: 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const jobParams = getBasePayload({ headers: encryptedHeaders, @@ -962,12 +993,14 @@ describe('CSV Execute Job', function () { beforeEach(async function () { configGetStub.withArgs('csv', 'maxSizeBytes').returns(9); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -1002,12 +1035,14 @@ describe('CSV Execute Job', function () { Promise.resolve((mockUiSettingsClient as unknown) as IUiSettingsClient); configGetStub.withArgs('csv', 'maxSizeBytes').returns(18); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{ _source: { one: 'foo', two: 'bar' } }], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{ _source: { one: 'foo', two: 'bar' } }], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -1039,12 +1074,14 @@ describe('CSV Execute Job', function () { const scrollDuration = 'test'; configGetStub.withArgs('csv', 'scroll').returns({ duration: scrollDuration }); - callAsCurrentUserStub.onFirstCall().returns({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -1056,21 +1093,23 @@ describe('CSV Execute Job', function () { await runTask('job123', jobParams, cancellationToken); - const searchCall = callAsCurrentUserStub.firstCall; - expect(searchCall.args[0]).toBe('search'); - expect(searchCall.args[1].scroll).toBe(scrollDuration); + expect(mockEsClient.search).toHaveBeenCalledWith( + expect.objectContaining({ scroll: scrollDuration }) + ); }); it('passes scroll size to initial search call', async function () { const scrollSize = 100; configGetStub.withArgs('csv', 'scroll').returns({ size: scrollSize }); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -1082,21 +1121,23 @@ describe('CSV Execute Job', function () { await runTask('job123', jobParams, cancellationToken); - const searchCall = callAsCurrentUserStub.firstCall; - expect(searchCall.args[0]).toBe('search'); - expect(searchCall.args[1].size).toBe(scrollSize); + expect(mockEsClient.search).toHaveBeenCalledWith( + expect.objectContaining({ size: scrollSize }) + ); }); it('passes scroll duration to subsequent scroll call', async function () { const scrollDuration = 'test'; configGetStub.withArgs('csv', 'scroll').returns({ duration: scrollDuration }); - callAsCurrentUserStub.onFirstCall().resolves({ - hits: { - hits: [{}], + mockEsClient.search.mockResolvedValueOnce({ + body: { + hits: { + hits: [{}], + }, + _scroll_id: 'scrollId', }, - _scroll_id: 'scrollId', - }); + } as any); const runTask = runTaskFnFactory(mockReportingCore, mockLogger); const jobParams = getBasePayload({ @@ -1108,9 +1149,9 @@ describe('CSV Execute Job', function () { await runTask('job123', jobParams, cancellationToken); - const scrollCall = callAsCurrentUserStub.secondCall; - expect(scrollCall.args[0]).toBe('scroll'); - expect(scrollCall.args[1].scroll).toBe(scrollDuration); + expect(mockEsClient.scroll).toHaveBeenCalledWith( + expect.objectContaining({ scroll: scrollDuration }) + ); }); }); }); diff --git a/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts b/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts index 0e13a91649406..57559d136ff3e 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/execute_job.ts @@ -17,7 +17,7 @@ export const runTaskFnFactory: RunTaskFnFactory< const config = reporting.getConfig(); return async function runTask(jobId, job, cancellationToken) { - const elasticsearch = reporting.getElasticsearchService(); + const elasticsearch = await reporting.getEsClient(); const logger = parentLogger.clone([jobId]); const generateCsv = createGenerateCsv(logger); @@ -25,16 +25,13 @@ export const runTaskFnFactory: RunTaskFnFactory< const headers = await decryptJobHeaders(encryptionKey, job.headers, logger); const fakeRequest = reporting.getFakeRequest({ headers }, job.spaceId, logger); const uiSettingsClient = await reporting.getUiSettingsClient(fakeRequest, logger); - - const { callAsCurrentUser } = elasticsearch.legacy.client.asScoped(fakeRequest); - const callEndpoint = (endpoint: string, clientParams = {}, options = {}) => - callAsCurrentUser(endpoint, clientParams, options); + const { asCurrentUser: elasticsearchClient } = elasticsearch.asScoped(fakeRequest); const { content, maxSizeReached, size, csvContainsFormulas, warnings } = await generateCsv( job, config, uiSettingsClient, - callEndpoint, + elasticsearchClient, cancellationToken ); diff --git a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.test.ts b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.test.ts index 4baa81e8be6c9..6b1b7fc98a4b8 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.test.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.test.ts @@ -7,16 +7,18 @@ import expect from '@kbn/expect'; import sinon from 'sinon'; +import { elasticsearchServiceMock } from 'src/core/server/mocks'; import { CancellationToken } from '../../../../common'; import { createMockLevelLogger } from '../../../test_helpers/create_mock_levellogger'; import { ScrollConfig } from '../../../types'; import { createHitIterator } from './hit_iterator'; +const { asInternalUser: mockEsClient } = elasticsearchServiceMock.createClusterClient(); const mockLogger = createMockLevelLogger(); const debugLogStub = sinon.stub(mockLogger, 'debug'); const warnLogStub = sinon.stub(mockLogger, 'warn'); const errorLogStub = sinon.stub(mockLogger, 'error'); -const mockCallEndpoint = sinon.stub(); + const mockSearchRequest = {}; const mockConfig: ScrollConfig = { duration: '2s', size: 123 }; let realCancellationToken = new CancellationToken(); @@ -27,10 +29,30 @@ describe('hitIterator', function () { debugLogStub.resetHistory(); warnLogStub.resetHistory(); errorLogStub.resetHistory(); - mockCallEndpoint.resetHistory(); - mockCallEndpoint.resetBehavior(); - mockCallEndpoint.resolves({ _scroll_id: '123blah', hits: { hits: ['you found me'] } }); - mockCallEndpoint.onCall(11).resolves({ _scroll_id: '123blah', hits: {} }); + + mockEsClient.search.mockClear(); + mockEsClient.search.mockResolvedValue({ + body: { + _scroll_id: '123blah', + hits: { hits: ['you found me'] }, + }, + } as any); + + mockEsClient.scroll.mockClear(); + for (let i = 0; i < 10; i++) { + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + _scroll_id: '123blah', + hits: { hits: ['you found me'] }, + }, + } as any); + } + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + _scroll_id: '123blah', + hits: {}, + }, + } as any); isCancelledStub = sinon.stub(realCancellationToken, 'isCancelled'); isCancelledStub.returns(false); @@ -45,7 +67,7 @@ describe('hitIterator', function () { const hitIterator = createHitIterator(mockLogger); const iterator = hitIterator( mockConfig, - mockCallEndpoint, + mockEsClient, mockSearchRequest, realCancellationToken ); @@ -58,7 +80,7 @@ describe('hitIterator', function () { expect(hit).to.be('you found me'); } - expect(mockCallEndpoint.callCount).to.be(13); + expect(mockEsClient.scroll.mock.calls.length).to.be(11); expect(debugLogStub.callCount).to.be(13); expect(warnLogStub.callCount).to.be(0); expect(errorLogStub.callCount).to.be(0); @@ -73,7 +95,7 @@ describe('hitIterator', function () { const hitIterator = createHitIterator(mockLogger); const iterator = hitIterator( mockConfig, - mockCallEndpoint, + mockEsClient, mockSearchRequest, realCancellationToken ); @@ -86,7 +108,7 @@ describe('hitIterator', function () { expect(hit).to.be('you found me'); } - expect(mockCallEndpoint.callCount).to.be(3); + expect(mockEsClient.scroll.mock.calls.length).to.be(1); expect(debugLogStub.callCount).to.be(3); expect(warnLogStub.callCount).to.be(1); expect(errorLogStub.callCount).to.be(0); @@ -98,13 +120,20 @@ describe('hitIterator', function () { it('handles time out', async () => { // Setup - mockCallEndpoint.onCall(2).resolves({ status: 404 }); + mockEsClient.scroll.mockReset(); + mockEsClient.scroll.mockResolvedValueOnce({ + body: { + _scroll_id: '123blah', + hits: { hits: ['you found me'] }, + }, + } as any); + mockEsClient.scroll.mockResolvedValueOnce({ body: { status: 404 } } as any); // Begin const hitIterator = createHitIterator(mockLogger); const iterator = hitIterator( mockConfig, - mockCallEndpoint, + mockEsClient, mockSearchRequest, realCancellationToken ); @@ -125,7 +154,7 @@ describe('hitIterator', function () { errorThrown = true; } - expect(mockCallEndpoint.callCount).to.be(4); + expect(mockEsClient.scroll.mock.calls.length).to.be(2); expect(debugLogStub.callCount).to.be(4); expect(warnLogStub.callCount).to.be(0); expect(errorLogStub.callCount).to.be(1); @@ -134,13 +163,13 @@ describe('hitIterator', function () { it('handles scroll id could not be cleared', async () => { // Setup - mockCallEndpoint.withArgs('clearScroll').rejects({ status: 404 }); + mockEsClient.clearScroll.mockRejectedValueOnce({ status: 404 }); // Begin const hitIterator = createHitIterator(mockLogger); const iterator = hitIterator( mockConfig, - mockCallEndpoint, + mockEsClient, mockSearchRequest, realCancellationToken ); @@ -153,7 +182,7 @@ describe('hitIterator', function () { expect(hit).to.be('you found me'); } - expect(mockCallEndpoint.callCount).to.be(13); + expect(mockEsClient.scroll.mock.calls.length).to.be(11); expect(warnLogStub.callCount).to.be(1); expect(errorLogStub.callCount).to.be(1); }); diff --git a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.ts b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.ts index b00622399d691..72935e64dd6b5 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/hit_iterator.ts @@ -5,54 +5,55 @@ * 2.0. */ +import { UnwrapPromise } from '@kbn/utility-types'; import { i18n } from '@kbn/i18n'; -import { SearchParams, SearchResponse } from 'elasticsearch'; +import { ElasticsearchClient } from 'src/core/server'; import { CancellationToken } from '../../../../common'; import { LevelLogger } from '../../../lib'; import { ScrollConfig } from '../../../types'; -export type EndpointCaller = (method: string, params: object) => Promise>; +type SearchResponse = UnwrapPromise>; +type SearchRequest = Required>[0]; -function parseResponse(request: SearchResponse) { - const response = request; - if (!response || !response._scroll_id) { +function parseResponse(response: SearchResponse) { + if (!response?.body._scroll_id) { throw new Error( i18n.translate('xpack.reporting.exportTypes.csv.hitIterator.expectedScrollIdErrorMessage', { defaultMessage: 'Expected {scrollId} in the following Elasticsearch response: {response}', - values: { response: JSON.stringify(response), scrollId: '_scroll_id' }, + values: { response: JSON.stringify(response?.body), scrollId: '_scroll_id' }, }) ); } - if (!response.hits) { + if (!response?.body.hits) { throw new Error( i18n.translate('xpack.reporting.exportTypes.csv.hitIterator.expectedHitsErrorMessage', { defaultMessage: 'Expected {hits} in the following Elasticsearch response: {response}', - values: { response: JSON.stringify(response), hits: 'hits' }, + values: { response: JSON.stringify(response?.body), hits: 'hits' }, }) ); } return { - scrollId: response._scroll_id, - hits: response.hits.hits, + scrollId: response.body._scroll_id, + hits: response.body.hits.hits, }; } export function createHitIterator(logger: LevelLogger) { return async function* hitIterator( scrollSettings: ScrollConfig, - callEndpoint: EndpointCaller, - searchRequest: SearchParams, + elasticsearchClient: ElasticsearchClient, + searchRequest: SearchRequest, cancellationToken: CancellationToken ) { logger.debug('executing search request'); - async function search(index: string | boolean | string[] | undefined, body: object) { + async function search(index: SearchRequest['index'], body: SearchRequest['body']) { return parseResponse( - await callEndpoint('search', { - ignore_unavailable: true, // ignores if the index pattern contains any aliases that point to closed indices + await elasticsearchClient.search({ index, body, + ignore_unavailable: true, // ignores if the index pattern contains any aliases that point to closed indices scroll: scrollSettings.duration, size: scrollSettings.size, }) @@ -62,8 +63,8 @@ export function createHitIterator(logger: LevelLogger) { async function scroll(scrollId: string | undefined) { logger.debug('executing scroll request'); return parseResponse( - await callEndpoint('scroll', { - scrollId, + await elasticsearchClient.scroll({ + scroll_id: scrollId, scroll: scrollSettings.duration, }) ); @@ -72,8 +73,8 @@ export function createHitIterator(logger: LevelLogger) { async function clearScroll(scrollId: string | undefined) { logger.debug('executing clearScroll request'); try { - await callEndpoint('clearScroll', { - scrollId: [scrollId], + await elasticsearchClient.clearScroll({ + scroll_id: scrollId, }); } catch (err) { // Do not throw the error, as the job can still be completed successfully diff --git a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts index 629a81df350be..e5ed04f4cab66 100644 --- a/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts +++ b/x-pack/plugins/reporting/server/export_types/csv/generate_csv/index.ts @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import { IUiSettingsClient } from 'src/core/server'; +import { ElasticsearchClient, IUiSettingsClient } from 'src/core/server'; import { ReportingConfig } from '../../../'; import { CancellationToken } from '../../../../../../plugins/reporting/common'; import { CSV_BOM_CHARS } from '../../../../common/constants'; @@ -24,7 +24,7 @@ import { fieldFormatMapFactory } from './field_format_map'; import { createFlattenHit } from './flatten_hit'; import { createFormatCsvValues } from './format_csv_values'; import { getUiSettings } from './get_ui_settings'; -import { createHitIterator, EndpointCaller } from './hit_iterator'; +import { createHitIterator } from './hit_iterator'; interface SearchRequest { index: string; @@ -56,7 +56,7 @@ export function createGenerateCsv(logger: LevelLogger) { job: GenerateCsvParams, config: ReportingConfig, uiSettingsClient: IUiSettingsClient, - callEndpoint: EndpointCaller, + elasticsearchClient: ElasticsearchClient, cancellationToken: CancellationToken ): Promise { const settings = await getUiSettings(job.browserTimezone, uiSettingsClient, config, logger); @@ -79,7 +79,7 @@ export function createGenerateCsv(logger: LevelLogger) { const iterator = hitIterator( settings.scroll, - callEndpoint, + elasticsearchClient, job.searchRequest, cancellationToken ); diff --git a/x-pack/plugins/reporting/server/export_types/png/execute_job/index.test.ts b/x-pack/plugins/reporting/server/export_types/png/execute_job/index.test.ts index 3a5298981738d..34fe5360522b1 100644 --- a/x-pack/plugins/reporting/server/export_types/png/execute_job/index.test.ts +++ b/x-pack/plugins/reporting/server/export_types/png/execute_job/index.test.ts @@ -59,16 +59,6 @@ beforeEach(async () => { mockReporting = await createMockReportingCore(mockReportingConfig); - const mockElasticsearch = { - legacy: { - client: { - asScoped: () => ({ callAsCurrentUser: jest.fn() }), - }, - }, - }; - const mockGetElasticsearch = jest.fn(); - mockGetElasticsearch.mockImplementation(() => Promise.resolve(mockElasticsearch)); - mockReporting.getElasticsearchService = mockGetElasticsearch; // @ts-ignore over-riding config method mockReporting.config = mockReportingConfig; diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.test.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.test.ts index 0c6a55fb895b5..61eab18987f7c 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.test.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.test.ts @@ -57,16 +57,6 @@ beforeEach(async () => { mockReporting = await createMockReportingCore(mockReportingConfig); - const mockElasticsearch = { - legacy: { - client: { - asScoped: () => ({ callAsCurrentUser: jest.fn() }), - }, - }, - }; - const mockGetElasticsearch = jest.fn(); - mockGetElasticsearch.mockImplementation(() => Promise.resolve(mockElasticsearch)); - mockReporting.getElasticsearchService = mockGetElasticsearch; // @ts-ignore over-riding config mockReporting.config = mockReportingConfig; diff --git a/x-pack/plugins/reporting/server/lib/store/report.ts b/x-pack/plugins/reporting/server/lib/store/report.ts index 817028cab1a39..9b98650e1d984 100644 --- a/x-pack/plugins/reporting/server/lib/store/report.ts +++ b/x-pack/plugins/reporting/server/lib/store/report.ts @@ -25,8 +25,8 @@ const puid = new Puid(); export class Report implements Partial { public _index?: string; public _id: string; - public _primary_term?: unknown; // set by ES - public _seq_no: unknown; // set by ES + public _primary_term?: number; // set by ES + public _seq_no?: number; // set by ES public readonly kibana_name: ReportSource['kibana_name']; public readonly kibana_id: ReportSource['kibana_id']; diff --git a/x-pack/plugins/reporting/server/lib/store/store.test.ts b/x-pack/plugins/reporting/server/lib/store/store.test.ts index 01d91f8bc2ac2..2af0fe7830eea 100644 --- a/x-pack/plugins/reporting/server/lib/store/store.test.ts +++ b/x-pack/plugins/reporting/server/lib/store/store.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import sinon from 'sinon'; -import { ElasticsearchServiceSetup } from 'src/core/server'; +import type { DeeplyMockedKeys } from '@kbn/utility-types/jest'; +import { ElasticsearchClient } from 'src/core/server'; import { ReportingConfig, ReportingCore } from '../../'; import { createMockConfig, @@ -21,9 +21,7 @@ describe('ReportingStore', () => { const mockLogger = createMockLevelLogger(); let mockConfig: ReportingConfig; let mockCore: ReportingCore; - - const callClusterStub = sinon.stub(); - const mockElasticsearch = { legacy: { client: { callAsInternalUser: callClusterStub } } }; + let mockEsClient: DeeplyMockedKeys; beforeEach(async () => { const reportingConfig = { @@ -33,17 +31,14 @@ describe('ReportingStore', () => { const mockSchema = createMockConfigSchema(reportingConfig); mockConfig = createMockConfig(mockSchema); mockCore = await createMockReportingCore(mockConfig); + mockEsClient = (await mockCore.getEsClient()).asInternalUser as typeof mockEsClient; - callClusterStub.reset(); - callClusterStub.withArgs('indices.exists').resolves({}); - callClusterStub.withArgs('indices.create').resolves({}); - callClusterStub.withArgs('index').resolves({ _id: 'stub-id', _index: 'stub-index' }); - callClusterStub.withArgs('indices.refresh').resolves({}); - callClusterStub.withArgs('update').resolves({}); - callClusterStub.withArgs('get').resolves({}); - - mockCore.getElasticsearchService = () => - (mockElasticsearch as unknown) as ElasticsearchServiceSetup; + mockEsClient.indices.create.mockResolvedValue({} as any); + mockEsClient.indices.exists.mockResolvedValue({} as any); + mockEsClient.indices.refresh.mockResolvedValue({} as any); + mockEsClient.get.mockResolvedValue({} as any); + mockEsClient.index.mockResolvedValue({ body: { _id: 'stub-id', _index: 'stub-index' } } as any); + mockEsClient.update.mockResolvedValue({} as any); }); describe('addReport', () => { @@ -88,14 +83,14 @@ describe('ReportingStore', () => { meta: {}, } as any); expect(store.addReport(mockReport)).rejects.toMatchInlineSnapshot( - `[TypeError: this.client.callAsInternalUser is not a function]` + `[Error: Report object from ES has missing fields!]` ); }); it('handles error creating the index', async () => { // setup - callClusterStub.withArgs('indices.exists').resolves(false); - callClusterStub.withArgs('indices.create').rejects(new Error('horrible error')); + mockEsClient.indices.exists.mockResolvedValue({ body: false } as any); + mockEsClient.indices.create.mockRejectedValue(new Error('horrible error')); const store = new ReportingStore(mockCore, mockLogger); const mockReport = new Report({ @@ -117,8 +112,8 @@ describe('ReportingStore', () => { */ it('ignores index creation error if the index already exists and continues adding the report', async () => { // setup - callClusterStub.withArgs('indices.exists').resolves(false); - callClusterStub.withArgs('indices.create').rejects(new Error('devastating error')); + mockEsClient.indices.exists.mockResolvedValue({ body: false } as any); + mockEsClient.indices.create.mockRejectedValue(new Error('devastating error')); const store = new ReportingStore(mockCore, mockLogger); const mockReport = new Report({ @@ -134,10 +129,9 @@ describe('ReportingStore', () => { it('skips creating the index if already exists', async () => { // setup - callClusterStub.withArgs('indices.exists').resolves(false); - callClusterStub - .withArgs('indices.create') - .rejects(new Error('resource_already_exists_exception')); // will be triggered but ignored + mockEsClient.indices.exists.mockResolvedValue({ body: false } as any); + // will be triggered but ignored + mockEsClient.indices.create.mockRejectedValue(new Error('resource_already_exists_exception')); const store = new ReportingStore(mockCore, mockLogger); const mockReport = new Report({ @@ -159,10 +153,9 @@ describe('ReportingStore', () => { it('allows username string to be `false`', async () => { // setup - callClusterStub.withArgs('indices.exists').resolves(false); - callClusterStub - .withArgs('indices.create') - .rejects(new Error('resource_already_exists_exception')); // will be triggered but ignored + mockEsClient.indices.exists.mockResolvedValue({ body: false } as any); + // will be triggered but ignored + mockEsClient.indices.create.mockRejectedValue(new Error('resource_already_exists_exception')); const store = new ReportingStore(mockCore, mockLogger); const mockReport = new Report({ @@ -192,8 +185,8 @@ describe('ReportingStore', () => { const mockReport: ReportDocument = { _id: '1234-foo-78', _index: '.reporting-test-17409', - _primary_term: 'primary_term string', - _seq_no: 'seq_no string', + _primary_term: 1234, + _seq_no: 5678, _source: { kibana_name: 'test', kibana_id: 'test123', @@ -210,7 +203,7 @@ describe('ReportingStore', () => { output: null, }, }; - callClusterStub.withArgs('get').resolves(mockReport); + mockEsClient.get.mockResolvedValue({ body: mockReport } as any); const store = new ReportingStore(mockCore, mockLogger); const report = new Report({ ...mockReport, @@ -221,8 +214,8 @@ describe('ReportingStore', () => { Report { "_id": "1234-foo-78", "_index": ".reporting-test-17409", - "_primary_term": "primary_term string", - "_seq_no": "seq_no string", + "_primary_term": 1234, + "_seq_no": 5678, "attempts": 0, "browser_type": "browser type string", "completed_at": undefined, @@ -267,10 +260,9 @@ describe('ReportingStore', () => { await store.setReportClaimed(report, { testDoc: 'test' } as any); - const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); - expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + const [updateCall] = mockEsClient.update.mock.calls; + expect(updateCall).toMatchInlineSnapshot(` Array [ - "update", Object { "body": Object { "doc": Object { @@ -308,10 +300,9 @@ describe('ReportingStore', () => { await store.setReportFailed(report, { errors: 'yes' } as any); - const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); - expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + const [updateCall] = mockEsClient.update.mock.calls; + expect(updateCall).toMatchInlineSnapshot(` Array [ - "update", Object { "body": Object { "doc": Object { @@ -349,10 +340,9 @@ describe('ReportingStore', () => { await store.setReportCompleted(report, { certainly_completed: 'yes' } as any); - const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); - expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + const [updateCall] = mockEsClient.update.mock.calls; + expect(updateCall).toMatchInlineSnapshot(` Array [ - "update", Object { "body": Object { "doc": Object { @@ -395,10 +385,9 @@ describe('ReportingStore', () => { }, } as any); - const updateCall = callClusterStub.getCalls().find((call) => call.args[0] === 'update'); - expect(updateCall && updateCall.args).toMatchInlineSnapshot(` + const [updateCall] = mockEsClient.update.mock.calls; + expect(updateCall).toMatchInlineSnapshot(` Array [ - "update", Object { "body": Object { "doc": Object { diff --git a/x-pack/plugins/reporting/server/lib/store/store.ts b/x-pack/plugins/reporting/server/lib/store/store.ts index fdac471c26cb0..fc7bd9c23d769 100644 --- a/x-pack/plugins/reporting/server/lib/store/store.ts +++ b/x-pack/plugins/reporting/server/lib/store/store.ts @@ -5,8 +5,7 @@ * 2.0. */ -import { SearchParams } from 'elasticsearch'; -import { ElasticsearchServiceSetup } from 'src/core/server'; +import { ElasticsearchClient } from 'src/core/server'; import { LevelLogger, statuses } from '../'; import { ReportingCore } from '../../'; import { numberToDuration } from '../../../common/schema_utils'; @@ -14,7 +13,7 @@ import { JobStatus } from '../../../common/types'; import { ReportTaskParams } from '../tasks'; import { indexTimestamp } from './index_timestamp'; import { mapping } from './mapping'; -import { Report, ReportDocument } from './report'; +import { Report, ReportDocument, ReportSource } from './report'; /* * When searching for long-pending reports, we get a subset of fields @@ -45,59 +44,60 @@ export class ReportingStore { private readonly indexPrefix: string; // config setting of index prefix in system index name private readonly indexInterval: string; // config setting of index prefix: how often to poll for pending work private readonly queueTimeoutMins: number; // config setting of queue timeout, rounded up to nearest minute - private client: ElasticsearchServiceSetup['legacy']['client']; - private logger: LevelLogger; + private client?: ElasticsearchClient; - constructor(reporting: ReportingCore, logger: LevelLogger) { - const config = reporting.getConfig(); - const elasticsearch = reporting.getElasticsearchService(); + constructor(private reportingCore: ReportingCore, private logger: LevelLogger) { + const config = reportingCore.getConfig(); - this.client = elasticsearch.legacy.client; this.indexPrefix = config.get('index'); this.indexInterval = config.get('queue', 'indexInterval'); this.logger = logger.clone(['store']); this.queueTimeoutMins = Math.ceil(numberToDuration(config.get('queue', 'timeout')).asMinutes()); } + private async getClient() { + if (!this.client) { + ({ asInternalUser: this.client } = await this.reportingCore.getEsClient()); + } + + return this.client; + } + private async createIndex(indexName: string) { - return await this.client - .callAsInternalUser('indices.exists', { - index: indexName, - }) - .then((exists) => { - if (exists) { - return exists; - } - - const indexSettings = { - number_of_shards: 1, - auto_expand_replicas: '0-1', - }; - const body = { - settings: indexSettings, - mappings: { - properties: mapping, - }, - }; - - return this.client - .callAsInternalUser('indices.create', { - index: indexName, - body, - }) - .then(() => true) - .catch((err: Error) => { - const isIndexExistsError = err.message.match(/resource_already_exists_exception/); - if (isIndexExistsError) { - // Do not fail a job if the job runner hits the race condition. - this.logger.warn(`Automatic index creation failed: index already exists: ${err}`); - return; - } - - this.logger.error(err); - throw err; - }); - }); + const client = await this.getClient(); + const { body: exists } = await client.indices.exists({ index: indexName }); + + if (exists) { + return exists; + } + + const indexSettings = { + number_of_shards: 1, + auto_expand_replicas: '0-1', + }; + const body = { + settings: indexSettings, + mappings: { + properties: mapping, + }, + }; + + try { + await client.indices.create({ index: indexName, body }); + + return true; + } catch (error) { + const isIndexExistsError = error.message.match(/resource_already_exists_exception/); + if (isIndexExistsError) { + // Do not fail a job if the job runner hits the race condition. + this.logger.warn(`Automatic index creation failed: index already exists: ${error}`); + return; + } + + this.logger.error(error); + + throw error; + } } /* @@ -105,7 +105,7 @@ export class ReportingStore { */ private async indexReport(report: Report) { const doc = { - index: report._index, + index: report._index!, id: report._id, body: { ...report.toEsDocsJSON()._source, @@ -114,14 +114,20 @@ export class ReportingStore { status: statuses.JOB_STATUS_PENDING, }, }; - return await this.client.callAsInternalUser('index', doc); + + const client = await this.getClient(); + const { body } = await client.index(doc); + + return body; } /* * Called from addReport, which handles any errors */ private async refreshIndex(index: string) { - return await this.client.callAsInternalUser('indices.refresh', { index }); + const client = await this.getClient(); + + return client.indices.refresh({ index }); } public async addReport(report: Report): Promise { @@ -156,7 +162,8 @@ export class ReportingStore { } try { - const document = await this.client.callAsInternalUser('get', { + const client = await this.getClient(); + const { body: document } = await client.get({ index: taskJson.index, id: taskJson.id, }); @@ -166,17 +173,17 @@ export class ReportingStore { _index: document._index, _seq_no: document._seq_no, _primary_term: document._primary_term, - jobtype: document._source.jobtype, - attempts: document._source.attempts, - browser_type: document._source.browser_type, - created_at: document._source.created_at, - created_by: document._source.created_by, - max_attempts: document._source.max_attempts, - meta: document._source.meta, - payload: document._source.payload, - process_expiration: document._source.process_expiration, - status: document._source.status, - timeout: document._source.timeout, + jobtype: document._source?.jobtype, + attempts: document._source?.attempts, + browser_type: document._source?.browser_type, + created_at: document._source?.created_at, + created_by: document._source?.created_by, + max_attempts: document._source?.max_attempts, + meta: document._source?.meta, + payload: document._source?.payload, + process_expiration: document._source?.process_expiration, + status: document._source?.status, + timeout: document._source?.timeout, }); } catch (err) { this.logger.error('Error in finding a report! ' + JSON.stringify({ report: taskJson })); @@ -191,14 +198,17 @@ export class ReportingStore { try { checkReportIsEditable(report); - return await this.client.callAsInternalUser('update', { + const client = await this.getClient(); + const { body } = await client.update({ id: report._id, - index: report._index, + index: report._index!, if_seq_no: report._seq_no, if_primary_term: report._primary_term, refresh: true, body: { doc }, }); + + return (body as unknown) as ReportDocument; } catch (err) { this.logger.error('Error in setting report pending status!'); this.logger.error(err); @@ -215,14 +225,17 @@ export class ReportingStore { try { checkReportIsEditable(report); - return await this.client.callAsInternalUser('update', { + const client = await this.getClient(); + const { body } = await client.update({ id: report._id, - index: report._index, + index: report._index!, if_seq_no: report._seq_no, if_primary_term: report._primary_term, refresh: true, body: { doc }, }); + + return (body as unknown) as ReportDocument; } catch (err) { this.logger.error('Error in setting report processing status!'); this.logger.error(err); @@ -239,14 +252,17 @@ export class ReportingStore { try { checkReportIsEditable(report); - return await this.client.callAsInternalUser('update', { + const client = await this.getClient(); + const { body } = await client.update({ id: report._id, - index: report._index, + index: report._index!, if_seq_no: report._seq_no, if_primary_term: report._primary_term, refresh: true, body: { doc }, }); + + return (body as unknown) as ReportDocument; } catch (err) { this.logger.error('Error in setting report failed status!'); this.logger.error(err); @@ -267,14 +283,17 @@ export class ReportingStore { }; checkReportIsEditable(report); - return await this.client.callAsInternalUser('update', { + const client = await this.getClient(); + const { body } = await client.update({ id: report._id, - index: report._index, + index: report._index!, if_seq_no: report._seq_no, if_primary_term: report._primary_term, refresh: true, body: { doc }, }); + + return (body as unknown) as ReportDocument; } catch (err) { this.logger.error('Error in setting report complete status!'); this.logger.error(err); @@ -286,16 +305,17 @@ export class ReportingStore { try { checkReportIsEditable(report); - const updateParams = { + const client = await this.getClient(); + const { body } = await client.update({ id: report._id, - index: report._index, + index: report._index!, if_seq_no: report._seq_no, if_primary_term: report._primary_term, refresh: true, body: { doc: { process_expiration: null } }, - }; + }); - return await this.client.callAsInternalUser('update', updateParams); + return (body as unknown) as ReportDocument; } catch (err) { this.logger.error('Error in clearing expiration!'); this.logger.error(err); @@ -312,12 +332,11 @@ export class ReportingStore { * Pending reports are not included in this search: they may be scheduled in TM just not run yet. * TODO Should we get a list of the reports that are pending and scheduled in TM so we can exclude them from this query? */ - public async findZombieReportDocuments( - logger = this.logger - ): Promise { - const searchParams: SearchParams = { + public async findZombieReportDocuments(): Promise { + const client = await this.getClient(); + const { body } = await client.search({ index: this.indexPrefix + '-*', - filterPath: 'hits.hits', + filter_path: 'hits.hits', body: { sort: { created_at: { order: 'desc' } }, query: { @@ -335,13 +354,8 @@ export class ReportingStore { }, }, }, - }; - - const result = await this.client.callAsInternalUser( - 'search', - searchParams - ); + }); - return result.hits?.hits; + return body.hits?.hits as ReportRecordTimeout[]; } } diff --git a/x-pack/plugins/reporting/server/plugin.ts b/x-pack/plugins/reporting/server/plugin.ts index 3dc7e7ef3df92..75411b30ec0bd 100644 --- a/x-pack/plugins/reporting/server/plugin.ts +++ b/x-pack/plugins/reporting/server/plugin.ts @@ -47,7 +47,7 @@ export class ReportingPlugin registerUiSettings(core); - const { elasticsearch, http } = core; + const { http } = core; const { features, licensing, security, spaces, taskManager } = plugins; const { initializerContext: initContext, reportingCore } = this; @@ -56,7 +56,6 @@ export class ReportingPlugin reportingCore.pluginSetup({ features, - elasticsearch, licensing, basePath, router, diff --git a/x-pack/plugins/reporting/server/routes/diagnostic/config.test.ts b/x-pack/plugins/reporting/server/routes/diagnostic/config.test.ts index f35d8f5910da0..952a33ff64190 100644 --- a/x-pack/plugins/reporting/server/routes/diagnostic/config.test.ts +++ b/x-pack/plugins/reporting/server/routes/diagnostic/config.test.ts @@ -6,6 +6,8 @@ */ import { UnwrapPromise } from '@kbn/utility-types'; +import type { DeeplyMockedKeys } from '@kbn/utility-types/jest'; +import { ElasticsearchClient } from 'kibana/server'; import { setupServer } from 'src/core/server/test_utils'; import supertest from 'supertest'; import { ReportingCore } from '../..'; @@ -26,6 +28,7 @@ describe('POST /diagnose/config', () => { let core: ReportingCore; let mockSetupDeps: any; let config: any; + let mockEsClient: DeeplyMockedKeys; const mockLogger = createMockLevelLogger(); @@ -38,9 +41,6 @@ describe('POST /diagnose/config', () => { ); mockSetupDeps = createMockPluginSetup({ - elasticsearch: { - legacy: { client: { callAsInternalUser: jest.fn() } }, - }, router: httpSetup.createRouter(''), } as unknown) as any; @@ -58,6 +58,7 @@ describe('POST /diagnose/config', () => { }; core = await createMockReportingCore(config, mockSetupDeps); + mockEsClient = (await core.getEsClient()).asInternalUser as typeof mockEsClient; }); afterEach(async () => { @@ -65,15 +66,15 @@ describe('POST /diagnose/config', () => { }); it('returns a 200 by default when configured properly', async () => { - mockSetupDeps.elasticsearch.legacy.client.callAsInternalUser.mockImplementation(() => - Promise.resolve({ + mockEsClient.cluster.getSettings.mockResolvedValueOnce({ + body: { defaults: { http: { max_content_length: '100mb', }, }, - }) - ); + }, + } as any); registerDiagnoseConfig(core, mockLogger); await server.start(); @@ -94,15 +95,15 @@ describe('POST /diagnose/config', () => { it('returns a 200 with help text when not configured properly', async () => { config.get.mockImplementation(() => 10485760); - mockSetupDeps.elasticsearch.legacy.client.callAsInternalUser.mockImplementation(() => - Promise.resolve({ + mockEsClient.cluster.getSettings.mockResolvedValueOnce({ + body: { defaults: { http: { max_content_length: '5mb', }, }, - }) - ); + }, + } as any); registerDiagnoseConfig(core, mockLogger); await server.start(); diff --git a/x-pack/plugins/reporting/server/routes/diagnostic/config.ts b/x-pack/plugins/reporting/server/routes/diagnostic/config.ts index e3a01c464c36d..109849aa302f2 100644 --- a/x-pack/plugins/reporting/server/routes/diagnostic/config.ts +++ b/x-pack/plugins/reporting/server/routes/diagnostic/config.ts @@ -28,7 +28,7 @@ const numberToByteSizeValue = (value: number | ByteSizeValue) => { export const registerDiagnoseConfig = (reporting: ReportingCore, logger: Logger) => { const setupDeps = reporting.getPluginSetupDeps(); const userHandler = authorizedUserPreRoutingFactory(reporting); - const { router, elasticsearch } = setupDeps; + const { router } = setupDeps; router.post( { @@ -37,13 +37,13 @@ export const registerDiagnoseConfig = (reporting: ReportingCore, logger: Logger) }, userHandler(async (user, context, req, res) => { const warnings = []; - const { callAsInternalUser } = elasticsearch.legacy.client; + const { asInternalUser: elasticsearchClient } = await reporting.getEsClient(); const config = reporting.getConfig(); - const elasticClusterSettingsResponse = await callAsInternalUser('cluster.getSettings', { - includeDefaults: true, + const { body: clusterSettings } = await elasticsearchClient.cluster.getSettings({ + include_defaults: true, }); - const { persistent, transient, defaults: defaultSettings } = elasticClusterSettingsResponse; + const { persistent, transient, defaults: defaultSettings } = clusterSettings; const elasticClusterSettings = defaults({}, persistent, transient, defaultSettings); const elasticSearchMaxContent = get( diff --git a/x-pack/plugins/reporting/server/routes/generation.test.ts b/x-pack/plugins/reporting/server/routes/generation.test.ts index f6966a3b28ea9..0ce977e0a5431 100644 --- a/x-pack/plugins/reporting/server/routes/generation.test.ts +++ b/x-pack/plugins/reporting/server/routes/generation.test.ts @@ -6,8 +6,9 @@ */ import { UnwrapPromise } from '@kbn/utility-types'; +import type { DeeplyMockedKeys } from '@kbn/utility-types/jest'; import { of } from 'rxjs'; -import sinon from 'sinon'; +import { ElasticsearchClient } from 'kibana/server'; import { setupServer } from 'src/core/server/test_utils'; import supertest from 'supertest'; import { ReportingCore } from '..'; @@ -24,8 +25,8 @@ describe('POST /api/reporting/generate', () => { let server: SetupServerReturn['server']; let httpSetup: SetupServerReturn['httpSetup']; let mockExportTypesRegistry: ExportTypesRegistry; - let callClusterStub: any; let core: ReportingCore; + let mockEsClient: DeeplyMockedKeys; const config = { get: jest.fn().mockImplementation((...args) => { @@ -55,12 +56,7 @@ describe('POST /api/reporting/generate', () => { () => ({}) ); - callClusterStub = sinon.stub().resolves({}); - const mockSetupDeps = createMockPluginSetup({ - elasticsearch: { - legacy: { client: { callAsInternalUser: callClusterStub } }, - }, security: { license: { isEnabled: () => true }, authc: { @@ -85,6 +81,9 @@ describe('POST /api/reporting/generate', () => { runTaskFnFactory: () => async () => ({ runParamsTest: { test2: 'yes' } } as any), }); core.getExportTypesRegistry = () => mockExportTypesRegistry; + + mockEsClient = (await core.getEsClient()).asInternalUser as typeof mockEsClient; + mockEsClient.index.mockResolvedValue({ body: {} } as any); }); afterEach(async () => { @@ -144,7 +143,7 @@ describe('POST /api/reporting/generate', () => { }); it('returns 500 if job handler throws an error', async () => { - callClusterStub.withArgs('index').rejects('silly'); + mockEsClient.index.mockRejectedValueOnce('silly'); registerJobGenerationRoutes(core, mockLogger); @@ -157,7 +156,7 @@ describe('POST /api/reporting/generate', () => { }); it(`returns 200 if job handler doesn't error`, async () => { - callClusterStub.withArgs('index').resolves({ _id: 'foo', _index: 'foo-index' }); + mockEsClient.index.mockResolvedValueOnce({ body: { _id: 'foo', _index: 'foo-index' } } as any); registerJobGenerationRoutes(core, mockLogger); await server.start(); diff --git a/x-pack/plugins/reporting/server/routes/jobs.test.ts b/x-pack/plugins/reporting/server/routes/jobs.test.ts index 706a8d5dad7dd..885fc701935fe 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.test.ts @@ -6,7 +6,9 @@ */ import { UnwrapPromise } from '@kbn/utility-types'; +import type { DeeplyMockedKeys } from '@kbn/utility-types/jest'; import { of } from 'rxjs'; +import { ElasticsearchClient } from 'kibana/server'; import { setupServer } from 'src/core/server/test_utils'; import supertest from 'supertest'; import { ReportingCore } from '..'; @@ -29,6 +31,7 @@ describe('GET /api/reporting/jobs/download', () => { let httpSetup: SetupServerReturn['httpSetup']; let exportTypesRegistry: ExportTypesRegistry; let core: ReportingCore; + let mockEsClient: DeeplyMockedKeys; const config = createMockConfig(createMockConfigSchema()); const getHits = (...sources: any) => { @@ -47,9 +50,6 @@ describe('GET /api/reporting/jobs/download', () => { () => ({}) ); const mockSetupDeps = createMockPluginSetup({ - elasticsearch: { - legacy: { client: { callAsInternalUser: jest.fn() } }, - }, security: { license: { isEnabled: () => true, @@ -89,6 +89,8 @@ describe('GET /api/reporting/jobs/download', () => { validLicenses: ['basic', 'gold'], } as ExportTypeDefinition); core.getExportTypesRegistry = () => exportTypesRegistry; + + mockEsClient = (await core.getEsClient()).asInternalUser as typeof mockEsClient; }); afterEach(async () => { @@ -96,10 +98,7 @@ describe('GET /api/reporting/jobs/download', () => { }); it('fails on malformed download IDs', async () => { - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(getHits())), - }; + mockEsClient.search.mockResolvedValueOnce({ body: getHits() } as any); registerJobInfoRoutes(core); await server.start(); @@ -171,11 +170,7 @@ describe('GET /api/reporting/jobs/download', () => { }); it('returns 404 if job not found', async () => { - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(getHits())), - }; - + mockEsClient.search.mockResolvedValueOnce({ body: getHits() } as any); registerJobInfoRoutes(core); await server.start(); @@ -184,12 +179,9 @@ describe('GET /api/reporting/jobs/download', () => { }); it('returns a 401 if not a valid job type', async () => { - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest - .fn() - .mockReturnValue(Promise.resolve(getHits({ jobtype: 'invalidJobType' }))), - }; + mockEsClient.search.mockResolvedValueOnce({ + body: getHits({ jobtype: 'invalidJobType' }), + } as any); registerJobInfoRoutes(core); await server.start(); @@ -198,14 +190,9 @@ describe('GET /api/reporting/jobs/download', () => { }); it('when a job is incomplete', async () => { - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest - .fn() - .mockReturnValue( - Promise.resolve(getHits({ jobtype: 'unencodedJobType', status: 'pending' })) - ), - }; + mockEsClient.search.mockResolvedValueOnce({ + body: getHits({ jobtype: 'unencodedJobType', status: 'pending' }), + } as any); registerJobInfoRoutes(core); await server.start(); @@ -218,18 +205,13 @@ describe('GET /api/reporting/jobs/download', () => { }); it('when a job fails', async () => { - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue( - Promise.resolve( - getHits({ - jobtype: 'unencodedJobType', - status: 'failed', - output: { content: 'job failure message' }, - }) - ) - ), - }; + mockEsClient.search.mockResolvedValueOnce({ + body: getHits({ + jobtype: 'unencodedJobType', + status: 'failed', + output: { content: 'job failure message' }, + }), + } as any); registerJobInfoRoutes(core); await server.start(); @@ -243,7 +225,7 @@ describe('GET /api/reporting/jobs/download', () => { }); describe('successful downloads', () => { - const getCompleteHits = async ({ + const getCompleteHits = ({ jobType = 'unencodedJobType', outputContent = 'job output content', outputContentType = 'text/plain', @@ -260,11 +242,7 @@ describe('GET /api/reporting/jobs/download', () => { }; it('when a known job-type is complete', async () => { - const hits = getCompleteHits(); - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)), - }; + mockEsClient.search.mockResolvedValueOnce({ body: getCompleteHits() } as any); registerJobInfoRoutes(core); await server.start(); @@ -276,11 +254,7 @@ describe('GET /api/reporting/jobs/download', () => { }); it('succeeds when security is not there or disabled', async () => { - const hits = getCompleteHits(); - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)), - }; + mockEsClient.search.mockResolvedValueOnce({ body: getCompleteHits() } as any); // @ts-ignore core.pluginSetupDeps.security = null; @@ -297,14 +271,12 @@ describe('GET /api/reporting/jobs/download', () => { }); it(`doesn't encode output-content for non-specified job-types`, async () => { - const hits = getCompleteHits({ - jobType: 'unencodedJobType', - outputContent: 'test', - }); - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)), - }; + mockEsClient.search.mockResolvedValueOnce({ + body: getCompleteHits({ + jobType: 'unencodedJobType', + outputContent: 'test', + }), + } as any); registerJobInfoRoutes(core); await server.start(); @@ -316,15 +288,13 @@ describe('GET /api/reporting/jobs/download', () => { }); it(`base64 encodes output content for configured jobTypes`, async () => { - const hits = getCompleteHits({ - jobType: 'base64EncodedJobType', - outputContent: 'test', - outputContentType: 'application/pdf', - }); - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)), - }; + mockEsClient.search.mockResolvedValueOnce({ + body: getCompleteHits({ + jobType: 'base64EncodedJobType', + outputContent: 'test', + outputContentType: 'application/pdf', + }), + } as any); registerJobInfoRoutes(core); await server.start(); @@ -337,15 +307,13 @@ describe('GET /api/reporting/jobs/download', () => { }); it('refuses to return unknown content-types', async () => { - const hits = getCompleteHits({ - jobType: 'unencodedJobType', - outputContent: 'alert("all your base mine now");', - outputContentType: 'application/html', - }); - // @ts-ignore - core.pluginSetupDeps.elasticsearch.legacy.client = { - callAsInternalUser: jest.fn().mockReturnValue(Promise.resolve(hits)), - }; + mockEsClient.search.mockResolvedValueOnce({ + body: getCompleteHits({ + jobType: 'unencodedJobType', + outputContent: 'alert("all your base mine now");', + outputContentType: 'application/html', + }), + } as any); registerJobInfoRoutes(core); await server.start(); diff --git a/x-pack/plugins/reporting/server/routes/lib/jobs_query.ts b/x-pack/plugins/reporting/server/routes/lib/jobs_query.ts index 456c60e5c82e3..1db62f818216a 100644 --- a/x-pack/plugins/reporting/server/routes/lib/jobs_query.ts +++ b/x-pack/plugins/reporting/server/routes/lib/jobs_query.ts @@ -5,83 +5,59 @@ * 2.0. */ +import { UnwrapPromise } from '@kbn/utility-types'; import { i18n } from '@kbn/i18n'; -import { errors as elasticsearchErrors } from 'elasticsearch'; -import { get } from 'lodash'; +import { ResponseError } from '@elastic/elasticsearch/lib/errors'; +import { ElasticsearchClient } from 'src/core/server'; import { ReportingCore } from '../../'; import { ReportDocument } from '../../lib/store'; import { ReportingUser } from '../../types'; -const esErrors = elasticsearchErrors as Record; -const defaultSize = 10; - -// TODO: use SearchRequest from elasticsearch-client -interface QueryBody { - size?: number; - from?: number; - _source?: { - excludes: string[]; - }; - query: { - constant_score: { - filter: { - bool: { - must: Array>; - }; - }; - }; - }; -} +type SearchRequest = Required>[0]; interface GetOpts { includeContent?: boolean; } -// TODO: use SearchResult from elasticsearch-client -interface CountAggResult { - count: number; -} - +const defaultSize = 10; const getUsername = (user: ReportingUser) => (user ? user.username : false); -export function jobsQueryFactory(reportingCore: ReportingCore) { - const { elasticsearch } = reportingCore.getPluginSetupDeps(); - const { callAsInternalUser } = elasticsearch.legacy.client; - - function execQuery(queryType: string, body: QueryBody) { - const defaultBody: Record = { - search: { - _source: { - excludes: ['output.content'], - }, - sort: [{ created_at: { order: 'desc' } }], - size: defaultSize, - }, - }; +function getSearchBody(body: SearchRequest['body']): SearchRequest['body'] { + return { + _source: { + excludes: ['output.content'], + }, + sort: [{ created_at: { order: 'desc' } }], + size: defaultSize, + ...body, + }; +} +export function jobsQueryFactory(reportingCore: ReportingCore) { + function getIndex() { const config = reportingCore.getConfig(); - const index = config.get('index'); - const query = { - index: `${index}-*`, - body: Object.assign(defaultBody[queryType] || {}, body), - }; - - return callAsInternalUser(queryType, query).catch((err) => { - if (err instanceof esErrors['401']) return; - if (err instanceof esErrors['403']) return; - if (err instanceof esErrors['404']) return; - throw err; - }); + + return `${config.get('index')}-*`; } - type Result = number; + async function execQuery any>( + callback: T + ): Promise> | undefined> { + try { + const { asInternalUser: client } = await reportingCore.getEsClient(); + + return await callback(client); + } catch (error) { + if (error instanceof ResponseError && [401, 403, 404].includes(error.statusCode)) { + return; + } - function getHits(query: Promise) { - return query.then((res) => get(res, 'hits.hits', [])); + throw error; + } } return { - list( + async list( jobTypes: string[], user: ReportingUser, page = 0, @@ -89,32 +65,34 @@ export function jobsQueryFactory(reportingCore: ReportingCore) { jobIds: string[] | null ) { const username = getUsername(user); - const body: QueryBody = { + const body = getSearchBody({ size, from: size * page, query: { constant_score: { filter: { bool: { - must: [{ terms: { jobtype: jobTypes } }, { term: { created_by: username } }], + must: [ + { terms: { jobtype: jobTypes } }, + { term: { created_by: username } }, + ...(jobIds ? [{ ids: { values: jobIds } }] : []), + ], }, }, }, }, - }; + }); - if (jobIds) { - body.query.constant_score.filter.bool.must.push({ - ids: { values: jobIds }, - }); - } + const response = await execQuery((elasticsearchClient) => + elasticsearchClient.search({ body, index: getIndex() }) + ); - return getHits(execQuery('search', body)); + return response?.body.hits?.hits ?? []; }, - count(jobTypes: string[], user: ReportingUser) { + async count(jobTypes: string[], user: ReportingUser) { const username = getUsername(user); - const body: QueryBody = { + const body = { query: { constant_score: { filter: { @@ -126,17 +104,21 @@ export function jobsQueryFactory(reportingCore: ReportingCore) { }, }; - return execQuery('count', body).then((doc: CountAggResult) => { - if (!doc) return 0; - return doc.count; - }); + const response = await execQuery((elasticsearchClient) => + elasticsearchClient.count({ body, index: getIndex() }) + ); + + return response?.body.count ?? 0; }, - get(user: ReportingUser, id: string, opts: GetOpts = {}): Promise { - if (!id) return Promise.resolve(); - const username = getUsername(user); + async get(user: ReportingUser, id: string, opts: GetOpts = {}): Promise { + if (!id) { + return; + } - const body: QueryBody = { + const username = getUsername(user); + const body: SearchRequest['body'] = { + ...(opts.includeContent ? { _source: { excludes: [] } } : {}), query: { constant_score: { filter: { @@ -149,22 +131,23 @@ export function jobsQueryFactory(reportingCore: ReportingCore) { size: 1, }; - if (opts.includeContent) { - body._source = { - excludes: [], - }; + const response = await execQuery((elasticsearchClient) => + elasticsearchClient.search({ body, index: getIndex() }) + ); + + if (response?.body.hits?.hits?.length !== 1) { + return; } - return getHits(execQuery('search', body)).then((hits) => { - if (hits.length !== 1) return; - return hits[0]; - }); + return response.body.hits.hits[0] as ReportDocument; }, async delete(deleteIndex: string, id: string) { try { + const { asInternalUser: elasticsearchClient } = await reportingCore.getEsClient(); const query = { id, index: deleteIndex, refresh: true }; - return callAsInternalUser('delete', query); + + return await elasticsearchClient.delete(query); } catch (error) { throw new Error( i18n.translate('xpack.reporting.jobsQuery.deleteError', { diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts index e42d87c50e118..952f801ba519d 100644 --- a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts +++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts @@ -37,7 +37,6 @@ import { createMockLevelLogger } from './create_mock_levellogger'; export const createMockPluginSetup = (setupMock?: any): ReportingInternalSetup => { return { features: featuresPluginMock.createSetup(), - elasticsearch: setupMock.elasticsearch || { legacy: { client: {} } }, basePath: { set: jest.fn() }, router: setupMock.router, security: setupMock.security, @@ -137,7 +136,7 @@ export const createMockReportingCore = async ( ) => { const mockReportingCore = ({ getConfig: () => config, - getElasticsearchService: () => setupDepsMock?.elasticsearch, + getEsClient: () => startDepsMock?.esClient, getDataService: () => startDepsMock?.data, } as unknown) as ReportingCore; From 106afd41b689fa0c3fc680d14b838d29650473e3 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Fri, 16 Apr 2021 10:40:30 +0200 Subject: [PATCH 02/82] [SavedObjects] Add aggregations support (#96292) * step 1 to add aggs in the find function of saved object * setp 2 - add specific unit test to aggs + fix bug found during integrations * step 3 - add security api_integration arounds aggs * fix types * unit test added for aggs_utils * add documentation * fix docs * review I * doc * try to fix test * add the new property to the saved object globaltype * fix types * delete old files * fix types + test api integration * type fix + test * Update src/core/server/saved_objects/types.ts Co-authored-by: Rudolf Meijering * review I * change our validation to match discussion with Pierre and Rudolph * Validate multiple items nested filter query through KueryNode * remove unused import * review + put back test * migrate added tests to new TS file * fix documentation * fix license header * move stuff * duplicating test mappings * rename some stuff * move ALL the things * cast to aggregation container * update generated doc * add deep nested validation * rewrite the whole validation mechanism * some cleanup * minor cleanup * update generated doc * adapt telemetry client * fix API integ tests * fix doc * TOTO-less * remove xpack tests * list supported / unsupported aggregations * typo fix * extract some validation function * fix indent * add some unit tests * adapt FTR assertions * update doc * fix doc * doc again * cleanup test names * improve tsdoc on validation functions * perf nit Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Co-authored-by: Rudolf Meijering Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/api/saved-objects/find.asciidoc | 11 +- ...gin-core-public.savedobjectsclient.find.md | 2 +- ...a-plugin-core-public.savedobjectsclient.md | 2 +- ...dobjectsfindresponsepublic.aggregations.md | 11 + ...e-public.savedobjectsfindresponsepublic.md | 3 +- ...gin-core-server.savedobjectsclient.find.md | 4 +- ...r.savedobjectsfindresponse.aggregations.md | 11 + ...in-core-server.savedobjectsfindresponse.md | 3 +- ...core-server.savedobjectsrepository.find.md | 4 +- ...vedobjectsutils.createemptyfindresponse.md | 2 +- ...na-plugin-core-server.savedobjectsutils.md | 2 +- src/core/public/public.api.md | 8 +- .../saved_objects/saved_objects_client.ts | 14 +- src/core/server/saved_objects/routes/find.ts | 16 + .../aggregations/aggs_types/bucket_aggs.ts | 86 ++++ .../lib/aggregations/aggs_types/index.ts | 15 + .../aggregations/aggs_types/metrics_aggs.ts | 94 ++++ .../service/lib/aggregations/index.ts | 9 + .../lib/aggregations/validation.test.ts | 431 ++++++++++++++++++ .../service/lib/aggregations/validation.ts | 229 ++++++++++ .../lib/aggregations/validation_utils.test.ts | 148 ++++++ .../lib/aggregations/validation_utils.ts | 80 ++++ .../service/lib/filter_utils.test.ts | 69 ++- .../saved_objects/service/lib/filter_utils.ts | 12 +- .../saved_objects/service/lib/repository.ts | 36 +- .../server/saved_objects/service/lib/utils.ts | 4 +- .../service/saved_objects_client.ts | 7 +- src/core/server/saved_objects/types.ts | 22 + src/core/server/server.api.md | 12 +- .../server/telemetry_saved_objects_client.ts | 4 +- .../apis/saved_objects/find.ts | 69 +++ .../encrypted_saved_objects_client_wrapper.ts | 4 +- .../secure_saved_objects_client_wrapper.ts | 6 +- .../spaces_saved_objects_client.ts | 8 +- 34 files changed, 1369 insertions(+), 69 deletions(-) create mode 100644 docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.aggregations.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.aggregations.md create mode 100644 src/core/server/saved_objects/service/lib/aggregations/aggs_types/bucket_aggs.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/aggs_types/index.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/aggs_types/metrics_aggs.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/index.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/validation.test.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/validation.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/validation_utils.test.ts create mode 100644 src/core/server/saved_objects/service/lib/aggregations/validation_utils.ts diff --git a/docs/api/saved-objects/find.asciidoc b/docs/api/saved-objects/find.asciidoc index c43b58d3aa989..f04aeb8420620 100644 --- a/docs/api/saved-objects/find.asciidoc +++ b/docs/api/saved-objects/find.asciidoc @@ -53,9 +53,14 @@ experimental[] Retrieve a paginated set of {kib} saved objects by various condit (Optional, object) Filters to objects that have a relationship with the type and ID combination. `filter`:: - (Optional, string) The filter is a KQL string with the caveat that if you filter with an attribute from your type saved object. - It should look like that savedObjectType.attributes.title: "myTitle". However, If you used a direct attribute of a saved object like `updatedAt`, - you will have to define your filter like that savedObjectType.updatedAt > 2018-12-22. + (Optional, string) The filter is a KQL string with the caveat that if you filter with an attribute from your saved object type, + it should look like that: `savedObjectType.attributes.title: "myTitle"`. However, If you use a root attribute of a saved + object such as `updated_at`, you will have to define your filter like that: `savedObjectType.updated_at > 2018-12-22`. + +`aggs`:: + (Optional, string) **experimental** An aggregation structure, serialized as a string. The field format is similar to `filter`, meaning + that to use a saved object type attribute in the aggregation, the `savedObjectType.attributes.title`: "myTitle"` format + must be used. For root fields, the syntax is `savedObjectType.rootField` NOTE: As objects change in {kib}, the results on each page of the response also change. Use the find API for traditional paginated results, but avoid using it to export large amounts of data. diff --git a/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.find.md b/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.find.md index ddd8b207e3d78..fc9652b96450f 100644 --- a/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.find.md +++ b/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.find.md @@ -9,5 +9,5 @@ Search for objects Signature: ```typescript -find: (options: SavedObjectsFindOptions) => Promise>; +find: (options: SavedObjectsFindOptions) => Promise>; ``` diff --git a/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.md b/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.md index 6e53b169b8bed..1ec756f8d743d 100644 --- a/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.md +++ b/docs/development/core/public/kibana-plugin-core-public.savedobjectsclient.md @@ -24,7 +24,7 @@ The constructor for this class is marked as internal. Third-party code should no | [bulkGet](./kibana-plugin-core-public.savedobjectsclient.bulkget.md) | | (objects?: Array<{
id: string;
type: string;
}>) => Promise<SavedObjectsBatchResponse<unknown>> | Returns an array of objects by id | | [create](./kibana-plugin-core-public.savedobjectsclient.create.md) | | <T = unknown>(type: string, attributes: T, options?: SavedObjectsCreateOptions) => Promise<SimpleSavedObject<T>> | Persists an object | | [delete](./kibana-plugin-core-public.savedobjectsclient.delete.md) | | (type: string, id: string, options?: SavedObjectsDeleteOptions | undefined) => ReturnType<SavedObjectsApi['delete']> | Deletes an object | -| [find](./kibana-plugin-core-public.savedobjectsclient.find.md) | | <T = unknown>(options: SavedObjectsFindOptions) => Promise<SavedObjectsFindResponsePublic<T>> | Search for objects | +| [find](./kibana-plugin-core-public.savedobjectsclient.find.md) | | <T = unknown, A = unknown>(options: SavedObjectsFindOptions) => Promise<SavedObjectsFindResponsePublic<T, unknown>> | Search for objects | | [get](./kibana-plugin-core-public.savedobjectsclient.get.md) | | <T = unknown>(type: string, id: string) => Promise<SimpleSavedObject<T>> | Fetches a single object | ## Methods diff --git a/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.aggregations.md b/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.aggregations.md new file mode 100644 index 0000000000000..14401b02f25c7 --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.aggregations.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [SavedObjectsFindResponsePublic](./kibana-plugin-core-public.savedobjectsfindresponsepublic.md) > [aggregations](./kibana-plugin-core-public.savedobjectsfindresponsepublic.aggregations.md) + +## SavedObjectsFindResponsePublic.aggregations property + +Signature: + +```typescript +aggregations?: A; +``` diff --git a/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.md b/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.md index 7d75878041264..6f2276194f054 100644 --- a/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.md +++ b/docs/development/core/public/kibana-plugin-core-public.savedobjectsfindresponsepublic.md @@ -11,13 +11,14 @@ Return type of the Saved Objects `find()` method. Signature: ```typescript -export interface SavedObjectsFindResponsePublic extends SavedObjectsBatchResponse +export interface SavedObjectsFindResponsePublic extends SavedObjectsBatchResponse ``` ## Properties | Property | Type | Description | | --- | --- | --- | +| [aggregations](./kibana-plugin-core-public.savedobjectsfindresponsepublic.aggregations.md) | A | | | [page](./kibana-plugin-core-public.savedobjectsfindresponsepublic.page.md) | number | | | [perPage](./kibana-plugin-core-public.savedobjectsfindresponsepublic.perpage.md) | number | | | [total](./kibana-plugin-core-public.savedobjectsfindresponsepublic.total.md) | number | | diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsclient.find.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsclient.find.md index 9a4c3df5d2d92..56d76125108d1 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsclient.find.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsclient.find.md @@ -9,7 +9,7 @@ Find all SavedObjects matching the search query Signature: ```typescript -find(options: SavedObjectsFindOptions): Promise>; +find(options: SavedObjectsFindOptions): Promise>; ``` ## Parameters @@ -20,5 +20,5 @@ find(options: SavedObjectsFindOptions): PromiseReturns: -`Promise>` +`Promise>` diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.aggregations.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.aggregations.md new file mode 100644 index 0000000000000..17a899f4c8280 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.aggregations.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsFindResponse](./kibana-plugin-core-server.savedobjectsfindresponse.md) > [aggregations](./kibana-plugin-core-server.savedobjectsfindresponse.aggregations.md) + +## SavedObjectsFindResponse.aggregations property + +Signature: + +```typescript +aggregations?: A; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.md index fd56e8ce40e24..8176baf44acbd 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsfindresponse.md @@ -11,13 +11,14 @@ Return type of the Saved Objects `find()` method. Signature: ```typescript -export interface SavedObjectsFindResponse +export interface SavedObjectsFindResponse ``` ## Properties | Property | Type | Description | | --- | --- | --- | +| [aggregations](./kibana-plugin-core-server.savedobjectsfindresponse.aggregations.md) | A | | | [page](./kibana-plugin-core-server.savedobjectsfindresponse.page.md) | number | | | [per\_page](./kibana-plugin-core-server.savedobjectsfindresponse.per_page.md) | number | | | [pit\_id](./kibana-plugin-core-server.savedobjectsfindresponse.pit_id.md) | string | | diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.find.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.find.md index d3e93e7af2aa0..5c823b7567918 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.find.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.find.md @@ -7,7 +7,7 @@ Signature: ```typescript -find(options: SavedObjectsFindOptions): Promise>; +find(options: SavedObjectsFindOptions): Promise>; ``` ## Parameters @@ -18,7 +18,7 @@ find(options: SavedObjectsFindOptions): PromiseReturns: -`Promise>` +`Promise>` {promise} - { saved\_objects: \[{ id, type, version, attributes }\], total, per\_page, page } diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.createemptyfindresponse.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.createemptyfindresponse.md index 40e865cb02ce8..23cbebf22aa21 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.createemptyfindresponse.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.createemptyfindresponse.md @@ -9,5 +9,5 @@ Creates an empty response for a find operation. This is only intended to be used Signature: ```typescript -static createEmptyFindResponse: ({ page, perPage, }: SavedObjectsFindOptions) => SavedObjectsFindResponse; +static createEmptyFindResponse: ({ page, perPage, }: SavedObjectsFindOptions) => SavedObjectsFindResponse; ``` diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.md index 8c787364c4cbe..0148621e757b7 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsutils.md @@ -15,7 +15,7 @@ export declare class SavedObjectsUtils | Property | Modifiers | Type | Description | | --- | --- | --- | --- | -| [createEmptyFindResponse](./kibana-plugin-core-server.savedobjectsutils.createemptyfindresponse.md) | static | <T>({ page, perPage, }: SavedObjectsFindOptions) => SavedObjectsFindResponse<T> | Creates an empty response for a find operation. This is only intended to be used by saved objects client wrappers. | +| [createEmptyFindResponse](./kibana-plugin-core-server.savedobjectsutils.createemptyfindresponse.md) | static | <T, A>({ page, perPage, }: SavedObjectsFindOptions) => SavedObjectsFindResponse<T, A> | Creates an empty response for a find operation. This is only intended to be used by saved objects client wrappers. | | [namespaceIdToString](./kibana-plugin-core-server.savedobjectsutils.namespaceidtostring.md) | static | (namespace?: string | undefined) => string | Converts a given saved object namespace ID to its string representation. All namespace IDs have an identical string representation, with the exception of the undefined namespace ID (which has a namespace string of 'default'). | | [namespaceStringToId](./kibana-plugin-core-server.savedobjectsutils.namespacestringtoid.md) | static | (namespace: string) => string | undefined | Converts a given saved object namespace string to its ID representation. All namespace strings have an identical ID representation, with the exception of the 'default' namespace string (which has a namespace ID of undefined). | diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 8c1753c2cabab..18133ebec3353 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -1224,7 +1224,7 @@ export class SavedObjectsClient { // Warning: (ae-forgotten-export) The symbol "SavedObjectsClientContract" needs to be exported by the entry point index.d.ts delete: (type: string, id: string, options?: SavedObjectsDeleteOptions | undefined) => ReturnType; // Warning: (ae-forgotten-export) The symbol "SavedObjectsFindOptions" needs to be exported by the entry point index.d.ts - find: (options: SavedObjectsFindOptions_2) => Promise>; + find: (options: SavedObjectsFindOptions_2) => Promise>; get: (type: string, id: string) => Promise>; update(type: string, id: string, attributes: T, { version, migrationVersion, references }?: SavedObjectsUpdateOptions): Promise>; } @@ -1244,6 +1244,8 @@ export interface SavedObjectsCreateOptions { // @public (undocumented) export interface SavedObjectsFindOptions { + // @alpha + aggs?: Record; defaultSearchOperator?: 'AND' | 'OR'; fields?: string[]; // Warning: (ae-forgotten-export) The symbol "KueryNode" needs to be exported by the entry point index.d.ts @@ -1284,7 +1286,9 @@ export interface SavedObjectsFindOptionsReference { } // @public -export interface SavedObjectsFindResponsePublic extends SavedObjectsBatchResponse { +export interface SavedObjectsFindResponsePublic extends SavedObjectsBatchResponse { + // (undocumented) + aggregations?: A; // (undocumented) page: number; // (undocumented) diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index 44466025de7e3..782ffa6897048 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -103,7 +103,9 @@ export interface SavedObjectsDeleteOptions { * * @public */ -export interface SavedObjectsFindResponsePublic extends SavedObjectsBatchResponse { +export interface SavedObjectsFindResponsePublic + extends SavedObjectsBatchResponse { + aggregations?: A; total: number; perPage: number; page: number; @@ -310,7 +312,7 @@ export class SavedObjectsClient { * @property {object} [options.hasReference] - { type, id } * @returns A find result with objects matching the specified search. */ - public find = ( + public find = ( options: SavedObjectsFindOptions ): Promise> => { const path = this.getPath(['_find']); @@ -326,6 +328,7 @@ export class SavedObjectsClient { sortField: 'sort_field', type: 'type', filter: 'filter', + aggs: 'aggs', namespaces: 'namespaces', preference: 'preference', }; @@ -342,6 +345,12 @@ export class SavedObjectsClient { query.has_reference = JSON.stringify(query.has_reference); } + // `aggs` is a structured object. we need to stringify it before sending it, as `fetch` + // is not doing it implicitly. + if (query.aggs) { + query.aggs = JSON.stringify(query.aggs); + } + const request: ReturnType = this.savedObjectsFetch(path, { method: 'GET', query, @@ -349,6 +358,7 @@ export class SavedObjectsClient { return request.then((resp) => { return renameKeys( { + aggregations: 'aggregations', saved_objects: 'savedObjects', total: 'total', per_page: 'perPage', diff --git a/src/core/server/saved_objects/routes/find.ts b/src/core/server/saved_objects/routes/find.ts index 6ba23747cf374..d21039db30e5f 100644 --- a/src/core/server/saved_objects/routes/find.ts +++ b/src/core/server/saved_objects/routes/find.ts @@ -44,6 +44,7 @@ export const registerFindRoute = (router: IRouter, { coreUsageData }: RouteDepen has_reference_operator: searchOperatorSchema, fields: schema.maybe(schema.oneOf([schema.string(), schema.arrayOf(schema.string())])), filter: schema.maybe(schema.string()), + aggs: schema.maybe(schema.string()), namespaces: schema.maybe( schema.oneOf([schema.string(), schema.arrayOf(schema.string())]) ), @@ -59,6 +60,20 @@ export const registerFindRoute = (router: IRouter, { coreUsageData }: RouteDepen const usageStatsClient = coreUsageData.getClient(); usageStatsClient.incrementSavedObjectsFind({ request: req }).catch(() => {}); + // manually validation to avoid using JSON.parse twice + let aggs; + if (query.aggs) { + try { + aggs = JSON.parse(query.aggs); + } catch (e) { + return res.badRequest({ + body: { + message: 'invalid aggs value', + }, + }); + } + } + const result = await context.core.savedObjects.client.find({ perPage: query.per_page, page: query.page, @@ -72,6 +87,7 @@ export const registerFindRoute = (router: IRouter, { coreUsageData }: RouteDepen hasReferenceOperator: query.has_reference_operator, fields: typeof query.fields === 'string' ? [query.fields] : query.fields, filter: query.filter, + aggs, namespaces, }); diff --git a/src/core/server/saved_objects/service/lib/aggregations/aggs_types/bucket_aggs.ts b/src/core/server/saved_objects/service/lib/aggregations/aggs_types/bucket_aggs.ts new file mode 100644 index 0000000000000..1508cab69a048 --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/aggs_types/bucket_aggs.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema as s, ObjectType } from '@kbn/config-schema'; + +/** + * Schemas for the Bucket aggregations. + * + * Currently supported: + * - filter + * - histogram + * - terms + * + * Not implemented: + * - adjacency_matrix + * - auto_date_histogram + * - children + * - composite + * - date_histogram + * - date_range + * - diversified_sampler + * - filters + * - geo_distance + * - geohash_grid + * - geotile_grid + * - global + * - ip_range + * - missing + * - multi_terms + * - nested + * - parent + * - range + * - rare_terms + * - reverse_nested + * - sampler + * - significant_terms + * - significant_text + * - variable_width_histogram + */ +export const bucketAggsSchemas: Record = { + filter: s.object({ + term: s.recordOf(s.string(), s.oneOf([s.string(), s.boolean(), s.number()])), + }), + histogram: s.object({ + field: s.maybe(s.string()), + interval: s.maybe(s.number()), + min_doc_count: s.maybe(s.number()), + extended_bounds: s.maybe( + s.object({ + min: s.number(), + max: s.number(), + }) + ), + hard_bounds: s.maybe( + s.object({ + min: s.number(), + max: s.number(), + }) + ), + missing: s.maybe(s.number()), + keyed: s.maybe(s.boolean()), + order: s.maybe( + s.object({ + _count: s.string(), + _key: s.string(), + }) + ), + }), + terms: s.object({ + field: s.maybe(s.string()), + collect_mode: s.maybe(s.string()), + exclude: s.maybe(s.oneOf([s.string(), s.arrayOf(s.string())])), + include: s.maybe(s.oneOf([s.string(), s.arrayOf(s.string())])), + execution_hint: s.maybe(s.string()), + missing: s.maybe(s.number()), + min_doc_count: s.maybe(s.number()), + size: s.maybe(s.number()), + show_term_doc_count_error: s.maybe(s.boolean()), + order: s.maybe(s.oneOf([s.literal('asc'), s.literal('desc')])), + }), +}; diff --git a/src/core/server/saved_objects/service/lib/aggregations/aggs_types/index.ts b/src/core/server/saved_objects/service/lib/aggregations/aggs_types/index.ts new file mode 100644 index 0000000000000..7967fad0185fb --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/aggs_types/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { bucketAggsSchemas } from './bucket_aggs'; +import { metricsAggsSchemas } from './metrics_aggs'; + +export const aggregationSchemas = { + ...metricsAggsSchemas, + ...bucketAggsSchemas, +}; diff --git a/src/core/server/saved_objects/service/lib/aggregations/aggs_types/metrics_aggs.ts b/src/core/server/saved_objects/service/lib/aggregations/aggs_types/metrics_aggs.ts new file mode 100644 index 0000000000000..c05ae67cd2164 --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/aggs_types/metrics_aggs.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema as s, ObjectType } from '@kbn/config-schema'; + +/** + * Schemas for the metrics Aggregations + * + * Currently supported: + * - avg + * - cardinality + * - min + * - max + * - sum + * - top_hits + * - weighted_avg + * + * Not implemented: + * - boxplot + * - extended_stats + * - geo_bounds + * - geo_centroid + * - geo_line + * - matrix_stats + * - median_absolute_deviation + * - percentile_ranks + * - percentiles + * - rate + * - scripted_metric + * - stats + * - string_stats + * - t_test + * - value_count + */ +export const metricsAggsSchemas: Record = { + avg: s.object({ + field: s.maybe(s.string()), + missing: s.maybe(s.oneOf([s.string(), s.number(), s.boolean()])), + }), + cardinality: s.object({ + field: s.maybe(s.string()), + precision_threshold: s.maybe(s.number()), + rehash: s.maybe(s.boolean()), + missing: s.maybe(s.oneOf([s.string(), s.number(), s.boolean()])), + }), + min: s.object({ + field: s.maybe(s.string()), + missing: s.maybe(s.oneOf([s.string(), s.number(), s.boolean()])), + format: s.maybe(s.string()), + }), + max: s.object({ + field: s.maybe(s.string()), + missing: s.maybe(s.oneOf([s.string(), s.number(), s.boolean()])), + format: s.maybe(s.string()), + }), + sum: s.object({ + field: s.maybe(s.string()), + missing: s.maybe(s.oneOf([s.string(), s.number(), s.boolean()])), + }), + top_hits: s.object({ + explain: s.maybe(s.boolean()), + docvalue_fields: s.maybe(s.oneOf([s.string(), s.arrayOf(s.string())])), + stored_fields: s.maybe(s.oneOf([s.string(), s.arrayOf(s.string())])), + from: s.maybe(s.number()), + size: s.maybe(s.number()), + sort: s.maybe(s.oneOf([s.literal('asc'), s.literal('desc')])), + seq_no_primary_term: s.maybe(s.boolean()), + version: s.maybe(s.boolean()), + track_scores: s.maybe(s.boolean()), + highlight: s.maybe(s.any()), + _source: s.maybe(s.oneOf([s.boolean(), s.string(), s.arrayOf(s.string())])), + }), + weighted_avg: s.object({ + format: s.maybe(s.string()), + value_type: s.maybe(s.string()), + value: s.maybe( + s.object({ + field: s.maybe(s.string()), + missing: s.maybe(s.number()), + }) + ), + weight: s.maybe( + s.object({ + field: s.maybe(s.string()), + missing: s.maybe(s.number()), + }) + ), + }), +}; diff --git a/src/core/server/saved_objects/service/lib/aggregations/index.ts b/src/core/server/saved_objects/service/lib/aggregations/index.ts new file mode 100644 index 0000000000000..f71d3e8daea9d --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { validateAndConvertAggregations } from './validation'; diff --git a/src/core/server/saved_objects/service/lib/aggregations/validation.test.ts b/src/core/server/saved_objects/service/lib/aggregations/validation.test.ts new file mode 100644 index 0000000000000..8a7c1c3719eb0 --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/validation.test.ts @@ -0,0 +1,431 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { estypes } from '@elastic/elasticsearch'; +import { validateAndConvertAggregations } from './validation'; + +type AggsMap = Record; + +const mockMappings = { + properties: { + updated_at: { + type: 'date', + }, + foo: { + properties: { + title: { + type: 'text', + }, + description: { + type: 'text', + }, + bytes: { + type: 'number', + }, + }, + }, + bean: { + properties: { + canned: { + fields: { + text: { + type: 'text', + }, + }, + type: 'keyword', + }, + }, + }, + alert: { + properties: { + actions: { + type: 'nested', + properties: { + group: { + type: 'keyword', + }, + actionRef: { + type: 'keyword', + }, + actionTypeId: { + type: 'keyword', + }, + params: { + enabled: false, + type: 'object', + }, + }, + }, + params: { + type: 'flattened', + }, + }, + }, + }, +}; + +describe('validateAndConvertAggregations', () => { + it('validates a simple aggregations', () => { + expect( + validateAndConvertAggregations( + ['foo'], + { aggName: { max: { field: 'foo.attributes.bytes' } } }, + mockMappings + ) + ).toEqual({ + aggName: { + max: { + field: 'foo.bytes', + }, + }, + }); + }); + + it('validates a nested field in simple aggregations', () => { + expect( + validateAndConvertAggregations( + ['alert'], + { aggName: { cardinality: { field: 'alert.attributes.actions.group' } } }, + mockMappings + ) + ).toEqual({ + aggName: { + cardinality: { + field: 'alert.actions.group', + }, + }, + }); + }); + + it('validates a nested aggregations', () => { + expect( + validateAndConvertAggregations( + ['alert'], + { + aggName: { + cardinality: { + field: 'alert.attributes.actions.group', + }, + aggs: { + aggName: { + max: { field: 'alert.attributes.actions.group' }, + }, + }, + }, + }, + mockMappings + ) + ).toEqual({ + aggName: { + cardinality: { + field: 'alert.actions.group', + }, + aggs: { + aggName: { + max: { + field: 'alert.actions.group', + }, + }, + }, + }, + }); + }); + + it('validates a deeply nested aggregations', () => { + expect( + validateAndConvertAggregations( + ['alert'], + { + first: { + cardinality: { + field: 'alert.attributes.actions.group', + }, + aggs: { + second: { + max: { field: 'alert.attributes.actions.group' }, + aggs: { + third: { + min: { + field: 'alert.attributes.actions.actionTypeId', + }, + }, + }, + }, + }, + }, + }, + mockMappings + ) + ).toEqual({ + first: { + cardinality: { + field: 'alert.actions.group', + }, + aggs: { + second: { + max: { field: 'alert.actions.group' }, + aggs: { + third: { + min: { + field: 'alert.actions.actionTypeId', + }, + }, + }, + }, + }, + }, + }); + }); + + it('rewrites type attributes when valid', () => { + const aggregations: AggsMap = { + average: { + avg: { + field: 'alert.attributes.actions.group', + missing: 10, + }, + }, + }; + expect(validateAndConvertAggregations(['alert'], aggregations, mockMappings)).toEqual({ + average: { + avg: { + field: 'alert.actions.group', + missing: 10, + }, + }, + }); + }); + + it('rewrites root attributes when valid', () => { + const aggregations: AggsMap = { + average: { + avg: { + field: 'alert.updated_at', + missing: 10, + }, + }, + }; + expect(validateAndConvertAggregations(['alert'], aggregations, mockMappings)).toEqual({ + average: { + avg: { + field: 'updated_at', + missing: 10, + }, + }, + }); + }); + + it('throws an error when the `field` name is not using attributes path', () => { + const aggregations: AggsMap = { + average: { + avg: { + field: 'alert.actions.group', + missing: 10, + }, + }, + }; + expect(() => + validateAndConvertAggregations(['alert'], aggregations, mockMappings) + ).toThrowErrorMatchingInlineSnapshot( + `"[average.avg.field] Invalid attribute path: alert.actions.group"` + ); + }); + + it('throws an error when the `field` name is referencing an invalid field', () => { + const aggregations: AggsMap = { + average: { + avg: { + field: 'alert.attributes.actions.non_existing', + missing: 10, + }, + }, + }; + expect(() => + validateAndConvertAggregations(['alert'], aggregations, mockMappings) + ).toThrowErrorMatchingInlineSnapshot( + `"[average.avg.field] Invalid attribute path: alert.attributes.actions.non_existing"` + ); + }); + + it('throws an error when the attribute path is referencing an invalid root field', () => { + const aggregations: AggsMap = { + average: { + avg: { + field: 'alert.bad_root', + missing: 10, + }, + }, + }; + expect(() => + validateAndConvertAggregations(['alert'], aggregations, mockMappings) + ).toThrowErrorMatchingInlineSnapshot( + `"[average.avg.field] Invalid attribute path: alert.bad_root"` + ); + }); + + it('rewrites the `field` name even when nested', () => { + const aggregations: AggsMap = { + average: { + weighted_avg: { + value: { + field: 'alert.attributes.actions.group', + missing: 10, + }, + weight: { + field: 'alert.attributes.actions.actionRef', + }, + }, + }, + }; + expect(validateAndConvertAggregations(['alert'], aggregations, mockMappings)).toEqual({ + average: { + weighted_avg: { + value: { + field: 'alert.actions.group', + missing: 10, + }, + weight: { + field: 'alert.actions.actionRef', + }, + }, + }, + }); + }); + + it('rewrites the entries of a filter term record', () => { + const aggregations: AggsMap = { + myFilter: { + filter: { + term: { + 'foo.attributes.description': 'hello', + 'foo.attributes.bytes': 10, + }, + }, + }, + }; + expect(validateAndConvertAggregations(['foo'], aggregations, mockMappings)).toEqual({ + myFilter: { + filter: { + term: { 'foo.description': 'hello', 'foo.bytes': 10 }, + }, + }, + }); + }); + + it('throws an error when referencing non-allowed types', () => { + const aggregations: AggsMap = { + myFilter: { + max: { + field: 'foo.attributes.bytes', + }, + }, + }; + + expect(() => { + validateAndConvertAggregations(['alert'], aggregations, mockMappings); + }).toThrowErrorMatchingInlineSnapshot( + `"[myFilter.max.field] Invalid attribute path: foo.attributes.bytes"` + ); + }); + + it('throws an error when an attributes is not respecting its schema definition', () => { + const aggregations: AggsMap = { + someAgg: { + terms: { + missing: 'expecting a number', + }, + }, + }; + + expect(() => + validateAndConvertAggregations(['alert'], aggregations, mockMappings) + ).toThrowErrorMatchingInlineSnapshot( + `"[someAgg.terms.missing]: expected value of type [number] but got [string]"` + ); + }); + + it('throws an error when trying to validate an unknown aggregation type', () => { + const aggregations: AggsMap = { + someAgg: { + auto_date_histogram: { + field: 'foo.attributes.bytes', + }, + }, + }; + + expect(() => { + validateAndConvertAggregations(['foo'], aggregations, mockMappings); + }).toThrowErrorMatchingInlineSnapshot( + `"[someAgg.auto_date_histogram] auto_date_histogram aggregation is not valid (or not registered yet)"` + ); + }); + + it('throws an error when a child aggregation is unknown', () => { + const aggregations: AggsMap = { + someAgg: { + max: { + field: 'foo.attributes.bytes', + }, + aggs: { + unknownAgg: { + cumulative_cardinality: { + format: 'format', + }, + }, + }, + }, + }; + + expect(() => { + validateAndConvertAggregations(['foo'], aggregations, mockMappings); + }).toThrowErrorMatchingInlineSnapshot( + `"[someAgg.aggs.unknownAgg.cumulative_cardinality] cumulative_cardinality aggregation is not valid (or not registered yet)"` + ); + }); + + it('throws an error when using a script attribute', () => { + const aggregations: AggsMap = { + someAgg: { + max: { + field: 'foo.attributes.bytes', + script: 'This is a bad script', + }, + }, + }; + + expect(() => { + validateAndConvertAggregations(['foo'], aggregations, mockMappings); + }).toThrowErrorMatchingInlineSnapshot( + `"[someAgg.max.script]: definition for this key is missing"` + ); + }); + + it('throws an error when using a script attribute in a nested aggregation', () => { + const aggregations: AggsMap = { + someAgg: { + min: { + field: 'foo.attributes.bytes', + }, + aggs: { + nested: { + max: { + field: 'foo.attributes.bytes', + script: 'This is a bad script', + }, + }, + }, + }, + }; + + expect(() => { + validateAndConvertAggregations(['foo'], aggregations, mockMappings); + }).toThrowErrorMatchingInlineSnapshot( + `"[someAgg.aggs.nested.max.script]: definition for this key is missing"` + ); + }); +}); diff --git a/src/core/server/saved_objects/service/lib/aggregations/validation.ts b/src/core/server/saved_objects/service/lib/aggregations/validation.ts new file mode 100644 index 0000000000000..a2fd392183132 --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/validation.ts @@ -0,0 +1,229 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { estypes } from '@elastic/elasticsearch'; +import { ObjectType } from '@kbn/config-schema'; +import { isPlainObject } from 'lodash'; + +import { IndexMapping } from '../../../mappings'; +import { + isObjectTypeAttribute, + rewriteObjectTypeAttribute, + isRootLevelAttribute, + rewriteRootLevelAttribute, +} from './validation_utils'; +import { aggregationSchemas } from './aggs_types'; + +const aggregationKeys = ['aggs', 'aggregations']; + +interface ValidationContext { + allowedTypes: string[]; + indexMapping: IndexMapping; + currentPath: string[]; +} + +/** + * Validate an aggregation structure against the declared mappings and + * aggregation schemas, and rewrite the attribute fields using the KQL-like syntax + * - `{type}.attributes.{attribute}` to `{type}.{attribute}` + * - `{type}.{rootField}` to `{rootField}` + * + * throws on the first validation error if any is encountered. + */ +export const validateAndConvertAggregations = ( + allowedTypes: string[], + aggs: Record, + indexMapping: IndexMapping +): Record => { + return validateAggregations(aggs, { + allowedTypes, + indexMapping, + currentPath: [], + }); +}; + +/** + * Validate a record of aggregation containers, + * Which can either be the root level aggregations (`SearchRequest.body.aggs`) + * Or a nested record of aggregation (`SearchRequest.body.aggs.myAggregation.aggs`) + */ +const validateAggregations = ( + aggregations: Record, + context: ValidationContext +) => { + return Object.entries(aggregations).reduce((memo, [aggrName, aggrContainer]) => { + memo[aggrName] = validateAggregation(aggrContainer, childContext(context, aggrName)); + return memo; + }, {} as Record); +}; + +/** + * Validate an aggregation container, e.g an entry of `SearchRequest.body.aggs`, or + * from a nested aggregation record, including its potential nested aggregations. + */ +const validateAggregation = ( + aggregation: estypes.AggregationContainer, + context: ValidationContext +) => { + const container = validateAggregationContainer(aggregation, context); + + if (aggregation.aggregations) { + container.aggregations = validateAggregations( + aggregation.aggregations, + childContext(context, 'aggregations') + ); + } + if (aggregation.aggs) { + container.aggs = validateAggregations(aggregation.aggs, childContext(context, 'aggs')); + } + + return container; +}; + +/** + * Validates root-level aggregation of given aggregation container + * (ignoring its nested aggregations) + */ +const validateAggregationContainer = ( + container: estypes.AggregationContainer, + context: ValidationContext +) => { + return Object.entries(container).reduce((memo, [aggName, aggregation]) => { + if (aggregationKeys.includes(aggName)) { + return memo; + } + return { + ...memo, + [aggName]: validateAggregationType(aggName, aggregation, childContext(context, aggName)), + }; + }, {} as estypes.AggregationContainer); +}; + +const validateAggregationType = ( + aggregationType: string, + aggregation: Record, + context: ValidationContext +) => { + const aggregationSchema = aggregationSchemas[aggregationType]; + if (!aggregationSchema) { + throw new Error( + `[${context.currentPath.join( + '.' + )}] ${aggregationType} aggregation is not valid (or not registered yet)` + ); + } + + validateAggregationStructure(aggregationSchema, aggregation, context); + return validateAndRewriteFieldAttributes(aggregation, context); +}; + +/** + * Validate an aggregation structure against its declared schema. + */ +const validateAggregationStructure = ( + schema: ObjectType, + aggObject: unknown, + context: ValidationContext +) => { + return schema.validate(aggObject, {}, context.currentPath.join('.')); +}; + +/** + * List of fields that have an attribute path as value + * + * @example + * ```ts + * avg: { + * field: 'alert.attributes.actions.group', + * }, + * ``` + */ +const attributeFields = ['field']; +/** + * List of fields that have a Record as value + * + * @example + * ```ts + * filter: { + * term: { + * 'alert.attributes.actions.group': 'value' + * }, + * }, + * ``` + */ +const attributeMaps = ['term']; + +const validateAndRewriteFieldAttributes = ( + aggregation: Record, + context: ValidationContext +) => { + return recursiveRewrite(aggregation, context, []); +}; + +const recursiveRewrite = ( + currentLevel: Record, + context: ValidationContext, + parents: string[] +): Record => { + return Object.entries(currentLevel).reduce((memo, [key, value]) => { + const rewriteKey = isAttributeKey(parents); + const rewriteValue = isAttributeValue(key, value); + + const nestedContext = childContext(context, key); + const newKey = rewriteKey ? validateAndRewriteAttributePath(key, nestedContext) : key; + const newValue = rewriteValue + ? validateAndRewriteAttributePath(value, nestedContext) + : isPlainObject(value) + ? recursiveRewrite(value, nestedContext, [...parents, key]) + : value; + + return { + ...memo, + [newKey]: newValue, + }; + }, {}); +}; + +const childContext = (context: ValidationContext, path: string): ValidationContext => { + return { + ...context, + currentPath: [...context.currentPath, path], + }; +}; + +const lastParent = (parents: string[]) => { + if (parents.length) { + return parents[parents.length - 1]; + } + return undefined; +}; + +const isAttributeKey = (parents: string[]) => { + const last = lastParent(parents); + if (last) { + return attributeMaps.includes(last); + } + return false; +}; + +const isAttributeValue = (fieldName: string, fieldValue: unknown): boolean => { + return attributeFields.includes(fieldName) && typeof fieldValue === 'string'; +}; + +const validateAndRewriteAttributePath = ( + attributePath: string, + { allowedTypes, indexMapping, currentPath }: ValidationContext +) => { + if (isRootLevelAttribute(attributePath, indexMapping, allowedTypes)) { + return rewriteRootLevelAttribute(attributePath); + } + if (isObjectTypeAttribute(attributePath, indexMapping, allowedTypes)) { + return rewriteObjectTypeAttribute(attributePath); + } + throw new Error(`[${currentPath.join('.')}] Invalid attribute path: ${attributePath}`); +}; diff --git a/src/core/server/saved_objects/service/lib/aggregations/validation_utils.test.ts b/src/core/server/saved_objects/service/lib/aggregations/validation_utils.test.ts new file mode 100644 index 0000000000000..25c3aea474ece --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/validation_utils.test.ts @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { IndexMapping } from '../../../mappings'; +import { + isRootLevelAttribute, + rewriteRootLevelAttribute, + isObjectTypeAttribute, + rewriteObjectTypeAttribute, +} from './validation_utils'; + +const mockMappings: IndexMapping = { + properties: { + updated_at: { + type: 'date', + }, + foo: { + properties: { + title: { + type: 'text', + }, + description: { + type: 'text', + }, + bytes: { + type: 'number', + }, + }, + }, + bean: { + properties: { + canned: { + fields: { + text: { + type: 'text', + }, + }, + type: 'keyword', + }, + }, + }, + alert: { + properties: { + actions: { + type: 'nested', + properties: { + group: { + type: 'keyword', + }, + actionRef: { + type: 'keyword', + }, + actionTypeId: { + type: 'keyword', + }, + params: { + enabled: false, + type: 'object', + }, + }, + }, + params: { + type: 'flattened', + }, + }, + }, + }, +}; + +describe('isRootLevelAttribute', () => { + it('returns true when referring to a path to a valid root level field', () => { + expect(isRootLevelAttribute('foo.updated_at', mockMappings, ['foo'])).toBe(true); + }); + it('returns false when referring to a direct path to a valid root level field', () => { + expect(isRootLevelAttribute('updated_at', mockMappings, ['foo'])).toBe(false); + }); + it('returns false when referring to a path to a unknown root level field', () => { + expect(isRootLevelAttribute('foo.not_present', mockMappings, ['foo'])).toBe(false); + }); + it('returns false when referring to a path to an existing nested field', () => { + expect(isRootLevelAttribute('foo.properties.title', mockMappings, ['foo'])).toBe(false); + }); + it('returns false when referring to a path to a valid root level field of an unknown type', () => { + expect(isRootLevelAttribute('bar.updated_at', mockMappings, ['foo'])).toBe(false); + }); + it('returns false when referring to a path to a valid root level type field', () => { + expect(isRootLevelAttribute('foo.foo', mockMappings, ['foo'])).toBe(false); + }); +}); + +describe('rewriteRootLevelAttribute', () => { + it('rewrites the attribute path to strip the type', () => { + expect(rewriteRootLevelAttribute('foo.references')).toEqual('references'); + }); + it('does not handle real root level path', () => { + expect(rewriteRootLevelAttribute('references')).not.toEqual('references'); + }); +}); + +describe('isObjectTypeAttribute', () => { + it('return true if attribute path is valid', () => { + expect(isObjectTypeAttribute('foo.attributes.description', mockMappings, ['foo'])).toEqual( + true + ); + }); + + it('return true for nested attributes', () => { + expect(isObjectTypeAttribute('bean.attributes.canned.text', mockMappings, ['bean'])).toEqual( + true + ); + }); + + it('return false if attribute path points to an invalid type', () => { + expect(isObjectTypeAttribute('foo.attributes.description', mockMappings, ['bean'])).toEqual( + false + ); + }); + + it('returns false if attribute path refers to a type', () => { + expect(isObjectTypeAttribute('bean', mockMappings, ['bean'])).toEqual(false); + }); + + it('Return error if key does not match SO attribute structure', () => { + expect(isObjectTypeAttribute('bean.canned.text', mockMappings, ['bean'])).toEqual(false); + }); + + it('Return false if key matches nested type attribute parent', () => { + expect(isObjectTypeAttribute('alert.actions', mockMappings, ['alert'])).toEqual(false); + }); + + it('returns false if path refers to a non-existent attribute', () => { + expect(isObjectTypeAttribute('bean.attributes.red', mockMappings, ['bean'])).toEqual(false); + }); +}); + +describe('rewriteObjectTypeAttribute', () => { + it('rewrites the attribute path to strip the type', () => { + expect(rewriteObjectTypeAttribute('foo.attributes.prop')).toEqual('foo.prop'); + }); + it('returns invalid input unchanged', () => { + expect(rewriteObjectTypeAttribute('foo.references')).toEqual('foo.references'); + }); +}); diff --git a/src/core/server/saved_objects/service/lib/aggregations/validation_utils.ts b/src/core/server/saved_objects/service/lib/aggregations/validation_utils.ts new file mode 100644 index 0000000000000..f817497e3759e --- /dev/null +++ b/src/core/server/saved_objects/service/lib/aggregations/validation_utils.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { IndexMapping } from '../../../mappings'; +import { fieldDefined, hasFilterKeyError } from '../filter_utils'; + +/** + * Returns true if the given attribute path is a valid root level SO attribute path + * + * @example + * ```ts + * isRootLevelAttribute('myType.updated_at', indexMapping, ['myType']}) + * // => true + * ``` + */ +export const isRootLevelAttribute = ( + attributePath: string, + indexMapping: IndexMapping, + allowedTypes: string[] +): boolean => { + const splits = attributePath.split('.'); + if (splits.length !== 2) { + return false; + } + + const [type, fieldName] = splits; + if (allowedTypes.includes(fieldName)) { + return false; + } + return allowedTypes.includes(type) && fieldDefined(indexMapping, fieldName); +}; + +/** + * Rewrites a root level attribute path to strip the type + * + * @example + * ```ts + * rewriteRootLevelAttribute('myType.updated_at') + * // => 'updated_at' + * ``` + */ +export const rewriteRootLevelAttribute = (attributePath: string) => { + return attributePath.split('.')[1]; +}; + +/** + * Returns true if the given attribute path is a valid object type level SO attribute path + * + * @example + * ```ts + * isObjectTypeAttribute('myType.attributes.someField', indexMapping, ['myType']}) + * // => true + * ``` + */ +export const isObjectTypeAttribute = ( + attributePath: string, + indexMapping: IndexMapping, + allowedTypes: string[] +): boolean => { + const error = hasFilterKeyError(attributePath, allowedTypes, indexMapping); + return error == null; +}; + +/** + * Rewrites a object type attribute path to strip the type + * + * @example + * ```ts + * rewriteObjectTypeAttribute('myType.attributes.foo') + * // => 'myType.foo' + * ``` + */ +export const rewriteObjectTypeAttribute = (attributePath: string) => { + return attributePath.replace('.attributes', ''); +}; diff --git a/src/core/server/saved_objects/service/lib/filter_utils.test.ts b/src/core/server/saved_objects/service/lib/filter_utils.test.ts index b50326627cf09..956a60b23809d 100644 --- a/src/core/server/saved_objects/service/lib/filter_utils.test.ts +++ b/src/core/server/saved_objects/service/lib/filter_utils.test.ts @@ -18,7 +18,7 @@ import { const mockMappings = { properties: { - updatedAt: { + updated_at: { type: 'date', }, foo: { @@ -123,12 +123,12 @@ describe('Filter Utils', () => { expect( validateConvertFilterToKueryNode( ['foo'], - 'foo.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)', + 'foo.updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)', mockMappings ) ).toEqual( esKuery.fromKueryExpression( - '(type: foo and updatedAt: 5678654567) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or foo.description :*)' + '(type: foo and updated_at: 5678654567) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or foo.description :*)' ) ); }); @@ -137,12 +137,12 @@ describe('Filter Utils', () => { expect( validateConvertFilterToKueryNode( ['foo', 'bar'], - 'foo.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)', + 'foo.updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)', mockMappings ) ).toEqual( esKuery.fromKueryExpression( - '(type: foo and updatedAt: 5678654567) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or foo.description :*)' + '(type: foo and updated_at: 5678654567) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or foo.description :*)' ) ); }); @@ -151,12 +151,12 @@ describe('Filter Utils', () => { expect( validateConvertFilterToKueryNode( ['foo', 'bar'], - '(bar.updatedAt: 5678654567 OR foo.updatedAt: 5678654567) and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or bar.attributes.description :*)', + '(bar.updated_at: 5678654567 OR foo.updated_at: 5678654567) and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or bar.attributes.description :*)', mockMappings ) ).toEqual( esKuery.fromKueryExpression( - '((type: bar and updatedAt: 5678654567) or (type: foo and updatedAt: 5678654567)) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or bar.description :*)' + '((type: bar and updated_at: 5678654567) or (type: foo and updated_at: 5678654567)) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or bar.description :*)' ) ); }); @@ -181,11 +181,11 @@ describe('Filter Utils', () => { expect(() => { validateConvertFilterToKueryNode( ['foo', 'bar'], - 'updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)', + 'updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)', mockMappings ); }).toThrowErrorMatchingInlineSnapshot( - `"This key 'updatedAt' need to be wrapped by a saved object type like foo,bar: Bad Request"` + `"This key 'updated_at' need to be wrapped by a saved object type like foo,bar: Bad Request"` ); }); @@ -200,7 +200,7 @@ describe('Filter Utils', () => { test('Validate filter query through KueryNode - happy path', () => { const validationObject = validateFilterKueryNode({ astFilter: esKuery.fromKueryExpression( - 'foo.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' + 'foo.updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' ), types: ['foo'], indexMapping: mockMappings, @@ -211,7 +211,7 @@ describe('Filter Utils', () => { astPath: 'arguments.0', error: null, isSavedObjectAttr: true, - key: 'foo.updatedAt', + key: 'foo.updated_at', type: 'foo', }, { @@ -275,7 +275,7 @@ describe('Filter Utils', () => { test('Return Error if key is not wrapper by a saved object type', () => { const validationObject = validateFilterKueryNode({ astFilter: esKuery.fromKueryExpression( - 'updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' + 'updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' ), types: ['foo'], indexMapping: mockMappings, @@ -284,9 +284,9 @@ describe('Filter Utils', () => { expect(validationObject).toEqual([ { astPath: 'arguments.0', - error: "This key 'updatedAt' need to be wrapped by a saved object type like foo", + error: "This key 'updated_at' need to be wrapped by a saved object type like foo", isSavedObjectAttr: true, - key: 'updatedAt', + key: 'updated_at', type: null, }, { @@ -330,7 +330,7 @@ describe('Filter Utils', () => { test('Return Error if key of a saved object type is not wrapped with attributes', () => { const validationObject = validateFilterKueryNode({ astFilter: esKuery.fromKueryExpression( - 'foo.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.description :*)' + 'foo.updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.description :*)' ), types: ['foo'], indexMapping: mockMappings, @@ -341,7 +341,7 @@ describe('Filter Utils', () => { astPath: 'arguments.0', error: null, isSavedObjectAttr: true, - key: 'foo.updatedAt', + key: 'foo.updated_at', type: 'foo', }, { @@ -387,7 +387,7 @@ describe('Filter Utils', () => { test('Return Error if filter is not using an allowed type', () => { const validationObject = validateFilterKueryNode({ astFilter: esKuery.fromKueryExpression( - 'bar.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' + 'bar.updated_at: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' ), types: ['foo'], indexMapping: mockMappings, @@ -398,7 +398,7 @@ describe('Filter Utils', () => { astPath: 'arguments.0', error: 'This type bar is not allowed', isSavedObjectAttr: true, - key: 'bar.updatedAt', + key: 'bar.updated_at', type: 'bar', }, { @@ -442,7 +442,7 @@ describe('Filter Utils', () => { test('Return Error if filter is using an non-existing key in the index patterns of the saved object type', () => { const validationObject = validateFilterKueryNode({ astFilter: esKuery.fromKueryExpression( - 'foo.updatedAt33: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.header: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' + 'foo.updated_at33: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.header: "best" and (foo.attributes.description: t* or foo.attributes.description :*)' ), types: ['foo'], indexMapping: mockMappings, @@ -451,9 +451,9 @@ describe('Filter Utils', () => { expect(validationObject).toEqual([ { astPath: 'arguments.0', - error: "This key 'foo.updatedAt33' does NOT exist in foo saved object index patterns", + error: "This key 'foo.updated_at33' does NOT exist in foo saved object index patterns", isSavedObjectAttr: false, - key: 'foo.updatedAt33', + key: 'foo.updated_at33', type: 'foo', }, { @@ -519,6 +519,33 @@ describe('Filter Utils', () => { }, ]); }); + + test('Validate multiple items nested filter query through KueryNode', () => { + const validationObject = validateFilterKueryNode({ + astFilter: esKuery.fromKueryExpression( + 'alert.attributes.actions:{ actionTypeId: ".server-log" AND actionRef: "foo" }' + ), + types: ['alert'], + indexMapping: mockMappings, + }); + + expect(validationObject).toEqual([ + { + astPath: 'arguments.1.arguments.0', + error: null, + isSavedObjectAttr: false, + key: 'alert.attributes.actions.actionTypeId', + type: 'alert', + }, + { + astPath: 'arguments.1.arguments.1', + error: null, + isSavedObjectAttr: false, + key: 'alert.attributes.actions.actionRef', + type: 'alert', + }, + ]); + }); }); describe('#hasFilterKeyError', () => { diff --git a/src/core/server/saved_objects/service/lib/filter_utils.ts b/src/core/server/saved_objects/service/lib/filter_utils.ts index 688b7ad96e8ed..b3bcef9a62e13 100644 --- a/src/core/server/saved_objects/service/lib/filter_utils.ts +++ b/src/core/server/saved_objects/service/lib/filter_utils.ts @@ -109,7 +109,15 @@ export const validateFilterKueryNode = ({ return astFilter.arguments.reduce((kueryNode: string[], ast: KueryNode, index: number) => { if (hasNestedKey && ast.type === 'literal' && ast.value != null) { localNestedKeys = ast.value; + } else if (ast.type === 'literal' && ast.value && typeof ast.value === 'string') { + const key = ast.value.replace('.attributes', ''); + const mappingKey = 'properties.' + key.split('.').join('.properties.'); + const field = get(indexMapping, mappingKey); + if (field != null && field.type === 'nested') { + localNestedKeys = ast.value; + } } + if (ast.arguments) { const myPath = `${path}.${index}`; return [ @@ -121,7 +129,7 @@ export const validateFilterKueryNode = ({ storeValue: ast.type === 'function' && astFunctionType.includes(ast.function), path: `${myPath}.arguments`, hasNestedKey: ast.type === 'function' && ast.function === 'nested', - nestedKeys: localNestedKeys, + nestedKeys: localNestedKeys || nestedKeys, }), ]; } @@ -226,7 +234,7 @@ export const fieldDefined = (indexMappings: IndexMapping, key: string): boolean return true; } - // If the path is for a flattned type field, we'll assume the mappings are defined. + // If the path is for a flattened type field, we'll assume the mappings are defined. const keys = key.split('.'); for (let i = 0; i < keys.length; i++) { const path = `properties.${keys.slice(0, i + 1).join('.properties.')}`; diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 7c719ac56a835..c0e2cdc333363 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -66,6 +66,7 @@ import { import { LegacyUrlAlias, LEGACY_URL_ALIAS_TYPE } from '../../object_types'; import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; import { validateConvertFilterToKueryNode } from './filter_utils'; +import { validateAndConvertAggregations } from './aggregations'; import { ALL_NAMESPACES_STRING, FIND_DEFAULT_PAGE, @@ -748,7 +749,9 @@ export class SavedObjectsRepository { * @property {string} [options.preference] * @returns {promise} - { saved_objects: [{ id, type, version, attributes }], total, per_page, page } */ - async find(options: SavedObjectsFindOptions): Promise> { + async find( + options: SavedObjectsFindOptions + ): Promise> { const { search, defaultSearchOperator = 'OR', @@ -768,6 +771,7 @@ export class SavedObjectsRepository { typeToNamespacesMap, filter, preference, + aggs, } = options; if (!type && !typeToNamespacesMap) { @@ -799,7 +803,7 @@ export class SavedObjectsRepository { : Array.from(typeToNamespacesMap!.keys()); const allowedTypes = types.filter((t) => this._allowedTypes.includes(t)); if (allowedTypes.length === 0) { - return SavedObjectsUtils.createEmptyFindResponse(options); + return SavedObjectsUtils.createEmptyFindResponse(options); } if (searchFields && !Array.isArray(searchFields)) { @@ -811,16 +815,24 @@ export class SavedObjectsRepository { } let kueryNode; - - try { - if (filter) { + if (filter) { + try { kueryNode = validateConvertFilterToKueryNode(allowedTypes, filter, this._mappings); + } catch (e) { + if (e.name === 'KQLSyntaxError') { + throw SavedObjectsErrorHelpers.createBadRequestError(`KQLSyntaxError: ${e.message}`); + } else { + throw e; + } } - } catch (e) { - if (e.name === 'KQLSyntaxError') { - throw SavedObjectsErrorHelpers.createBadRequestError('KQLSyntaxError: ' + e.message); - } else { - throw e; + } + + let aggsObject; + if (aggs) { + try { + aggsObject = validateAndConvertAggregations(allowedTypes, aggs, this._mappings); + } catch (e) { + throw SavedObjectsErrorHelpers.createBadRequestError(`Invalid aggregation: ${e.message}`); } } @@ -838,6 +850,7 @@ export class SavedObjectsRepository { seq_no_primary_term: true, from: perPage * (page - 1), _source: includedFields(type, fields), + ...(aggsObject ? { aggs: aggsObject } : {}), ...getSearchDsl(this._mappings, this._registry, { search, defaultSearchOperator, @@ -872,6 +885,7 @@ export class SavedObjectsRepository { } return { + ...(body.aggregations ? { aggregations: (body.aggregations as unknown) as A } : {}), page, per_page: perPage, total: body.hits.total, @@ -885,7 +899,7 @@ export class SavedObjectsRepository { }) ), pit_id: body.pit_id, - } as SavedObjectsFindResponse; + } as SavedObjectsFindResponse; } /** diff --git a/src/core/server/saved_objects/service/lib/utils.ts b/src/core/server/saved_objects/service/lib/utils.ts index ebad13e5edc25..494ac6ce9fad5 100644 --- a/src/core/server/saved_objects/service/lib/utils.ts +++ b/src/core/server/saved_objects/service/lib/utils.ts @@ -51,10 +51,10 @@ export class SavedObjectsUtils { /** * Creates an empty response for a find operation. This is only intended to be used by saved objects client wrappers. */ - public static createEmptyFindResponse = ({ + public static createEmptyFindResponse = ({ page = FIND_DEFAULT_PAGE, perPage = FIND_DEFAULT_PER_PAGE, - }: SavedObjectsFindOptions): SavedObjectsFindResponse => ({ + }: SavedObjectsFindOptions): SavedObjectsFindResponse => ({ page, per_page: perPage, total: 0, diff --git a/src/core/server/saved_objects/service/saved_objects_client.ts b/src/core/server/saved_objects/service/saved_objects_client.ts index 9a0ccb88d3555..12451ace02836 100644 --- a/src/core/server/saved_objects/service/saved_objects_client.ts +++ b/src/core/server/saved_objects/service/saved_objects_client.ts @@ -173,7 +173,8 @@ export interface SavedObjectsFindResult extends SavedObject { * * @public */ -export interface SavedObjectsFindResponse { +export interface SavedObjectsFindResponse { + aggregations?: A; saved_objects: Array>; total: number; per_page: number; @@ -463,7 +464,9 @@ export class SavedObjectsClient { * * @param options */ - async find(options: SavedObjectsFindOptions): Promise> { + async find( + options: SavedObjectsFindOptions + ): Promise> { return await this._repository.find(options); } diff --git a/src/core/server/saved_objects/types.ts b/src/core/server/saved_objects/types.ts index ecda120e025d8..d3bfdcc6923dc 100644 --- a/src/core/server/saved_objects/types.ts +++ b/src/core/server/saved_objects/types.ts @@ -116,6 +116,28 @@ export interface SavedObjectsFindOptions { */ defaultSearchOperator?: 'AND' | 'OR'; filter?: string | KueryNode; + /** + * A record of aggregations to perform. + * The API currently only supports a limited set of metrics and bucket aggregation types. + * Additional aggregation types can be contributed to Core. + * + * @example + * Aggregating on SO attribute field + * ```ts + * const aggs = { latest_version: { max: { field: 'dashboard.attributes.version' } } }; + * return client.find({ type: 'dashboard', aggs }) + * ``` + * + * @example + * Aggregating on SO root field + * ```ts + * const aggs = { latest_update: { max: { field: 'dashboard.updated_at' } } }; + * return client.find({ type: 'dashboard', aggs }) + * ``` + * + * @alpha + */ + aggs?: Record; namespaces?: string[]; /** * This map defines each type to search for, and the namespace(s) to search for the type in; this is only intended to be used by a saved diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index 05af684053f39..e8f9dab435754 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -2244,7 +2244,7 @@ export class SavedObjectsClient { static errors: typeof SavedObjectsErrorHelpers; // (undocumented) errors: typeof SavedObjectsErrorHelpers; - find(options: SavedObjectsFindOptions): Promise>; + find(options: SavedObjectsFindOptions): Promise>; get(type: string, id: string, options?: SavedObjectsBaseOptions): Promise>; openPointInTimeForType(type: string | string[], options?: SavedObjectsOpenPointInTimeOptions): Promise; removeReferencesTo(type: string, id: string, options?: SavedObjectsRemoveReferencesToOptions): Promise; @@ -2501,6 +2501,8 @@ export type SavedObjectsFieldMapping = SavedObjectsCoreFieldMapping | SavedObjec // @public (undocumented) export interface SavedObjectsFindOptions { + // @alpha + aggs?: Record; defaultSearchOperator?: 'AND' | 'OR'; fields?: string[]; // Warning: (ae-forgotten-export) The symbol "KueryNode" needs to be exported by the entry point index.d.ts @@ -2539,7 +2541,9 @@ export interface SavedObjectsFindOptionsReference { } // @public -export interface SavedObjectsFindResponse { +export interface SavedObjectsFindResponse { + // (undocumented) + aggregations?: A; // (undocumented) page: number; // (undocumented) @@ -2849,7 +2853,7 @@ export class SavedObjectsRepository { deleteByNamespace(namespace: string, options?: SavedObjectsDeleteByNamespaceOptions): Promise; deleteFromNamespaces(type: string, id: string, namespaces: string[], options?: SavedObjectsDeleteFromNamespacesOptions): Promise; // (undocumented) - find(options: SavedObjectsFindOptions): Promise>; + find(options: SavedObjectsFindOptions): Promise>; get(type: string, id: string, options?: SavedObjectsBaseOptions): Promise>; incrementCounter(type: string, id: string, counterFields: Array, options?: SavedObjectsIncrementCounterOptions): Promise>; openPointInTimeForType(type: string | string[], { keepAlive, preference }?: SavedObjectsOpenPointInTimeOptions): Promise; @@ -2970,7 +2974,7 @@ export interface SavedObjectsUpdateResponse extends Omit({ page, perPage, }: SavedObjectsFindOptions) => SavedObjectsFindResponse; + static createEmptyFindResponse: ({ page, perPage, }: SavedObjectsFindOptions) => SavedObjectsFindResponse; static generateId(): string; static isRandomId(id: string | undefined): boolean; static namespaceIdToString: (namespace?: string | undefined) => string; diff --git a/src/plugins/telemetry_collection_manager/server/telemetry_saved_objects_client.ts b/src/plugins/telemetry_collection_manager/server/telemetry_saved_objects_client.ts index d639b053565d1..01d89c5731158 100644 --- a/src/plugins/telemetry_collection_manager/server/telemetry_saved_objects_client.ts +++ b/src/plugins/telemetry_collection_manager/server/telemetry_saved_objects_client.ts @@ -17,7 +17,9 @@ export class TelemetrySavedObjectsClient extends SavedObjectsClient { * Find the SavedObjects matching the search query in all the Spaces by default * @param options */ - async find(options: SavedObjectsFindOptions): Promise> { + async find( + options: SavedObjectsFindOptions + ): Promise> { return super.find({ namespaces: ['*'], ...options }); } } diff --git a/test/api_integration/apis/saved_objects/find.ts b/test/api_integration/apis/saved_objects/find.ts index 28c38ca9e0ded..a01562861e606 100644 --- a/test/api_integration/apis/saved_objects/find.ts +++ b/test/api_integration/apis/saved_objects/find.ts @@ -293,6 +293,75 @@ export default function ({ getService }: FtrProviderContext) { })); }); + describe('using aggregations', () => { + it('should return 200 with valid response for a valid aggregation', async () => + await supertest + .get( + `/api/saved_objects/_find?type=visualization&per_page=0&aggs=${encodeURIComponent( + JSON.stringify({ + type_count: { max: { field: 'visualization.attributes.version' } }, + }) + )}` + ) + .expect(200) + .then((resp) => { + expect(resp.body).to.eql({ + aggregations: { + type_count: { + value: 1, + }, + }, + page: 1, + per_page: 0, + saved_objects: [], + total: 1, + }); + })); + + it('should return a 400 when referencing an invalid SO attribute', async () => + await supertest + .get( + `/api/saved_objects/_find?type=visualization&per_page=0&aggs=${encodeURIComponent( + JSON.stringify({ + type_count: { max: { field: 'dashboard.attributes.version' } }, + }) + )}` + ) + .expect(400) + .then((resp) => { + expect(resp.body).to.eql({ + error: 'Bad Request', + message: + 'Invalid aggregation: [type_count.max.field] Invalid attribute path: dashboard.attributes.version: Bad Request', + statusCode: 400, + }); + })); + + it('should return a 400 when using a forbidden aggregation option', async () => + await supertest + .get( + `/api/saved_objects/_find?type=visualization&per_page=0&aggs=${encodeURIComponent( + JSON.stringify({ + type_count: { + max: { + field: 'visualization.attributes.version', + script: 'Bad script is bad', + }, + }, + }) + )}` + ) + .expect(400) + .then((resp) => { + expect(resp.body).to.eql({ + error: 'Bad Request', + message: + 'Invalid aggregation: [type_count.max.script]: definition for this key is missing: Bad Request', + statusCode: 400, + }); + })); + }); + describe('`has_reference` and `has_reference_operator` parameters', () => { before(() => esArchiver.load('saved_objects/references')); after(() => esArchiver.unload('saved_objects/references')); diff --git a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts index 88a89af6be3d0..9b699d6ce007c 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.ts @@ -162,9 +162,9 @@ export class EncryptedSavedObjectsClientWrapper implements SavedObjectsClientCon return await this.options.baseClient.delete(type, id, options); } - public async find(options: SavedObjectsFindOptions) { + public async find(options: SavedObjectsFindOptions) { return await this.handleEncryptedAttributesInBulkResponse( - await this.options.baseClient.find(options), + await this.options.baseClient.find(options), undefined ); } diff --git a/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts b/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts index 8378cc4d848cf..d876175a05fe8 100644 --- a/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts +++ b/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts @@ -213,7 +213,7 @@ export class SecureSavedObjectsClientWrapper implements SavedObjectsClientContra return await this.baseClient.delete(type, id, options); } - public async find(options: SavedObjectsFindOptions) { + public async find(options: SavedObjectsFindOptions) { if ( this.getSpacesService() == null && Array.isArray(options.namespaces) && @@ -245,7 +245,7 @@ export class SecureSavedObjectsClientWrapper implements SavedObjectsClientContra error: new Error(status), }) ); - return SavedObjectsUtils.createEmptyFindResponse(options); + return SavedObjectsUtils.createEmptyFindResponse(options); } const typeToNamespacesMap = Array.from(typeMap).reduce>( @@ -254,7 +254,7 @@ export class SecureSavedObjectsClientWrapper implements SavedObjectsClientContra new Map() ); - const response = await this.baseClient.find({ + const response = await this.baseClient.find({ ...options, typeToNamespacesMap: undefined, // if the user is fully authorized, use `undefined` as the typeToNamespacesMap to prevent privilege escalation ...(status === 'partially_authorized' && { typeToNamespacesMap, type: '', namespaces: [] }), // the repository requires that `type` and `namespaces` must be empty if `typeToNamespacesMap` is defined diff --git a/x-pack/plugins/spaces/server/saved_objects/spaces_saved_objects_client.ts b/x-pack/plugins/spaces/server/saved_objects/spaces_saved_objects_client.ts index c544e2f46f058..4254615ac7d5f 100644 --- a/x-pack/plugins/spaces/server/saved_objects/spaces_saved_objects_client.ts +++ b/x-pack/plugins/spaces/server/saved_objects/spaces_saved_objects_client.ts @@ -171,7 +171,7 @@ export class SpacesSavedObjectsClient implements SavedObjectsClientContract { * @property {object} [options.hasReference] - { type, id } * @returns {promise} - { saved_objects: [{ id, type, version, attributes }], total, per_page, page } */ - public async find(options: SavedObjectsFindOptions) { + public async find(options: SavedObjectsFindOptions) { throwErrorIfNamespaceSpecified(options); let namespaces = options.namespaces; @@ -187,12 +187,12 @@ export class SpacesSavedObjectsClient implements SavedObjectsClientContract { } if (namespaces.length === 0) { // return empty response, since the user is unauthorized in this space (or these spaces), but we don't return forbidden errors for `find` operations - return SavedObjectsUtils.createEmptyFindResponse(options); + return SavedObjectsUtils.createEmptyFindResponse(options); } } catch (err) { if (Boom.isBoom(err) && err.output.payload.statusCode === 403) { // return empty response, since the user is unauthorized in any space, but we don't return forbidden errors for `find` operations - return SavedObjectsUtils.createEmptyFindResponse(options); + return SavedObjectsUtils.createEmptyFindResponse(options); } throw err; } @@ -200,7 +200,7 @@ export class SpacesSavedObjectsClient implements SavedObjectsClientContract { namespaces = [this.spaceId]; } - return await this.client.find({ + return await this.client.find({ ...options, type: (options.type ? coerceToArray(options.type) : this.types).filter( (type) => type !== 'space' From c187270b5e2d90c306a55694c53614e149422d35 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Fri, 16 Apr 2021 19:59:23 +0300 Subject: [PATCH 03/82] [Search Sessions] Client side search cache (#92439) * dev docs * sessions tutorial * title * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update dev_docs/tutorials/data/search.mdx Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Code review * client cache * mock utils * improve code * Use cacheOnClient in Lens * mock * docs and types * unit tests! * Search response cache + tests * remove cacheOnClient evict cache on error * test ts * shouldCacheOnClient + improve tests * remove unused * clear subs * dont unsubscribe on setItem * caching mess * t * fix jest * add size to bfetch response @ppisljar use it to reduce the # of stringify in response cache * ts * ts * docs * simplify abort controller logic and extract it into a class * docs * delete unused tests * use addAbortSignal * code review * Use shareReplay, fix tests * code review * bfetch test * code review * Leave the bfetch changes out * docs + isRestore * make sure to clean up properly * Make sure that aborting in cache works correctly Clearer restructuring of code * fix test * import * code review round 1 * ts * Added functional test for search request caching * test * skip before codefreeze Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...earchinterceptor.getserializableoptions.md | 22 + ...n-plugins-data-public.searchinterceptor.md | 1 + examples/search_examples/common/index.ts | 1 + .../search_examples/public/search/app.tsx | 67 ++- .../search_examples/server/my_strategy.ts | 1 + .../data/common/search/tabify/tabify.ts | 2 +- src/plugins/data/public/public.api.md | 2 + .../data/public/search/search_interceptor.ts | 28 +- .../public/search/session/session_service.ts | 2 +- .../search/search_abort_controller.test.ts | 22 +- .../public/search/search_abort_controller.ts | 7 +- .../public/search/search_interceptor.test.ts | 557 +++++++++++++++++- .../public/search/search_interceptor.ts | 150 ++++- .../search/search_response_cache.test.ts | 318 ++++++++++ .../public/search/search_response_cache.ts | 136 +++++ .../data_enhanced/public/search/utils.ts | 15 + x-pack/plugins/lens/public/app_plugin/app.tsx | 13 +- x-pack/test/examples/search_examples/index.ts | 1 + .../search_examples/search_sessions_cache.ts | 65 ++ 19 files changed, 1350 insertions(+), 60 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getserializableoptions.md create mode 100644 x-pack/plugins/data_enhanced/public/search/search_response_cache.test.ts create mode 100644 x-pack/plugins/data_enhanced/public/search/search_response_cache.ts create mode 100644 x-pack/plugins/data_enhanced/public/search/utils.ts create mode 100644 x-pack/test/examples/search_examples/search_sessions_cache.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getserializableoptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getserializableoptions.md new file mode 100644 index 0000000000000..984f99004ebe8 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getserializableoptions.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [getSerializableOptions](./kibana-plugin-plugins-data-public.searchinterceptor.getserializableoptions.md) + +## SearchInterceptor.getSerializableOptions() method + +Signature: + +```typescript +protected getSerializableOptions(options?: ISearchOptions): Pick; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| options | ISearchOptions | | + +Returns: + +`Pick` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md index 9d18309fc07be..653f052dd5a3a 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md @@ -26,6 +26,7 @@ export declare class SearchInterceptor | Method | Modifiers | Description | | --- | --- | --- | +| [getSerializableOptions(options)](./kibana-plugin-plugins-data-public.searchinterceptor.getserializableoptions.md) | | | | [getTimeoutMode()](./kibana-plugin-plugins-data-public.searchinterceptor.gettimeoutmode.md) | | | | [handleSearchError(e, options, isTimeout)](./kibana-plugin-plugins-data-public.searchinterceptor.handlesearcherror.md) | | | | [search(request, options)](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | Searches using the given search method. Overrides the AbortSignal with one that will abort either when the request times out, or when the original AbortSignal is aborted. Updates pendingCount$ when the request is started/finalized. | diff --git a/examples/search_examples/common/index.ts b/examples/search_examples/common/index.ts index dd953b1ec8982..cc47c0f575973 100644 --- a/examples/search_examples/common/index.ts +++ b/examples/search_examples/common/index.ts @@ -16,6 +16,7 @@ export interface IMyStrategyRequest extends IEsSearchRequest { } export interface IMyStrategyResponse extends IEsSearchResponse { cool: string; + executed_at: number; } export const SERVER_SEARCH_ROUTE_PATH = '/api/examples/search'; diff --git a/examples/search_examples/public/search/app.tsx b/examples/search_examples/public/search/app.tsx index 3bac445581ae7..8f31d242faf5e 100644 --- a/examples/search_examples/public/search/app.tsx +++ b/examples/search_examples/public/search/app.tsx @@ -111,7 +111,7 @@ export const SearchExamplesApp = ({ setSelectedNumericField(fields?.length ? getNumeric(fields)[0] : null); }, [fields]); - const doAsyncSearch = async (strategy?: string) => { + const doAsyncSearch = async (strategy?: string, sessionId?: string) => { if (!indexPattern || !selectedNumericField) return; // Construct the query portion of the search request @@ -138,6 +138,7 @@ export const SearchExamplesApp = ({ const searchSubscription$ = data.search .search(req, { strategy, + sessionId, }) .subscribe({ next: (res) => { @@ -148,19 +149,30 @@ export const SearchExamplesApp = ({ ? // @ts-expect-error @elastic/elasticsearch no way to declare a type for aggregation in the search response res.rawResponse.aggregations[1].value : undefined; + const isCool = (res as IMyStrategyResponse).cool; + const executedAt = (res as IMyStrategyResponse).executed_at; const message = ( Searched {res.rawResponse.hits.total} documents.
The average of {selectedNumericField!.name} is{' '} {avgResult ? Math.floor(avgResult) : 0}.
- Is it Cool? {String((res as IMyStrategyResponse).cool)} + {isCool ? `Is it Cool? ${isCool}` : undefined} +
+ + {executedAt ? `Executed at? ${executedAt}` : undefined} +
); - notifications.toasts.addSuccess({ - title: 'Query result', - text: mountReactNode(message), - }); + notifications.toasts.addSuccess( + { + title: 'Query result', + text: mountReactNode(message), + }, + { + toastLifeTimeMs: 300000, + } + ); searchSubscription$.unsubscribe(); } else if (isErrorResponse(res)) { // TODO: Make response error status clearer @@ -227,6 +239,10 @@ export const SearchExamplesApp = ({ doAsyncSearch('myStrategy'); }; + const onClientSideSessionCacheClickHandler = () => { + doAsyncSearch('myStrategy', data.search.session.getSessionId()); + }; + const onServerClickHandler = async () => { if (!indexPattern || !selectedNumericField) return; try { @@ -374,6 +390,45 @@ export const SearchExamplesApp = ({ + +

Client side search session caching

+
+ + data.search.session.start()} + iconType="alert" + data-test-subj="searchExamplesStartSession" + > + + + data.search.session.clear()} + iconType="alert" + data-test-subj="searchExamplesClearSession" + > + + + + + + +

Using search on the server

diff --git a/examples/search_examples/server/my_strategy.ts b/examples/search_examples/server/my_strategy.ts index 2cf039e99f6e9..0a64788960091 100644 --- a/examples/search_examples/server/my_strategy.ts +++ b/examples/search_examples/server/my_strategy.ts @@ -20,6 +20,7 @@ export const mySearchStrategyProvider = ( map((esSearchRes) => ({ ...esSearchRes, cool: request.get_cool ? 'YES' : 'NOPE', + executed_at: new Date().getTime(), })) ), cancel: async (id, options, deps) => { diff --git a/src/plugins/data/common/search/tabify/tabify.ts b/src/plugins/data/common/search/tabify/tabify.ts index 9f096886491ad..4a8972d4384c2 100644 --- a/src/plugins/data/common/search/tabify/tabify.ts +++ b/src/plugins/data/common/search/tabify/tabify.ts @@ -139,7 +139,7 @@ export function tabifyAggResponse( const write = new TabbedAggResponseWriter(aggConfigs, respOpts || {}); const topLevelBucket: AggResponseBucket = { ...esResponse.aggregations, - doc_count: esResponse.hits.total, + doc_count: esResponse.hits?.total, }; collectBucket(aggConfigs, write, topLevelBucket, '', 1); diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index d99d754a3364d..35f13fc855e99 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -2353,6 +2353,8 @@ export class SearchInterceptor { // (undocumented) protected readonly deps: SearchInterceptorDeps; // (undocumented) + protected getSerializableOptions(options?: ISearchOptions): Pick; + // (undocumented) protected getTimeoutMode(): TimeoutErrorMode; // Warning: (ae-forgotten-export) The symbol "KibanaServerError" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "AbortError" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor.ts index 3df2313f83798..e3fb31c9179fd 100644 --- a/src/plugins/data/public/search/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor.ts @@ -113,20 +113,14 @@ export class SearchInterceptor { } } - /** - * @internal - * @throws `AbortError` | `ErrorLike` - */ - protected runSearch( - request: IKibanaSearchRequest, - options?: ISearchOptions - ): Promise { - const { abortSignal, sessionId, ...requestOptions } = options || {}; + protected getSerializableOptions(options?: ISearchOptions) { + const { sessionId, ...requestOptions } = options || {}; + + const serializableOptions: ISearchOptionsSerializable = {}; const combined = { ...requestOptions, ...this.deps.session.getSearchOptions(sessionId), }; - const serializableOptions: ISearchOptionsSerializable = {}; if (combined.sessionId !== undefined) serializableOptions.sessionId = combined.sessionId; if (combined.isRestore !== undefined) serializableOptions.isRestore = combined.isRestore; @@ -135,10 +129,22 @@ export class SearchInterceptor { if (combined.strategy !== undefined) serializableOptions.strategy = combined.strategy; if (combined.isStored !== undefined) serializableOptions.isStored = combined.isStored; + return serializableOptions; + } + + /** + * @internal + * @throws `AbortError` | `ErrorLike` + */ + protected runSearch( + request: IKibanaSearchRequest, + options?: ISearchOptions + ): Promise { + const { abortSignal } = options || {}; return this.batchedFetch( { request, - options: serializableOptions, + options: this.getSerializableOptions(options), }, abortSignal ); diff --git a/src/plugins/data/public/search/session/session_service.ts b/src/plugins/data/public/search/session/session_service.ts index 381410574ecda..71f51b4bc8d83 100644 --- a/src/plugins/data/public/search/session/session_service.ts +++ b/src/plugins/data/public/search/session/session_service.ts @@ -73,7 +73,7 @@ export interface SearchSessionIndicatorUiConfig { } /** - * Responsible for tracking a current search session. Supports only a single session at a time. + * Responsible for tracking a current search session. Supports a single session at a time. */ export class SessionService { public readonly state$: Observable; diff --git a/x-pack/plugins/data_enhanced/public/search/search_abort_controller.test.ts b/x-pack/plugins/data_enhanced/public/search/search_abort_controller.test.ts index 68282c1e947f7..a52fdef9819b8 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_abort_controller.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_abort_controller.test.ts @@ -21,13 +21,15 @@ describe('search abort controller', () => { test('immediately aborts when passed an aborted signal in the constructor', () => { const controller = new AbortController(); controller.abort(); - const sac = new SearchAbortController(controller.signal); + const sac = new SearchAbortController(); + sac.addAbortSignal(controller.signal); expect(sac.getSignal().aborted).toBe(true); }); test('aborts when input signal is aborted', () => { const controller = new AbortController(); - const sac = new SearchAbortController(controller.signal); + const sac = new SearchAbortController(); + sac.addAbortSignal(controller.signal); expect(sac.getSignal().aborted).toBe(false); controller.abort(); expect(sac.getSignal().aborted).toBe(true); @@ -35,7 +37,8 @@ describe('search abort controller', () => { test('aborts when all input signals are aborted', () => { const controller = new AbortController(); - const sac = new SearchAbortController(controller.signal); + const sac = new SearchAbortController(); + sac.addAbortSignal(controller.signal); const controller2 = new AbortController(); sac.addAbortSignal(controller2.signal); @@ -48,7 +51,8 @@ describe('search abort controller', () => { test('aborts explicitly even if all inputs are not aborted', () => { const controller = new AbortController(); - const sac = new SearchAbortController(controller.signal); + const sac = new SearchAbortController(); + sac.addAbortSignal(controller.signal); const controller2 = new AbortController(); sac.addAbortSignal(controller2.signal); @@ -60,7 +64,8 @@ describe('search abort controller', () => { test('doesnt abort, if cleared', () => { const controller = new AbortController(); - const sac = new SearchAbortController(controller.signal); + const sac = new SearchAbortController(); + sac.addAbortSignal(controller.signal); expect(sac.getSignal().aborted).toBe(false); sac.cleanup(); controller.abort(); @@ -77,7 +82,7 @@ describe('search abort controller', () => { }); test('doesnt abort on timeout, if cleared', () => { - const sac = new SearchAbortController(undefined, 100); + const sac = new SearchAbortController(100); expect(sac.getSignal().aborted).toBe(false); sac.cleanup(); timeTravel(100); @@ -85,7 +90,7 @@ describe('search abort controller', () => { }); test('aborts on timeout, even if no signals passed in', () => { - const sac = new SearchAbortController(undefined, 100); + const sac = new SearchAbortController(100); expect(sac.getSignal().aborted).toBe(false); timeTravel(100); expect(sac.getSignal().aborted).toBe(true); @@ -94,7 +99,8 @@ describe('search abort controller', () => { test('aborts on timeout, even if there are unaborted signals', () => { const controller = new AbortController(); - const sac = new SearchAbortController(controller.signal, 100); + const sac = new SearchAbortController(100); + sac.addAbortSignal(controller.signal); expect(sac.getSignal().aborted).toBe(false); timeTravel(100); diff --git a/x-pack/plugins/data_enhanced/public/search/search_abort_controller.ts b/x-pack/plugins/data_enhanced/public/search/search_abort_controller.ts index 4482a7771dc28..7bc74b56a3903 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_abort_controller.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_abort_controller.ts @@ -18,11 +18,7 @@ export class SearchAbortController { private destroyed = false; private reason?: AbortReason; - constructor(abortSignal?: AbortSignal, timeout?: number) { - if (abortSignal) { - this.addAbortSignal(abortSignal); - } - + constructor(timeout?: number) { if (timeout) { this.timeoutSub = timer(timeout).subscribe(() => { this.reason = AbortReason.Timeout; @@ -41,6 +37,7 @@ export class SearchAbortController { }; public cleanup() { + if (this.destroyed) return; this.destroyed = true; this.timeoutSub?.unsubscribe(); this.inputAbortSignals.forEach((abortSignal) => { diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts index 02671974e5053..0e511c545f3e2 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts @@ -23,9 +23,12 @@ import { bfetchPluginMock } from '../../../../../src/plugins/bfetch/public/mocks import { BehaviorSubject } from 'rxjs'; import * as xpackResourceNotFoundException from '../../common/search/test_data/search_phase_execution_exception.json'; -const timeTravel = (msToRun = 0) => { +const flushPromises = () => new Promise((resolve) => setImmediate(resolve)); + +const timeTravel = async (msToRun = 0) => { + await flushPromises(); jest.advanceTimersByTime(msToRun); - return new Promise((resolve) => setImmediate(resolve)); + return flushPromises(); }; const next = jest.fn(); @@ -39,10 +42,20 @@ let fetchMock: jest.Mock; jest.useFakeTimers(); +jest.mock('./utils', () => ({ + createRequestHash: jest.fn().mockImplementation((input) => { + return Promise.resolve(JSON.stringify(input)); + }), +})); + function mockFetchImplementation(responses: any[]) { let i = 0; - fetchMock.mockImplementation(() => { + fetchMock.mockImplementation((r) => { + if (!r.request.id) i = 0; const { time = 0, value = {}, isError = false } = responses[i++]; + value.meta = { + size: 10, + }; return new Promise((resolve, reject) => setTimeout(() => { return (isError ? reject : resolve)(value); @@ -452,7 +465,7 @@ describe('EnhancedSearchInterceptor', () => { }); }); - describe('session', () => { + describe('session tracking', () => { beforeEach(() => { const responses = [ { @@ -559,4 +572,540 @@ describe('EnhancedSearchInterceptor', () => { expect(sessionService.trackSearch).toBeCalledTimes(0); }); }); + + describe('session client caching', () => { + const sessionId = 'sessionId'; + const basicReq = { + params: { + test: 1, + }, + }; + + const basicCompleteResponse = [ + { + time: 10, + value: { + isPartial: false, + isRunning: false, + id: 1, + rawResponse: { + took: 1, + }, + }, + }, + ]; + + const partialCompleteResponse = [ + { + time: 10, + value: { + isPartial: true, + isRunning: true, + id: 1, + rawResponse: { + took: 1, + }, + }, + }, + { + time: 20, + value: { + isPartial: false, + isRunning: false, + id: 1, + rawResponse: { + took: 1, + }, + }, + }, + ]; + + beforeEach(() => { + sessionService.isCurrentSession.mockImplementation((_sessionId) => _sessionId === sessionId); + sessionService.getSessionId.mockImplementation(() => sessionId); + }); + + test('should be disabled if there is no session', async () => { + mockFetchImplementation(basicCompleteResponse); + + searchInterceptor.search(basicReq, {}).subscribe({ next, error, complete }); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(basicReq, {}).subscribe({ next, error, complete }); + expect(fetchMock).toBeCalledTimes(2); + }); + + test('should fetch different requests in a single session', async () => { + mockFetchImplementation(basicCompleteResponse); + + const req2 = { + params: { + test: 2, + }, + }; + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(req2, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(2); + }); + + test('should fetch the same request for two different sessions', async () => { + mockFetchImplementation(basicCompleteResponse); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor + .search(basicReq, { sessionId: 'anotherSession' }) + .subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(2); + }); + + test('should track searches that come from cache', async () => { + mockFetchImplementation(partialCompleteResponse); + sessionService.isCurrentSession.mockImplementation((_sessionId) => _sessionId === sessionId); + sessionService.getSessionId.mockImplementation(() => sessionId); + + const untrack = jest.fn(); + sessionService.trackSearch.mockImplementation(() => untrack); + + const req = { + params: { + test: 200, + }, + }; + + const response = searchInterceptor.search(req, { pollInterval: 1, sessionId }); + const response2 = searchInterceptor.search(req, { pollInterval: 1, sessionId }); + response.subscribe({ next, error, complete }); + response2.subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + expect(sessionService.trackSearch).toBeCalledTimes(2); + expect(untrack).not.toBeCalled(); + await timeTravel(300); + // Should be called only 2 times (once per partial response) + expect(fetchMock).toBeCalledTimes(2); + expect(sessionService.trackSearch).toBeCalledTimes(2); + expect(untrack).toBeCalledTimes(2); + + expect(next).toBeCalledTimes(4); + expect(error).toBeCalledTimes(0); + expect(complete).toBeCalledTimes(2); + }); + + test('should cache partial responses', async () => { + const responses = [ + { + time: 10, + value: { + isPartial: true, + isRunning: true, + id: 1, + }, + }, + ]; + + mockFetchImplementation(responses); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + }); + + test('should not cache error responses', async () => { + const responses = [ + { + time: 10, + value: { + isPartial: true, + isRunning: false, + id: 1, + }, + }, + ]; + + mockFetchImplementation(responses); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(2); + }); + + test('should deliver error to all replays', async () => { + const responses = [ + { + time: 10, + value: { + isPartial: true, + isRunning: false, + id: 1, + }, + }, + ]; + + mockFetchImplementation(responses); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + expect(error).toBeCalledTimes(2); + expect(error.mock.calls[0][0].message).toEqual('Received partial response'); + expect(error.mock.calls[1][0].message).toEqual('Received partial response'); + }); + + test('should ignore anything outside params when hashing', async () => { + mockFetchImplementation(basicCompleteResponse); + + const req = { + something: 123, + params: { + test: 1, + }, + }; + + const req2 = { + something: 321, + params: { + test: 1, + }, + }; + + searchInterceptor.search(req, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(req2, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + }); + + test('should ignore preference when hashing', async () => { + mockFetchImplementation(basicCompleteResponse); + + const req = { + params: { + test: 1, + preference: 123, + }, + }; + + const req2 = { + params: { + test: 1, + preference: 321, + }, + }; + + searchInterceptor.search(req, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(req2, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + }); + + test('should return from cache for identical requests in the same session', async () => { + mockFetchImplementation(basicCompleteResponse); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + }); + + test('aborting a search that didnt get any response should retrigger search', async () => { + mockFetchImplementation(basicCompleteResponse); + + const abortController = new AbortController(); + + // Start a search request + searchInterceptor + .search(basicReq, { sessionId, abortSignal: abortController.signal }) + .subscribe({ next, error, complete }); + + // Abort the search request before it started + abortController.abort(); + + // Time travel to make sure nothing appens + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(0); + expect(next).toBeCalledTimes(0); + expect(error).toBeCalledTimes(1); + expect(complete).toBeCalledTimes(0); + + const error2 = jest.fn(); + const next2 = jest.fn(); + const complete2 = jest.fn(); + + // Search for the same thing again + searchInterceptor + .search(basicReq, { sessionId }) + .subscribe({ next: next2, error: error2, complete: complete2 }); + + // Should search again + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + expect(next2).toBeCalledTimes(1); + expect(error2).toBeCalledTimes(0); + expect(complete2).toBeCalledTimes(1); + }); + + test('aborting a running first search shouldnt clear cache', async () => { + mockFetchImplementation(partialCompleteResponse); + sessionService.isCurrentSession.mockImplementation((_sessionId) => _sessionId === sessionId); + sessionService.getSessionId.mockImplementation(() => sessionId); + + const untrack = jest.fn(); + sessionService.trackSearch.mockImplementation(() => untrack); + + const req = { + params: { + test: 200, + }, + }; + + const abortController = new AbortController(); + + const response = searchInterceptor.search(req, { + pollInterval: 1, + sessionId, + abortSignal: abortController.signal, + }); + response.subscribe({ next, error, complete }); + await timeTravel(10); + + expect(fetchMock).toBeCalledTimes(1); + expect(next).toBeCalledTimes(1); + expect(error).toBeCalledTimes(0); + expect(complete).toBeCalledTimes(0); + expect(sessionService.trackSearch).toBeCalledTimes(1); + expect(untrack).not.toBeCalled(); + + const next2 = jest.fn(); + const error2 = jest.fn(); + const complete2 = jest.fn(); + const response2 = searchInterceptor.search(req, { pollInterval: 1, sessionId }); + response2.subscribe({ next: next2, error: error2, complete: complete2 }); + await timeTravel(0); + + abortController.abort(); + + await timeTravel(300); + // Both searches should be tracked and untracked + expect(sessionService.trackSearch).toBeCalledTimes(2); + expect(untrack).toBeCalledTimes(2); + + // First search should error + expect(next).toBeCalledTimes(1); + expect(error).toBeCalledTimes(1); + expect(complete).toBeCalledTimes(0); + + // Second search should complete + expect(next2).toBeCalledTimes(2); + expect(error2).toBeCalledTimes(0); + expect(complete2).toBeCalledTimes(1); + + // Should be called only 2 times (once per partial response) + expect(fetchMock).toBeCalledTimes(2); + }); + + test('aborting a running second search shouldnt clear cache', async () => { + mockFetchImplementation(partialCompleteResponse); + sessionService.isCurrentSession.mockImplementation((_sessionId) => _sessionId === sessionId); + sessionService.getSessionId.mockImplementation(() => sessionId); + + const untrack = jest.fn(); + sessionService.trackSearch.mockImplementation(() => untrack); + + const req = { + params: { + test: 200, + }, + }; + + const abortController = new AbortController(); + + const response = searchInterceptor.search(req, { pollInterval: 1, sessionId }); + response.subscribe({ next, error, complete }); + await timeTravel(10); + + expect(fetchMock).toBeCalledTimes(1); + expect(next).toBeCalledTimes(1); + expect(error).toBeCalledTimes(0); + expect(complete).toBeCalledTimes(0); + expect(sessionService.trackSearch).toBeCalledTimes(1); + expect(untrack).not.toBeCalled(); + + const next2 = jest.fn(); + const error2 = jest.fn(); + const complete2 = jest.fn(); + const response2 = searchInterceptor.search(req, { + pollInterval: 0, + sessionId, + abortSignal: abortController.signal, + }); + response2.subscribe({ next: next2, error: error2, complete: complete2 }); + await timeTravel(0); + + abortController.abort(); + + await timeTravel(300); + expect(sessionService.trackSearch).toBeCalledTimes(2); + expect(untrack).toBeCalledTimes(2); + + expect(next).toBeCalledTimes(2); + expect(error).toBeCalledTimes(0); + expect(complete).toBeCalledTimes(1); + + expect(next2).toBeCalledTimes(1); + expect(error2).toBeCalledTimes(1); + expect(complete2).toBeCalledTimes(0); + + // Should be called only 2 times (once per partial response) + expect(fetchMock).toBeCalledTimes(2); + }); + + test('aborting both requests should cancel underlaying search only once', async () => { + mockFetchImplementation(partialCompleteResponse); + sessionService.isCurrentSession.mockImplementation((_sessionId) => _sessionId === sessionId); + sessionService.getSessionId.mockImplementation(() => sessionId); + sessionService.trackSearch.mockImplementation(() => jest.fn()); + + const req = { + params: { + test: 200, + }, + }; + + const abortController = new AbortController(); + + const response = searchInterceptor.search(req, { + pollInterval: 1, + sessionId, + abortSignal: abortController.signal, + }); + response.subscribe({ next, error, complete }); + + const response2 = searchInterceptor.search(req, { + pollInterval: 1, + sessionId, + abortSignal: abortController.signal, + }); + response2.subscribe({ next, error, complete }); + await timeTravel(10); + + abortController.abort(); + + await timeTravel(300); + + expect(mockCoreSetup.http.delete).toHaveBeenCalledTimes(1); + }); + + test('aborting both searches should stop searching and clear cache', async () => { + mockFetchImplementation(partialCompleteResponse); + sessionService.isCurrentSession.mockImplementation((_sessionId) => _sessionId === sessionId); + sessionService.getSessionId.mockImplementation(() => sessionId); + + const untrack = jest.fn(); + sessionService.trackSearch.mockImplementation(() => untrack); + + const req = { + params: { + test: 200, + }, + }; + + const abortController = new AbortController(); + + const response = searchInterceptor.search(req, { + pollInterval: 1, + sessionId, + abortSignal: abortController.signal, + }); + response.subscribe({ next, error, complete }); + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + const response2 = searchInterceptor.search(req, { + pollInterval: 1, + sessionId, + abortSignal: abortController.signal, + }); + response2.subscribe({ next, error, complete }); + await timeTravel(0); + expect(fetchMock).toBeCalledTimes(1); + + abortController.abort(); + + await timeTravel(300); + + expect(next).toBeCalledTimes(2); + expect(error).toBeCalledTimes(2); + expect(complete).toBeCalledTimes(0); + expect(error.mock.calls[0][0]).toBeInstanceOf(AbortError); + expect(error.mock.calls[1][0]).toBeInstanceOf(AbortError); + + // Should be called only 1 times (one partial response) + expect(fetchMock).toBeCalledTimes(1); + + // Clear mock and research + fetchMock.mockReset(); + mockFetchImplementation(partialCompleteResponse); + // Run the search again to see that we don't hit the cache + const response3 = searchInterceptor.search(req, { pollInterval: 1, sessionId }); + response3.subscribe({ next, error, complete }); + + await timeTravel(10); + await timeTravel(10); + await timeTravel(300); + + // Should be called 2 times (two partial response) + expect(fetchMock).toBeCalledTimes(2); + expect(complete).toBeCalledTimes(1); + }); + + test('aborting a completed search shouldnt effect cache', async () => { + mockFetchImplementation(basicCompleteResponse); + + const abortController = new AbortController(); + + // Start a search request + searchInterceptor + .search(basicReq, { sessionId, abortSignal: abortController.signal }) + .subscribe({ next, error, complete }); + + // Get a final response + await timeTravel(10); + expect(fetchMock).toBeCalledTimes(1); + + // Abort the search request + abortController.abort(); + + // Search for the same thing again + searchInterceptor.search(basicReq, { sessionId }).subscribe({ next, error, complete }); + + // Get the response from cache + expect(fetchMock).toBeCalledTimes(1); + }); + }); }); diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts index b9d8553d3dc5a..3e7564933a0c6 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts @@ -6,8 +6,19 @@ */ import { once } from 'lodash'; -import { throwError, Subscription } from 'rxjs'; -import { tap, finalize, catchError, filter, take, skip } from 'rxjs/operators'; +import { throwError, Subscription, from, of, fromEvent, EMPTY } from 'rxjs'; +import { + tap, + finalize, + catchError, + filter, + take, + skip, + switchMap, + shareReplay, + map, + takeUntil, +} from 'rxjs/operators'; import { TimeoutErrorMode, SearchInterceptor, @@ -16,12 +27,21 @@ import { IKibanaSearchRequest, SearchSessionState, } from '../../../../../src/plugins/data/public'; +import { AbortError } from '../../../../../src/plugins/kibana_utils/public'; import { ENHANCED_ES_SEARCH_STRATEGY, IAsyncSearchOptions, pollSearch } from '../../common'; +import { SearchResponseCache } from './search_response_cache'; +import { createRequestHash } from './utils'; import { SearchAbortController } from './search_abort_controller'; +const MAX_CACHE_ITEMS = 50; +const MAX_CACHE_SIZE_MB = 10; export class EnhancedSearchInterceptor extends SearchInterceptor { private uiSettingsSub: Subscription; private searchTimeout: number; + private readonly responseCache: SearchResponseCache = new SearchResponseCache( + MAX_CACHE_ITEMS, + MAX_CACHE_SIZE_MB + ); /** * @internal @@ -38,6 +58,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { } public stop() { + this.responseCache.clear(); this.uiSettingsSub.unsubscribe(); } @@ -47,19 +68,31 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { : TimeoutErrorMode.CONTACT; } - public search({ id, ...request }: IKibanaSearchRequest, options: IAsyncSearchOptions = {}) { - const searchOptions = { - strategy: ENHANCED_ES_SEARCH_STRATEGY, - ...options, + private createRequestHash$(request: IKibanaSearchRequest, options: IAsyncSearchOptions) { + const { sessionId, isRestore } = options; + // Preference is used to ensure all queries go to the same set of shards and it doesn't need to be hashed + // https://www.elastic.co/guide/en/elasticsearch/reference/current/search-shard-routing.html#shard-and-node-preference + const { preference, ...params } = request.params || {}; + const hashOptions = { + ...params, + sessionId, + isRestore, }; - const { sessionId, strategy, abortSignal } = searchOptions; - const search = () => this.runSearch({ id, ...request }, searchOptions); - const searchAbortController = new SearchAbortController(abortSignal, this.searchTimeout); - this.pendingCount$.next(this.pendingCount$.getValue() + 1); - const untrackSearch = this.deps.session.isCurrentSession(options.sessionId) - ? this.deps.session.trackSearch({ abort: () => searchAbortController.abort() }) - : undefined; + return from(sessionId ? createRequestHash(hashOptions) : of(undefined)); + } + + /** + * @internal + * Creates a new pollSearch that share replays its results + */ + private runSearch$( + { id, ...request }: IKibanaSearchRequest, + options: IAsyncSearchOptions, + searchAbortController: SearchAbortController + ) { + const search = () => this.runSearch({ id, ...request }, options); + const { sessionId, strategy } = options; // track if this search's session will be send to background // if yes, then we don't need to cancel this search when it is aborted @@ -91,18 +124,97 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { tap((response) => (id = response.id)), catchError((e: Error) => { cancel(); - return throwError(this.handleSearchError(e, options, searchAbortController.isTimeout())); + return throwError(e); }), finalize(() => { - this.pendingCount$.next(this.pendingCount$.getValue() - 1); searchAbortController.cleanup(); - if (untrackSearch && this.deps.session.isCurrentSession(options.sessionId)) { - // untrack if this search still belongs to current session - untrackSearch(); - } if (savedToBackgroundSub) { savedToBackgroundSub.unsubscribe(); } + }), + // This observable is cached in the responseCache. + // Using shareReplay makes sure that future subscribers will get the final response + + shareReplay(1) + ); + } + + /** + * @internal + * Creates a new search observable and a corresponding search abort controller + * If requestHash is defined, tries to return them first from cache. + */ + private getSearchResponse$( + request: IKibanaSearchRequest, + options: IAsyncSearchOptions, + requestHash?: string + ) { + const cached = requestHash ? this.responseCache.get(requestHash) : undefined; + + const searchAbortController = + cached?.searchAbortController || new SearchAbortController(this.searchTimeout); + + // Create a new abort signal if one was not passed. This fake signal will never be aborted, + // So the underlaying search will not be aborted, even if the other consumers abort. + searchAbortController.addAbortSignal(options.abortSignal ?? new AbortController().signal); + const response$ = cached?.response$ || this.runSearch$(request, options, searchAbortController); + + if (requestHash && !this.responseCache.has(requestHash)) { + this.responseCache.set(requestHash, { + response$, + searchAbortController, + }); + } + + return { + response$, + searchAbortController, + }; + } + + public search({ id, ...request }: IKibanaSearchRequest, options: IAsyncSearchOptions = {}) { + const searchOptions = { + strategy: ENHANCED_ES_SEARCH_STRATEGY, + ...options, + }; + const { sessionId, abortSignal } = searchOptions; + + return this.createRequestHash$(request, searchOptions).pipe( + switchMap((requestHash) => { + const { searchAbortController, response$ } = this.getSearchResponse$( + request, + searchOptions, + requestHash + ); + + this.pendingCount$.next(this.pendingCount$.getValue() + 1); + const untrackSearch = this.deps.session.isCurrentSession(sessionId) + ? this.deps.session.trackSearch({ abort: () => searchAbortController.abort() }) + : undefined; + + // Abort the replay if the abortSignal is aborted. + // The underlaying search will not abort unless searchAbortController fires. + const aborted$ = (abortSignal ? fromEvent(abortSignal, 'abort') : EMPTY).pipe( + map(() => { + throw new AbortError(); + }) + ); + + return response$.pipe( + takeUntil(aborted$), + catchError((e) => { + return throwError( + this.handleSearchError(e, searchOptions, searchAbortController.isTimeout()) + ); + }), + finalize(() => { + this.pendingCount$.next(this.pendingCount$.getValue() - 1); + if (untrackSearch && this.deps.session.isCurrentSession(sessionId)) { + // untrack if this search still belongs to current session + untrackSearch(); + } + }) + ); }) ); } diff --git a/x-pack/plugins/data_enhanced/public/search/search_response_cache.test.ts b/x-pack/plugins/data_enhanced/public/search/search_response_cache.test.ts new file mode 100644 index 0000000000000..e985de5e23f7d --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/search/search_response_cache.test.ts @@ -0,0 +1,318 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { interval, Observable, of, throwError } from 'rxjs'; +import { shareReplay, switchMap, take } from 'rxjs/operators'; +import { IKibanaSearchResponse } from 'src/plugins/data/public'; +import { SearchAbortController } from './search_abort_controller'; +import { SearchResponseCache } from './search_response_cache'; + +describe('SearchResponseCache', () => { + let cache: SearchResponseCache; + let searchAbortController: SearchAbortController; + const r: Array> = [ + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 1, + }, + }, + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 2, + }, + }, + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 3, + }, + }, + { + isPartial: false, + isRunning: false, + rawResponse: { + t: 4, + }, + }, + ]; + + function getSearchObservable$(responses: Array> = r) { + return interval(100).pipe( + take(responses.length), + switchMap((value: number, i: number) => { + if (responses[i].rawResponse.throw === true) { + return throwError('nooo'); + } else { + return of(responses[i]); + } + }), + shareReplay(1) + ); + } + + function wrapWithAbortController(response$: Observable>) { + return { + response$, + searchAbortController, + }; + } + + beforeEach(() => { + cache = new SearchResponseCache(3, 0.1); + searchAbortController = new SearchAbortController(); + }); + + describe('Cache eviction', () => { + test('clear evicts all', () => { + const finalResult = r[r.length - 1]; + cache.set('123', wrapWithAbortController(of(finalResult))); + cache.set('234', wrapWithAbortController(of(finalResult))); + + cache.clear(); + + expect(cache.get('123')).toBeUndefined(); + expect(cache.get('234')).toBeUndefined(); + }); + + test('evicts searches that threw an exception', async () => { + const res$ = getSearchObservable$(); + const err$ = getSearchObservable$([ + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 'a'.repeat(1000), + }, + }, + { + isPartial: true, + isRunning: true, + rawResponse: { + throw: true, + }, + }, + ]); + cache.set('123', wrapWithAbortController(err$)); + cache.set('234', wrapWithAbortController(res$)); + + const errHandler = jest.fn(); + await err$.toPromise().catch(errHandler); + await res$.toPromise().catch(errHandler); + + expect(errHandler).toBeCalledTimes(1); + expect(cache.get('123')).toBeUndefined(); + expect(cache.get('234')).not.toBeUndefined(); + }); + + test('evicts searches that returned an error response', async () => { + const err$ = getSearchObservable$([ + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 1, + }, + }, + { + isPartial: true, + isRunning: false, + rawResponse: { + t: 2, + }, + }, + ]); + cache.set('123', wrapWithAbortController(err$)); + + const errHandler = jest.fn(); + await err$.toPromise().catch(errHandler); + + expect(errHandler).toBeCalledTimes(0); + expect(cache.get('123')).toBeUndefined(); + }); + + test('evicts oldest item if has too many cached items', async () => { + const finalResult = r[r.length - 1]; + cache.set('123', wrapWithAbortController(of(finalResult))); + cache.set('234', wrapWithAbortController(of(finalResult))); + cache.set('345', wrapWithAbortController(of(finalResult))); + cache.set('456', wrapWithAbortController(of(finalResult))); + + expect(cache.get('123')).toBeUndefined(); + expect(cache.get('234')).not.toBeUndefined(); + expect(cache.get('345')).not.toBeUndefined(); + expect(cache.get('456')).not.toBeUndefined(); + }); + + test('evicts oldest item if cache gets bigger than max size', async () => { + const largeResult$ = getSearchObservable$([ + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 'a'.repeat(1000), + }, + }, + { + isPartial: false, + isRunning: false, + rawResponse: { + t: 'a'.repeat(50000), + }, + }, + ]); + + cache.set('123', wrapWithAbortController(largeResult$)); + cache.set('234', wrapWithAbortController(largeResult$)); + cache.set('345', wrapWithAbortController(largeResult$)); + + await largeResult$.toPromise(); + + expect(cache.get('123')).toBeUndefined(); + expect(cache.get('234')).not.toBeUndefined(); + expect(cache.get('345')).not.toBeUndefined(); + }); + + test('evicts from cache any single item that gets bigger than max size', async () => { + const largeResult$ = getSearchObservable$([ + { + isPartial: true, + isRunning: true, + rawResponse: { + t: 'a'.repeat(500), + }, + }, + { + isPartial: false, + isRunning: false, + rawResponse: { + t: 'a'.repeat(500000), + }, + }, + ]); + + cache.set('234', wrapWithAbortController(largeResult$)); + await largeResult$.toPromise(); + expect(cache.get('234')).toBeUndefined(); + }); + + test('get updates the insertion time of an item', async () => { + const finalResult = r[r.length - 1]; + cache.set('123', wrapWithAbortController(of(finalResult))); + cache.set('234', wrapWithAbortController(of(finalResult))); + cache.set('345', wrapWithAbortController(of(finalResult))); + + cache.get('123'); + cache.get('234'); + + cache.set('456', wrapWithAbortController(of(finalResult))); + + expect(cache.get('123')).not.toBeUndefined(); + expect(cache.get('234')).not.toBeUndefined(); + expect(cache.get('345')).toBeUndefined(); + expect(cache.get('456')).not.toBeUndefined(); + }); + }); + + describe('Observable behavior', () => { + test('caches a response and re-emits it', async () => { + const s$ = getSearchObservable$(); + cache.set('123', wrapWithAbortController(s$)); + const finalRes = await cache.get('123')!.response$.toPromise(); + expect(finalRes).toStrictEqual(r[r.length - 1]); + }); + + test('cached$ should emit same as original search$', async () => { + const s$ = getSearchObservable$(); + cache.set('123', wrapWithAbortController(s$)); + + const next = jest.fn(); + const cached$ = cache.get('123'); + + cached$!.response$.subscribe({ + next, + }); + + // wait for original search to complete + await s$!.toPromise(); + + // get final response from cached$ + const finalRes = await cached$!.response$.toPromise(); + expect(finalRes).toStrictEqual(r[r.length - 1]); + expect(next).toHaveBeenCalledTimes(4); + }); + + test('cached$ should emit only current value and keep emitting if subscribed while search$ is running', async () => { + const s$ = getSearchObservable$(); + cache.set('123', wrapWithAbortController(s$)); + + const next = jest.fn(); + let cached$: Observable> | undefined; + s$.subscribe({ + next: (res) => { + if (res.rawResponse.t === 3) { + cached$ = cache.get('123')!.response$; + cached$!.subscribe({ + next, + }); + } + }, + }); + + // wait for original search to complete + await s$!.toPromise(); + + const finalRes = await cached$!.toPromise(); + + expect(finalRes).toStrictEqual(r[r.length - 1]); + expect(next).toHaveBeenCalledTimes(2); + }); + + test('cached$ should emit only last value if subscribed after search$ was complete 1', async () => { + const finalResult = r[r.length - 1]; + const s$ = wrapWithAbortController(of(finalResult)); + cache.set('123', s$); + + // wait for original search to complete + await s$!.response$.toPromise(); + + const next = jest.fn(); + const cached$ = cache.get('123'); + cached$!.response$.subscribe({ + next, + }); + + const finalRes = await cached$!.response$.toPromise(); + + expect(finalRes).toStrictEqual(r[r.length - 1]); + expect(next).toHaveBeenCalledTimes(1); + }); + + test('cached$ should emit only last value if subscribed after search$ was complete', async () => { + const s$ = getSearchObservable$(); + cache.set('123', wrapWithAbortController(s$)); + + // wait for original search to complete + await s$!.toPromise(); + + const next = jest.fn(); + const cached$ = cache.get('123'); + cached$!.response$.subscribe({ + next, + }); + + const finalRes = await cached$!.response$.toPromise(); + + expect(finalRes).toStrictEqual(r[r.length - 1]); + expect(next).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/x-pack/plugins/data_enhanced/public/search/search_response_cache.ts b/x-pack/plugins/data_enhanced/public/search/search_response_cache.ts new file mode 100644 index 0000000000000..1467e5bf234ff --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/search/search_response_cache.ts @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Observable, Subscription } from 'rxjs'; +import { IKibanaSearchResponse, isErrorResponse } from '../../../../../src/plugins/data/public'; +import { SearchAbortController } from './search_abort_controller'; + +interface ResponseCacheItem { + response$: Observable>; + searchAbortController: SearchAbortController; +} + +interface ResponseCacheItemInternal { + response$: Observable>; + searchAbortController: SearchAbortController; + size: number; + subs: Subscription; +} + +export class SearchResponseCache { + private responseCache: Map; + private cacheSize = 0; + + constructor(private maxItems: number, private maxCacheSizeMB: number) { + this.responseCache = new Map(); + } + + private byteToMb(size: number) { + return size / (1024 * 1024); + } + + private deleteItem(key: string, clearSubs = true) { + const item = this.responseCache.get(key); + if (item) { + if (clearSubs) { + item.subs.unsubscribe(); + } + this.cacheSize -= item.size; + this.responseCache.delete(key); + } + } + + private setItem(key: string, item: ResponseCacheItemInternal) { + // The deletion of the key will move it to the end of the Map's entries. + this.deleteItem(key, false); + this.cacheSize += item.size; + this.responseCache.set(key, item); + } + + public clear() { + this.cacheSize = 0; + this.responseCache.forEach((item) => { + item.subs.unsubscribe(); + }); + this.responseCache.clear(); + } + + private shrink() { + while ( + this.responseCache.size > this.maxItems || + this.byteToMb(this.cacheSize) > this.maxCacheSizeMB + ) { + const [key] = [...this.responseCache.keys()]; + this.deleteItem(key); + } + } + + public has(key: string) { + return this.responseCache.has(key); + } + + /** + * + * @param key key to cache + * @param response$ + * @returns A ReplaySubject that mimics the behavior of the original observable + * @throws error if key already exists + */ + public set(key: string, item: ResponseCacheItem) { + if (this.responseCache.has(key)) { + throw new Error('duplicate key'); + } + + const { response$, searchAbortController } = item; + + const cacheItem: ResponseCacheItemInternal = { + response$, + searchAbortController, + subs: new Subscription(), + size: 0, + }; + + this.setItem(key, cacheItem); + + cacheItem.subs.add( + response$.subscribe({ + next: (r) => { + // TODO: avoid stringiying. Get the size some other way! + const newSize = new Blob([JSON.stringify(r)]).size; + if (this.byteToMb(newSize) < this.maxCacheSizeMB && !isErrorResponse(r)) { + this.setItem(key, { + ...cacheItem, + size: newSize, + }); + this.shrink(); + } else { + // Single item is too large to be cached, or an error response returned. + // Evict and ignore. + this.deleteItem(key); + } + }, + error: (e) => { + // Evict item on error + this.deleteItem(key); + }, + }) + ); + this.shrink(); + } + + public get(key: string): ResponseCacheItem | undefined { + const item = this.responseCache.get(key); + if (item) { + // touch the item, and move it to the end of the map's entries + this.setItem(key, item); + return { + response$: item.response$, + searchAbortController: item.searchAbortController, + }; + } + } +} diff --git a/x-pack/plugins/data_enhanced/public/search/utils.ts b/x-pack/plugins/data_enhanced/public/search/utils.ts new file mode 100644 index 0000000000000..c6c648dbb5488 --- /dev/null +++ b/x-pack/plugins/data_enhanced/public/search/utils.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import stringify from 'json-stable-stringify'; + +export async function createRequestHash(keys: Record) { + const msgBuffer = new TextEncoder().encode(stringify(keys)); + const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + return hashArray.map((b) => ('00' + b.toString(16)).slice(-2)).join(''); +} diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index 39163101fc7bd..8caa1737c00ad 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -82,6 +82,8 @@ export function App({ dashboardFeatureFlag, } = useKibana().services; + const startSession = useCallback(() => data.search.session.start(), [data]); + const [state, setState] = useState(() => { return { query: data.query.queryString.getQuery(), @@ -96,7 +98,7 @@ export function App({ isSaveModalVisible: false, indicateNoData: false, isSaveable: false, - searchSessionId: data.search.session.start(), + searchSessionId: startSession(), }; }); @@ -178,7 +180,7 @@ export function App({ setState((s) => ({ ...s, filters: data.query.filterManager.getFilters(), - searchSessionId: data.search.session.start(), + searchSessionId: startSession(), })); trackUiEvent('app_filters_updated'); }, @@ -188,7 +190,7 @@ export function App({ next: () => { setState((s) => ({ ...s, - searchSessionId: data.search.session.start(), + searchSessionId: startSession(), })); }, }); @@ -199,7 +201,7 @@ export function App({ tap(() => { setState((s) => ({ ...s, - searchSessionId: data.search.session.start(), + searchSessionId: startSession(), })); }), switchMap((done) => @@ -234,6 +236,7 @@ export function App({ data.query, history, initialContext, + startSession, ]); useEffect(() => { @@ -652,7 +655,7 @@ export function App({ // Time change will be picked up by the time subscription setState((s) => ({ ...s, - searchSessionId: data.search.session.start(), + searchSessionId: startSession(), })); trackUiEvent('app_query_change'); } diff --git a/x-pack/test/examples/search_examples/index.ts b/x-pack/test/examples/search_examples/index.ts index 2cac0d1b60de7..13eac7566525e 100644 --- a/x-pack/test/examples/search_examples/index.ts +++ b/x-pack/test/examples/search_examples/index.ts @@ -23,6 +23,7 @@ export default function ({ getService, loadTestFile }: PluginFunctionalProviderC await esArchiver.unload('lens/basic'); }); + loadTestFile(require.resolve('./search_sessions_cache')); loadTestFile(require.resolve('./search_session_example')); }); } diff --git a/x-pack/test/examples/search_examples/search_sessions_cache.ts b/x-pack/test/examples/search_examples/search_sessions_cache.ts new file mode 100644 index 0000000000000..57b2d1665d901 --- /dev/null +++ b/x-pack/test/examples/search_examples/search_sessions_cache.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../functional/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common']); + const toasts = getService('toasts'); + const retry = getService('retry'); + + async function getExecutedAt() { + const toast = await toasts.getToastElement(1); + const timeElem = await testSubjects.findDescendant('requestExecutedAt', toast); + const text = await timeElem.getVisibleText(); + await toasts.dismissAllToasts(); + await retry.waitFor('toasts gone', async () => { + return (await toasts.getToastCount()) === 0; + }); + return text; + } + + describe.skip('Search session client side cache', () => { + const appId = 'searchExamples'; + + before(async function () { + await PageObjects.common.navigateToApp(appId, { insertTimestamp: false }); + }); + + it('should cache responses by search session id', async () => { + await testSubjects.click('searchExamplesCacheSearch'); + const noSessionExecutedAt = await getExecutedAt(); + + // Expect searches executed in a session to share a response + await testSubjects.click('searchExamplesStartSession'); + await testSubjects.click('searchExamplesCacheSearch'); + const withSessionExecutedAt = await getExecutedAt(); + await testSubjects.click('searchExamplesCacheSearch'); + const withSessionExecutedAt2 = await getExecutedAt(); + expect(withSessionExecutedAt2).to.equal(withSessionExecutedAt); + expect(withSessionExecutedAt).not.to.equal(noSessionExecutedAt); + + // Expect new session to run search again + await testSubjects.click('searchExamplesStartSession'); + await testSubjects.click('searchExamplesCacheSearch'); + const secondSessionExecutedAt = await getExecutedAt(); + expect(secondSessionExecutedAt).not.to.equal(withSessionExecutedAt); + + // Clear session + await testSubjects.click('searchExamplesClearSession'); + await testSubjects.click('searchExamplesCacheSearch'); + const afterClearSession1 = await getExecutedAt(); + await testSubjects.click('searchExamplesCacheSearch'); + const afterClearSession2 = await getExecutedAt(); + expect(secondSessionExecutedAt).not.to.equal(afterClearSession1); + expect(afterClearSession2).not.to.equal(afterClearSession1); + }); + }); +} From 6c7d776fc103a305433ef0bca019aaf7882fb4c6 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Fri, 16 Apr 2021 19:55:16 +0200 Subject: [PATCH 04/82] minimize number of so fild asserted in tests. it creates flakines when implementation details change (#97374) --- .../apis/saved_objects/find.ts | 165 +++--------------- .../apis/saved_objects_management/find.ts | 41 +---- .../saved_objects_management/find.ts | 40 ++--- 3 files changed, 36 insertions(+), 210 deletions(-) diff --git a/test/api_integration/apis/saved_objects/find.ts b/test/api_integration/apis/saved_objects/find.ts index a01562861e606..a4862707e2d0e 100644 --- a/test/api_integration/apis/saved_objects/find.ts +++ b/test/api_integration/apis/saved_objects/find.ts @@ -9,7 +9,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; import { SavedObject } from '../../../../src/core/server'; -import { getKibanaVersion } from './lib/saved_objects_test_utils'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -17,12 +16,6 @@ export default function ({ getService }: FtrProviderContext) { const esDeleteAllIndices = getService('esDeleteAllIndices'); describe('find', () => { - let KIBANA_VERSION: string; - - before(async () => { - KIBANA_VERSION = await getKibanaVersion(getService); - }); - describe('with kibana index', () => { before(() => esArchiver.load('saved_objects/basic')); after(() => esArchiver.unload('saved_objects/basic')); @@ -32,33 +25,9 @@ export default function ({ getService }: FtrProviderContext) { .get('/api/saved_objects/_find?type=visualization&fields=title') .expect(200) .then((resp) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 1, - saved_objects: [ - { - type: 'visualization', - id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', - version: 'WzE4LDJd', - attributes: { - title: 'Count of requests', - }, - score: 0, - migrationVersion: resp.body.saved_objects[0].migrationVersion, - coreMigrationVersion: KIBANA_VERSION, - namespaces: ['default'], - references: [ - { - id: '91200a00-9efd-11e7-acb3-3dab96693fab', - name: 'kibanaSavedObjectMeta.searchSourceJSON.index', - type: 'index-pattern', - }, - ], - updated_at: '2017-09-21T18:51:23.794Z', - }, - ], - }); + expect(resp.body.saved_objects.map((so: { id: string }) => so.id)).to.eql([ + 'dd7caf20-9efd-11e7-acb3-3dab96693fab', + ]); expect(resp.body.saved_objects[0].migrationVersion).to.be.ok(); })); @@ -129,33 +98,12 @@ export default function ({ getService }: FtrProviderContext) { .get('/api/saved_objects/_find?type=visualization&fields=title&namespaces=default') .expect(200) .then((resp) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 1, - saved_objects: [ - { - type: 'visualization', - id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', - version: 'WzE4LDJd', - attributes: { - title: 'Count of requests', - }, - migrationVersion: resp.body.saved_objects[0].migrationVersion, - coreMigrationVersion: KIBANA_VERSION, - namespaces: ['default'], - score: 0, - references: [ - { - id: '91200a00-9efd-11e7-acb3-3dab96693fab', - name: 'kibanaSavedObjectMeta.searchSourceJSON.index', - type: 'index-pattern', - }, - ], - updated_at: '2017-09-21T18:51:23.794Z', - }, - ], - }); + expect( + resp.body.saved_objects.map((so: { id: string; namespaces: string[] }) => ({ + id: so.id, + namespaces: so.namespaces, + })) + ).to.eql([{ id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', namespaces: ['default'] }]); expect(resp.body.saved_objects[0].migrationVersion).to.be.ok(); })); }); @@ -166,53 +114,15 @@ export default function ({ getService }: FtrProviderContext) { .get('/api/saved_objects/_find?type=visualization&fields=title&namespaces=*') .expect(200) .then((resp) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 2, - saved_objects: [ - { - type: 'visualization', - id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', - version: 'WzE4LDJd', - attributes: { - title: 'Count of requests', - }, - migrationVersion: resp.body.saved_objects[0].migrationVersion, - coreMigrationVersion: KIBANA_VERSION, - namespaces: ['default'], - score: 0, - references: [ - { - id: '91200a00-9efd-11e7-acb3-3dab96693fab', - name: 'kibanaSavedObjectMeta.searchSourceJSON.index', - type: 'index-pattern', - }, - ], - updated_at: '2017-09-21T18:51:23.794Z', - }, - { - attributes: { - title: 'Count of requests', - }, - id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', - migrationVersion: resp.body.saved_objects[0].migrationVersion, - coreMigrationVersion: KIBANA_VERSION, - namespaces: ['foo-ns'], - references: [ - { - id: '91200a00-9efd-11e7-acb3-3dab96693fab', - name: 'kibanaSavedObjectMeta.searchSourceJSON.index', - type: 'index-pattern', - }, - ], - score: 0, - type: 'visualization', - updated_at: '2017-09-21T18:51:23.794Z', - version: 'WzIyLDJd', - }, - ], - }); + expect( + resp.body.saved_objects.map((so: { id: string; namespaces: string[] }) => ({ + id: so.id, + namespaces: so.namespaces, + })) + ).to.eql([ + { id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', namespaces: ['default'] }, + { id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', namespaces: ['foo-ns'] }, + ]); })); }); @@ -224,42 +134,9 @@ export default function ({ getService }: FtrProviderContext) { ) .expect(200) .then((resp) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 1, - saved_objects: [ - { - type: 'visualization', - id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', - attributes: { - title: 'Count of requests', - visState: resp.body.saved_objects[0].attributes.visState, - uiStateJSON: '{"spy":{"mode":{"name":null,"fill":false}}}', - description: '', - version: 1, - kibanaSavedObjectMeta: { - searchSourceJSON: - resp.body.saved_objects[0].attributes.kibanaSavedObjectMeta - .searchSourceJSON, - }, - }, - namespaces: ['default'], - score: 0, - references: [ - { - name: 'kibanaSavedObjectMeta.searchSourceJSON.index', - type: 'index-pattern', - id: '91200a00-9efd-11e7-acb3-3dab96693fab', - }, - ], - migrationVersion: resp.body.saved_objects[0].migrationVersion, - coreMigrationVersion: KIBANA_VERSION, - updated_at: '2017-09-21T18:51:23.794Z', - version: 'WzE4LDJd', - }, - ], - }); + expect(resp.body.saved_objects.map((so: { id: string }) => so.id)).to.eql([ + 'dd7caf20-9efd-11e7-acb3-3dab96693fab', + ]); })); it('wrong type should return 400 with Bad Request', async () => diff --git a/test/api_integration/apis/saved_objects_management/find.ts b/test/api_integration/apis/saved_objects_management/find.ts index 6ab2352ebb05f..8fb3884a5b37b 100644 --- a/test/api_integration/apis/saved_objects_management/find.ts +++ b/test/api_integration/apis/saved_objects_management/find.ts @@ -34,44 +34,9 @@ export default function ({ getService }: FtrProviderContext) { .get('/api/kibana/management/saved_objects/_find?type=visualization&fields=title') .expect(200) .then((resp: Response) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 1, - saved_objects: [ - { - type: 'visualization', - id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', - version: 'WzE4LDJd', - attributes: { - title: 'Count of requests', - }, - migrationVersion: resp.body.saved_objects[0].migrationVersion, - coreMigrationVersion: KIBANA_VERSION, - namespaces: ['default'], - references: [ - { - id: '91200a00-9efd-11e7-acb3-3dab96693fab', - name: 'kibanaSavedObjectMeta.searchSourceJSON.index', - type: 'index-pattern', - }, - ], - score: 0, - updated_at: '2017-09-21T18:51:23.794Z', - meta: { - editUrl: - '/management/kibana/objects/savedVisualizations/dd7caf20-9efd-11e7-acb3-3dab96693fab', - icon: 'visualizeApp', - inAppUrl: { - path: '/app/visualize#/edit/dd7caf20-9efd-11e7-acb3-3dab96693fab', - uiCapabilitiesPath: 'visualize.show', - }, - title: 'Count of requests', - namespaceType: 'single', - }, - }, - ], - }); + expect(resp.body.saved_objects.map((so: { id: string }) => so.id)).to.eql([ + 'dd7caf20-9efd-11e7-acb3-3dab96693fab', + ]); })); describe('unknown type', () => { diff --git a/test/plugin_functional/test_suites/saved_objects_management/find.ts b/test/plugin_functional/test_suites/saved_objects_management/find.ts index 5dce8f43339a1..e5a5d69c7e4d4 100644 --- a/test/plugin_functional/test_suites/saved_objects_management/find.ts +++ b/test/plugin_functional/test_suites/saved_objects_management/find.ts @@ -33,28 +33,17 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .set('kbn-xsrf', 'true') .expect(200) .then((resp) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 1, - saved_objects: [ - { - type: 'test-hidden-importable-exportable', - id: 'ff3733a0-9fty-11e7-ahb3-3dcb94193fab', - attributes: { - title: 'Hidden Saved object type that is importable/exportable.', - }, - references: [], - updated_at: '2021-02-11T18:51:23.794Z', - version: 'WzIsMl0=', - namespaces: ['default'], - score: 0, - meta: { - namespaceType: 'single', - }, - }, - ], - }); + expect( + resp.body.saved_objects.map((so: { id: string; type: string }) => ({ + id: so.id, + type: so.type, + })) + ).to.eql([ + { + type: 'test-hidden-importable-exportable', + id: 'ff3733a0-9fty-11e7-ahb3-3dcb94193fab', + }, + ]); })); it('returns empty response for non importableAndExportable types', async () => @@ -65,12 +54,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .set('kbn-xsrf', 'true') .expect(200) .then((resp) => { - expect(resp.body).to.eql({ - page: 1, - per_page: 20, - total: 0, - saved_objects: [], - }); + expect(resp.body.saved_objects).to.eql([]); })); }); }); From 194355fdd3969f567f43ad4b7f63d72dcf7974a9 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Fri, 16 Apr 2021 10:57:29 -0700 Subject: [PATCH 05/82] Skip test to try and stabilize master https://github.com/elastic/kibana/issues/97378 Signed-off-by: Tyler Smalley --- .../apis/security_solution/matrix_dns_histogram.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts b/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts index 69beb65dec670..27a7a5a539607 100644 --- a/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts +++ b/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts @@ -33,7 +33,8 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const retry = getService('retry'); - describe('Matrix DNS Histogram', () => { + // FIX: https://github.com/elastic/kibana/issues/97378 + describe.skip('Matrix DNS Histogram', () => { describe('Large data set', () => { before(() => esArchiver.load('security_solution/matrix_dns_histogram/large_dns_query')); after(() => esArchiver.unload('security_solution/matrix_dns_histogram/large_dns_query')); From 1cbdb26ceacb47f87adc3a83ae516c08f6fa1d0e Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 16 Apr 2021 12:11:12 -0700 Subject: [PATCH 06/82] skip flaky suite (#97355) --- .../api_integration/apis/security_solution/feature_controls.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/security_solution/feature_controls.ts b/x-pack/test/api_integration/apis/security_solution/feature_controls.ts index 1e43fd473a38d..da28e28dae769 100644 --- a/x-pack/test/api_integration/apis/security_solution/feature_controls.ts +++ b/x-pack/test/api_integration/apis/security_solution/feature_controls.ts @@ -58,7 +58,8 @@ export default function ({ getService }: FtrProviderContext) { }; }; - describe('feature controls', () => { + // FLAKY: https://github.com/elastic/kibana/issues/97355 + describe.skip('feature controls', () => { it(`APIs can't be accessed by user with no privileges`, async () => { const username = 'logstash_read'; const roleName = 'logstash_read'; From 721f4b55f506d48cad34fe38afb351dda3367a25 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Fri, 16 Apr 2021 13:52:35 -0600 Subject: [PATCH 07/82] [Security Solutions] Fixes flake with cypress tests (#97329) ## Summary Fixes some recent flakeyness with Cypress tests * Adds cypress.pipe() on button clicks around the area of flakes * Adds an alerting threshold to the utilities so we can wait for when an exact number of alerts are available on a page * Changes the alerts to not run again with 10 seconds, because if a test takes longer than 10 seconds, the rule can run a second time which can invalidate some of the text when running checks when timeline or other components update on their button clicks. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../detection_alerts/attach_to_case.spec.ts | 2 +- .../detection_alerts/closing.spec.ts | 4 ++-- .../detection_alerts/in_progress.spec.ts | 2 +- .../investigate_in_timeline.spec.ts | 2 +- .../detection_alerts/opening.spec.ts | 2 +- .../integration/exceptions/from_alert.spec.ts | 2 +- .../integration/exceptions/from_rule.spec.ts | 2 +- .../security_solution/cypress/objects/rule.ts | 4 ++-- .../security_solution/cypress/tasks/alerts.ts | 20 +++++++++++++++---- .../cypress/tasks/api_calls/rules.ts | 15 +++++++++----- .../cypress/tasks/create_new_rule.ts | 4 ++-- 11 files changed, 38 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts index e63ef513cc638..bdf2ab96600ea 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts @@ -32,7 +32,7 @@ describe('Alerts timeline', () => { waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); refreshPage(); - waitForAlertsToPopulate(); + waitForAlertsToPopulate(500); // Then we login as read-only user to test. login(ROLES.reader); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts index b7c0e1c6fcd6e..741f05129f9c4 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts @@ -39,9 +39,9 @@ describe('Closing alerts', () => { loginAndWaitForPage(DETECTIONS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); - createCustomRuleActivated(newRule); + createCustomRuleActivated(newRule, '1', '100m', 100); refreshPage(); - waitForAlertsToPopulate(); + waitForAlertsToPopulate(100); deleteCustomRule(); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts index 8efdbe82c3492..b4f890e4d8dbf 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts @@ -38,7 +38,7 @@ describe('Marking alerts as in-progress', () => { waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); refreshPage(); - waitForAlertsToPopulate(); + waitForAlertsToPopulate(500); }); it('Mark one alert in progress when more than one open alerts are selected', () => { diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts index bc4929cd1341d..d705cb652d2ea 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts @@ -29,7 +29,7 @@ describe('Alerts timeline', () => { waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); refreshPage(); - waitForAlertsToPopulate(); + waitForAlertsToPopulate(500); }); it('Investigate alert in default timeline', () => { diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts index ec0923beb4c40..bc907dccd0a04 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts @@ -39,7 +39,7 @@ describe('Opening alerts', () => { waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); refreshPage(); - waitForAlertsToPopulate(); + waitForAlertsToPopulate(500); selectNumberOfAlerts(5); cy.get(SELECTED_ALERTS).should('have.text', `Selected 5 alerts`); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts index d5e0b56b8e267..e36809380df86 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts @@ -43,7 +43,7 @@ describe('From alert', () => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); waitForAlertsIndexToBeCreated(); - createCustomRule(newRule); + createCustomRule(newRule, 'rule_testing', '10s'); goToManageAlertsDetectionRules(); goToRuleDetails(); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts index 148254a813b56..e0d7e5a32edfd 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts @@ -41,7 +41,7 @@ describe('From rule', () => { cleanKibana(); loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); waitForAlertsIndexToBeCreated(); - createCustomRule(newRule); + createCustomRule(newRule, 'rule_testing', '10s'); goToManageAlertsDetectionRules(); goToRuleDetails(); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index f083cc5da6f53..099cd39ba2d7b 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -185,7 +185,7 @@ export const existingRule: CustomRule = { name: 'Rule 1', description: 'Description for Rule 1', index: ['auditbeat-*'], - interval: '10s', + interval: '100m', severity: 'High', riskScore: '19', tags: ['rule1'], @@ -332,5 +332,5 @@ export const editedRule = { export const expectedExportedRule = (ruleResponse: Cypress.Response) => { const jsonrule = ruleResponse.body; - return `{"id":"${jsonrule.id}","updated_at":"${jsonrule.updated_at}","updated_by":"elastic","created_at":"${jsonrule.created_at}","created_by":"elastic","name":"${jsonrule.name}","tags":[],"interval":"10s","enabled":false,"description":"${jsonrule.description}","risk_score":${jsonrule.risk_score},"severity":"${jsonrule.severity}","output_index":".siem-signals-default","author":[],"false_positives":[],"from":"now-17520h","rule_id":"rule_testing","max_signals":100,"risk_score_mapping":[],"severity_mapping":[],"threat":[],"to":"now","references":[],"version":1,"exceptions_list":[],"immutable":false,"type":"query","language":"kuery","index":["exceptions-*"],"query":"${jsonrule.query}","throttle":"no_actions","actions":[]}\n{"exported_count":1,"missing_rules":[],"missing_rules_count":0}\n`; + return `{"id":"${jsonrule.id}","updated_at":"${jsonrule.updated_at}","updated_by":"elastic","created_at":"${jsonrule.created_at}","created_by":"elastic","name":"${jsonrule.name}","tags":[],"interval":"100m","enabled":false,"description":"${jsonrule.description}","risk_score":${jsonrule.risk_score},"severity":"${jsonrule.severity}","output_index":".siem-signals-default","author":[],"false_positives":[],"from":"now-17520h","rule_id":"rule_testing","max_signals":100,"risk_score_mapping":[],"severity_mapping":[],"threat":[],"to":"now","references":[],"version":1,"exceptions_list":[],"immutable":false,"type":"query","language":"kuery","index":["exceptions-*"],"query":"${jsonrule.query}","throttle":"no_actions","actions":[]}\n{"exported_count":1,"missing_rules":[],"missing_rules_count":0}\n`; }; diff --git a/x-pack/plugins/security_solution/cypress/tasks/alerts.ts b/x-pack/plugins/security_solution/cypress/tasks/alerts.ts index dd7a163d00753..b677e36ab3918 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/alerts.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/alerts.ts @@ -35,13 +35,25 @@ export const addExceptionFromFirstAlert = () => { }; export const closeFirstAlert = () => { - cy.get(TIMELINE_CONTEXT_MENU_BTN).first().click({ force: true }); - cy.get(CLOSE_ALERT_BTN).click(); + cy.get(TIMELINE_CONTEXT_MENU_BTN) + .first() + .pipe(($el) => $el.trigger('click')) + .should('be.visible'); + + cy.get(CLOSE_ALERT_BTN) + .pipe(($el) => $el.trigger('click')) + .should('not.be.visible'); }; export const closeAlerts = () => { - cy.get(TAKE_ACTION_POPOVER_BTN).click({ force: true }); - cy.get(CLOSE_SELECTED_ALERTS_BTN).click(); + cy.get(TAKE_ACTION_POPOVER_BTN) + .first() + .pipe(($el) => $el.trigger('click')) + .should('be.visible'); + + cy.get(CLOSE_SELECTED_ALERTS_BTN) + .pipe(($el) => $el.trigger('click')) + .should('not.be.visible'); }; export const expandFirstAlert = () => { diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts index 0b051f3a26581..5a816a71744cb 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts @@ -7,7 +7,7 @@ import { CustomRule, ThreatIndicatorRule } from '../../objects/rule'; -export const createCustomRule = (rule: CustomRule, ruleId = 'rule_testing') => +export const createCustomRule = (rule: CustomRule, ruleId = 'rule_testing', interval = '100m') => cy.request({ method: 'POST', url: 'api/detection_engine/rules', @@ -15,7 +15,7 @@ export const createCustomRule = (rule: CustomRule, ruleId = 'rule_testing') => rule_id: ruleId, risk_score: parseInt(rule.riskScore, 10), description: rule.description, - interval: '10s', + interval, name: rule.name, severity: rule.severity.toLocaleLowerCase(), type: 'query', @@ -67,7 +67,12 @@ export const createCustomIndicatorRule = (rule: ThreatIndicatorRule, ruleId = 'r failOnStatusCode: false, }); -export const createCustomRuleActivated = (rule: CustomRule, ruleId = '1') => +export const createCustomRuleActivated = ( + rule: CustomRule, + ruleId = '1', + interval = '100m', + maxSignals = 500 +) => cy.request({ method: 'POST', url: 'api/detection_engine/rules', @@ -75,7 +80,7 @@ export const createCustomRuleActivated = (rule: CustomRule, ruleId = '1') => rule_id: ruleId, risk_score: parseInt(rule.riskScore, 10), description: rule.description, - interval: '10s', + interval, name: rule.name, severity: rule.severity.toLocaleLowerCase(), type: 'query', @@ -85,7 +90,7 @@ export const createCustomRuleActivated = (rule: CustomRule, ruleId = '1') => language: 'kuery', enabled: true, tags: ['rule1'], - max_signals: 500, + max_signals: maxSignals, }, headers: { 'kbn-xsrf': 'cypress-creds' }, failOnStatusCode: false, diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index 2b7308757f9f4..9f957a0cb9a95 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -479,7 +479,7 @@ export const selectThresholdRuleType = () => { cy.get(THRESHOLD_TYPE).click({ force: true }); }; -export const waitForAlertsToPopulate = async () => { +export const waitForAlertsToPopulate = async (alertCountThreshold = 1) => { cy.waitUntil( () => { refreshPage(); @@ -488,7 +488,7 @@ export const waitForAlertsToPopulate = async () => { .invoke('text') .then((countText) => { const alertCount = parseInt(countText, 10) || 0; - return alertCount > 0; + return alertCount >= alertCountThreshold; }); }, { interval: 500, timeout: 12000 } From e321f57f64657ffff91df8ed96f4e9fdbe5dcde7 Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 16 Apr 2021 22:28:19 -0700 Subject: [PATCH 08/82] skip flaky suite (#97382) --- .../test/api_integration/apis/short_urls/feature_controls.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/short_urls/feature_controls.ts b/x-pack/test/api_integration/apis/short_urls/feature_controls.ts index a2596e9eaedaf..e55fcf10b7fac 100644 --- a/x-pack/test/api_integration/apis/short_urls/feature_controls.ts +++ b/x-pack/test/api_integration/apis/short_urls/feature_controls.ts @@ -12,7 +12,8 @@ export default function featureControlsTests({ getService }: FtrProviderContext) const supertest = getService('supertestWithoutAuth'); const security = getService('security'); - describe('feature controls', () => { + // FLAKY: https://github.com/elastic/kibana/issues/97382 + describe.skip('feature controls', () => { const kibanaUsername = 'kibana_admin'; const kibanaUserRoleName = 'kibana_admin'; From e0da8b2e961793b6df66086769a0b2f830186d2d Mon Sep 17 00:00:00 2001 From: Bryan Clement Date: Sat, 17 Apr 2021 03:42:49 -0700 Subject: [PATCH 09/82] [Asset Management] Agent picker follow up (#97357) --- .../osquery/public/agents/agent_grouper.ts | 118 ++++++++++ .../osquery/public/agents/agents_table.tsx | 217 ++++++------------ .../osquery/public/agents/helpers.test.ts | 6 + .../plugins/osquery/public/agents/helpers.ts | 65 +++++- .../osquery/public/agents/translations.ts | 2 +- x-pack/plugins/osquery/public/agents/types.ts | 13 +- .../osquery/public/agents/use_agent_groups.ts | 14 +- .../public/agents/use_agent_policies.ts | 38 +++ .../osquery/public/agents/use_all_agents.ts | 24 +- .../live_query/form/agents_table_field.tsx | 5 +- 10 files changed, 344 insertions(+), 158 deletions(-) create mode 100644 x-pack/plugins/osquery/public/agents/agent_grouper.ts create mode 100644 x-pack/plugins/osquery/public/agents/use_agent_policies.ts diff --git a/x-pack/plugins/osquery/public/agents/agent_grouper.ts b/x-pack/plugins/osquery/public/agents/agent_grouper.ts new file mode 100644 index 0000000000000..419a3b9e733a4 --- /dev/null +++ b/x-pack/plugins/osquery/public/agents/agent_grouper.ts @@ -0,0 +1,118 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Agent } from '../../common/shared_imports'; +import { generateColorPicker } from './helpers'; +import { + ALL_AGENTS_LABEL, + AGENT_PLATFORMS_LABEL, + AGENT_POLICY_LABEL, + AGENT_SELECTION_LABEL, +} from './translations'; +import { AGENT_GROUP_KEY, Group, GroupOption } from './types'; + +const getColor = generateColorPicker(); + +const generateGroup = (label: string, groupType: AGENT_GROUP_KEY) => { + return { + label, + groupType, + color: getColor(groupType), + size: 0, + data: [] as T[], + }; +}; + +export class AgentGrouper { + groupOrder = [ + AGENT_GROUP_KEY.All, + AGENT_GROUP_KEY.Platform, + AGENT_GROUP_KEY.Policy, + AGENT_GROUP_KEY.Agent, + ]; + groups = { + [AGENT_GROUP_KEY.All]: generateGroup(ALL_AGENTS_LABEL, AGENT_GROUP_KEY.All), + [AGENT_GROUP_KEY.Platform]: generateGroup(AGENT_PLATFORMS_LABEL, AGENT_GROUP_KEY.Platform), + [AGENT_GROUP_KEY.Policy]: generateGroup(AGENT_POLICY_LABEL, AGENT_GROUP_KEY.Policy), + [AGENT_GROUP_KEY.Agent]: generateGroup(AGENT_SELECTION_LABEL, AGENT_GROUP_KEY.Agent), + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + updateGroup(key: AGENT_GROUP_KEY, data: any[], append = false) { + if (!data?.length) { + return; + } + const group = this.groups[key]; + if (append) { + group.data.push(...data); + } else { + group.data = data; + } + group.size = data.length; + } + + setTotalAgents(total: number): void { + this.groups[AGENT_GROUP_KEY.All].size = total; + } + + generateOptions(): GroupOption[] { + const opts: GroupOption[] = []; + for (const key of this.groupOrder) { + const { label, size, groupType, data, color } = this.groups[key]; + if (size === 0) { + continue; + } + + switch (key) { + case AGENT_GROUP_KEY.All: + opts.push({ + label, + options: [ + { + label, + value: { groupType, size }, + color, + }, + ], + }); + break; + case AGENT_GROUP_KEY.Platform: + case AGENT_GROUP_KEY.Policy: + opts.push({ + label, + options: (data as Group[]).map(({ name, id, size: groupSize }) => ({ + label: name !== id ? `${name} (${id})` : name, + key: id, + color: getColor(groupType), + value: { groupType, id, size: groupSize }, + })), + }); + break; + case AGENT_GROUP_KEY.Agent: + opts.push({ + label, + options: (data as Agent[]).map((agent: Agent) => ({ + label: `${agent.local_metadata.host.hostname} (${agent.local_metadata.elastic.agent.id})`, + key: agent.local_metadata.elastic.agent.id, + color, + value: { + groupType, + groups: { + policy: agent.policy_id ?? '', + platform: agent.local_metadata.os.platform, + }, + id: agent.local_metadata.elastic.agent.id, + online: agent.active, + }, + })), + }); + break; + } + } + return opts; + } +} diff --git a/x-pack/plugins/osquery/public/agents/agents_table.tsx b/x-pack/plugins/osquery/public/agents/agents_table.tsx index 5f1b6a0d2f0b1..38132957c341f 100644 --- a/x-pack/plugins/osquery/public/agents/agents_table.tsx +++ b/x-pack/plugins/osquery/public/agents/agents_table.tsx @@ -5,179 +5,98 @@ * 2.0. */ -import React, { useCallback, useEffect, useState } from 'react'; -import { EuiComboBox, EuiComboBoxOptionOption, EuiHealth, EuiHighlight } from '@elastic/eui'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { EuiComboBox, EuiHealth, EuiHighlight } from '@elastic/eui'; +import { useDebounce } from 'react-use'; import { useAllAgents } from './use_all_agents'; import { useAgentGroups } from './use_agent_groups'; import { useOsqueryPolicies } from './use_osquery_policies'; -import { Agent } from '../../common/shared_imports'; +import { AgentGrouper } from './agent_grouper'; import { getNumAgentsInGrouping, generateAgentCheck, getNumOverlapped, - generateColorPicker, + generateAgentSelection, } from './helpers'; -import { - ALL_AGENTS_LABEL, - AGENT_PLATFORMS_LABEL, - AGENT_POLICY_LABEL, - SELECT_AGENT_LABEL, - AGENT_SELECTION_LABEL, - generateSelectedAgentsMessage, -} from './translations'; - -import { AGENT_GROUP_KEY, SelectedGroups, AgentOptionValue, GroupOptionValue } from './types'; +import { SELECT_AGENT_LABEL, generateSelectedAgentsMessage } from './translations'; -export interface AgentsSelection { - agents: string[]; - allAgentsSelected: boolean; - platformsSelected: string[]; - policiesSelected: string[]; -} +import { + AGENT_GROUP_KEY, + SelectedGroups, + AgentOptionValue, + GroupOption, + AgentSelection, +} from './types'; interface AgentsTableProps { - agentSelection: AgentsSelection; - onChange: (payload: AgentsSelection) => void; + agentSelection: AgentSelection; + onChange: (payload: AgentSelection) => void; } -type GroupOption = EuiComboBoxOptionOption; - -const getColor = generateColorPicker(); +const perPage = 10; +const DEBOUNCE_DELAY = 100; // ms const AgentsTableComponent: React.FC = ({ onChange }) => { + // search related + const [searchValue, setSearchValue] = useState(''); + const [modifyingSearch, setModifyingSearch] = useState(false); + const [debouncedSearchValue, setDebouncedSearchValue] = useState(''); + useDebounce( + () => { + // update the real search value, set the typing flag + setDebouncedSearchValue(searchValue); + setModifyingSearch(false); + }, + DEBOUNCE_DELAY, + [searchValue] + ); + + // grouping related const osqueryPolicyData = useOsqueryPolicies(); const { loading: groupsLoading, totalCount: totalNumAgents, groups } = useAgentGroups( osqueryPolicyData ); - const { agents } = useAllAgents(osqueryPolicyData); - const [loading, setLoading] = useState(true); + const grouper = useMemo(() => new AgentGrouper(), []); + const { agentsLoading, agents } = useAllAgents(osqueryPolicyData, debouncedSearchValue, { + perPage, + }); + + // option related const [options, setOptions] = useState([]); const [selectedOptions, setSelectedOptions] = useState([]); const [numAgentsSelected, setNumAgentsSelected] = useState(0); useEffect(() => { - const allAgentsLabel = ALL_AGENTS_LABEL; - const opts: GroupOption[] = [ - { - label: allAgentsLabel, - options: [ - { - label: allAgentsLabel, - value: { groupType: AGENT_GROUP_KEY.All, size: totalNumAgents }, - color: getColor(AGENT_GROUP_KEY.All), - }, - ], - }, - ]; - - if (groups.platforms.length > 0) { - const groupType = AGENT_GROUP_KEY.Platform; - opts.push({ - label: AGENT_PLATFORMS_LABEL, - options: groups.platforms.map(({ name, size }) => ({ - label: name, - color: getColor(groupType), - value: { groupType, size }, - })), - }); - } - - if (groups.policies.length > 0) { - const groupType = AGENT_GROUP_KEY.Policy; - opts.push({ - label: AGENT_POLICY_LABEL, - options: groups.policies.map(({ name, size }) => ({ - label: name, - color: getColor(groupType), - value: { groupType, size }, - })), - }); - } - - if (agents && agents.length > 0) { - const groupType = AGENT_GROUP_KEY.Agent; - opts.push({ - label: AGENT_SELECTION_LABEL, - options: (agents as Agent[]).map((agent: Agent) => ({ - label: agent.local_metadata.host.hostname, - color: getColor(groupType), - value: { - groupType, - groups: { policy: agent.policy_id ?? '', platform: agent.local_metadata.os.platform }, - id: agent.local_metadata.elastic.agent.id, - online: agent.active, - }, - })), - }); - } - setLoading(false); - setOptions(opts); - }, [groups.platforms, groups.policies, totalNumAgents, groupsLoading, agents]); + // update the groups when groups or agents have changed + grouper.setTotalAgents(totalNumAgents); + grouper.updateGroup(AGENT_GROUP_KEY.Platform, groups.platforms); + grouper.updateGroup(AGENT_GROUP_KEY.Policy, groups.policies); + grouper.updateGroup(AGENT_GROUP_KEY.Agent, agents); + const newOptions = grouper.generateOptions(); + setOptions(newOptions); + }, [groups.platforms, groups.policies, totalNumAgents, groupsLoading, agents, grouper]); const onSelection = useCallback( (selection: GroupOption[]) => { - // TODO?: optimize this by making it incremental - const newAgentSelection: AgentsSelection = { - agents: [], - allAgentsSelected: false, - platformsSelected: [], - policiesSelected: [], - }; - // parse through the selections to be able to determine how many are actually selected - const selectedAgents = []; - const selectedGroups: SelectedGroups = { - policy: {}, - platform: {}, - }; - - // TODO: clean this up, make it less awkward - for (const opt of selection) { - const groupType = opt.value?.groupType; - let value; - switch (groupType) { - case AGENT_GROUP_KEY.All: - newAgentSelection.allAgentsSelected = true; - break; - case AGENT_GROUP_KEY.Platform: - value = opt.value as GroupOptionValue; - if (!newAgentSelection.allAgentsSelected) { - // we don't need to calculate diffs when all agents are selected - selectedGroups.platform[opt.label] = value.size; - } - newAgentSelection.platformsSelected.push(opt.label); - break; - case AGENT_GROUP_KEY.Policy: - value = opt.value as GroupOptionValue; - if (!newAgentSelection.allAgentsSelected) { - // we don't need to calculate diffs when all agents are selected - selectedGroups.policy[opt.label] = value.size ?? 0; - } - newAgentSelection.policiesSelected.push(opt.label); - break; - case AGENT_GROUP_KEY.Agent: - value = opt.value as AgentOptionValue; - if (!newAgentSelection.allAgentsSelected) { - // we don't need to count how many agents are selected if they are all selected - selectedAgents.push(opt.value); - } - // TODO: fix this casting by updating the opt type to be a union - newAgentSelection.agents.push(value.id as string); - break; - default: - // this should never happen! - // eslint-disable-next-line no-console - console.error(`unknown group type ${groupType}`); - } - } + // TODO?: optimize this by making the selection computation incremental + const { + newAgentSelection, + selectedAgents, + selectedGroups, + }: { + newAgentSelection: AgentSelection; + selectedAgents: AgentOptionValue[]; + selectedGroups: SelectedGroups; + } = generateAgentSelection(selection); if (newAgentSelection.allAgentsSelected) { setNumAgentsSelected(totalNumAgents); } else { const checkAgent = generateAgentCheck(selectedGroups); setNumAgentsSelected( // filter out all the agents counted by selected policies and platforms - selectedAgents.filter((a) => checkAgent(a as AgentOptionValue)).length + + selectedAgents.filter(checkAgent).length + // add the number of agents added via policy and platform groups getNumAgentsInGrouping(selectedGroups) - // subtract the number of agents double counted by policy/platform selections @@ -190,32 +109,40 @@ const AgentsTableComponent: React.FC = ({ onChange }) => { [groups, onChange, totalNumAgents] ); - const renderOption = useCallback((option, searchValue, contentClassName) => { + const renderOption = useCallback((option, searchVal, contentClassName) => { const { label, value } = option; return value?.groupType === AGENT_GROUP_KEY.Agent ? ( - {label} + {label} ) : ( - {label} + [{value?.size ?? 0}]   - ({value?.size}) + {label} ); }, []); + + const onSearchChange = useCallback((v: string) => { + // set the typing flag and update the search value + setModifyingSearch(v !== ''); + setSearchValue(v); + }, []); + return (
-

{SELECT_AGENT_LABEL}

{numAgentsSelected > 0 ? {generateSelectedAgentsMessage(numAgentsSelected)} : ''}   { const { platforms, policies, overlap } = processAggregations(input); expect(platforms).toEqual([ { + id: 'darwin', name: 'darwin', size: 200, }, @@ -59,10 +60,12 @@ describe('processAggregations', () => { expect(platforms).toEqual([]); expect(policies).toEqual([ { + id: '8cd01a60-8a74-11eb-86cb-c58693443a4f', name: '8cd01a60-8a74-11eb-86cb-c58693443a4f', size: 100, }, { + id: '8cd06880-8a74-11eb-86cb-c58693443a4f', name: '8cd06880-8a74-11eb-86cb-c58693443a4f', size: 100, }, @@ -107,16 +110,19 @@ describe('processAggregations', () => { const { platforms, policies, overlap } = processAggregations(input); expect(platforms).toEqual([ { + id: 'darwin', name: 'darwin', size: 200, }, ]); expect(policies).toEqual([ { + id: '8cd01a60-8a74-11eb-86cb-c58693443a4f', name: '8cd01a60-8a74-11eb-86cb-c58693443a4f', size: 100, }, { + id: '8cd06880-8a74-11eb-86cb-c58693443a4f', name: '8cd06880-8a74-11eb-86cb-c58693443a4f', size: 100, }, diff --git a/x-pack/plugins/osquery/public/agents/helpers.ts b/x-pack/plugins/osquery/public/agents/helpers.ts index 830fca5f57caa..14a8dd64fb4da 100644 --- a/x-pack/plugins/osquery/public/agents/helpers.ts +++ b/x-pack/plugins/osquery/public/agents/helpers.ts @@ -20,6 +20,9 @@ import { Group, AgentOptionValue, AggregationDataPoint, + AgentSelection, + GroupOptionValue, + GroupOption, } from './types'; export type InspectResponse = Inspect & { response: string[] }; @@ -43,11 +46,12 @@ export const processAggregations = (aggs: Record) => { const platformTerms = aggs.platforms as TermsAggregate; const policyTerms = aggs.policies as TermsAggregate; - const policies = policyTerms?.buckets.map((o) => ({ name: o.key, size: o.doc_count })) ?? []; + const policies = + policyTerms?.buckets.map((o) => ({ name: o.key, id: o.key, size: o.doc_count })) ?? []; if (platformTerms?.buckets) { for (const { key, doc_count: size, policies: platformPolicies } of platformTerms.buckets) { - platforms.push({ name: key, size }); + platforms.push({ name: key, id: key, size }); if (platformPolicies?.buckets && policies.length > 0) { overlap[key] = platformPolicies.buckets.reduce((acc: { [key: string]: number }, pol) => { acc[pol.key] = pol.doc_count; @@ -96,6 +100,63 @@ export const generateAgentCheck = (selectedGroups: SelectedGroups) => { }; }; +export const generateAgentSelection = (selection: GroupOption[]) => { + const newAgentSelection: AgentSelection = { + agents: [], + allAgentsSelected: false, + platformsSelected: [], + policiesSelected: [], + }; + // parse through the selections to be able to determine how many are actually selected + const selectedAgents: AgentOptionValue[] = []; + const selectedGroups: SelectedGroups = { + policy: {}, + platform: {}, + }; + + // TODO: clean this up, make it less awkward + for (const opt of selection) { + const groupType = opt.value?.groupType; + let value; + switch (groupType) { + case AGENT_GROUP_KEY.All: + newAgentSelection.allAgentsSelected = true; + break; + case AGENT_GROUP_KEY.Platform: + value = opt.value as GroupOptionValue; + if (!newAgentSelection.allAgentsSelected) { + // we don't need to calculate diffs when all agents are selected + selectedGroups.platform[opt.value?.id ?? opt.label] = value.size; + } + newAgentSelection.platformsSelected.push(opt.label); + break; + case AGENT_GROUP_KEY.Policy: + value = opt.value as GroupOptionValue; + if (!newAgentSelection.allAgentsSelected) { + // we don't need to calculate diffs when all agents are selected + selectedGroups.policy[opt.value?.id ?? opt.label] = value.size; + } + newAgentSelection.policiesSelected.push(opt.label); + break; + case AGENT_GROUP_KEY.Agent: + value = opt.value as AgentOptionValue; + if (!newAgentSelection.allAgentsSelected) { + // we don't need to count how many agents are selected if they are all selected + selectedAgents.push(value); + } + if (value?.id) { + newAgentSelection.agents.push(value.id); + } + break; + default: + // this should never happen! + // eslint-disable-next-line no-console + console.error(`unknown group type ${groupType}`); + } + } + return { newAgentSelection, selectedGroups, selectedAgents }; +}; + export const generateTablePaginationOptions = ( activePage: number, limit: number, diff --git a/x-pack/plugins/osquery/public/agents/translations.ts b/x-pack/plugins/osquery/public/agents/translations.ts index af99a73d63de2..209761b4c8bdf 100644 --- a/x-pack/plugins/osquery/public/agents/translations.ts +++ b/x-pack/plugins/osquery/public/agents/translations.ts @@ -40,7 +40,7 @@ export const AGENT_SELECTION_LABEL = i18n.translate('xpack.osquery.agents.select }); export const SELECT_AGENT_LABEL = i18n.translate('xpack.osquery.agents.selectAgentLabel', { - defaultMessage: `Select Agents`, + defaultMessage: `Select agents or groups`, }); export const ERROR_ALL_AGENTS = i18n.translate('xpack.osquery.agents.errorSearchDescription', { diff --git a/x-pack/plugins/osquery/public/agents/types.ts b/x-pack/plugins/osquery/public/agents/types.ts index 2fa8ddaf345cd..b26404f9c5e70 100644 --- a/x-pack/plugins/osquery/public/agents/types.ts +++ b/x-pack/plugins/osquery/public/agents/types.ts @@ -6,6 +6,7 @@ */ import { TermsAggregate } from '@elastic/elasticsearch/api/types'; +import { EuiComboBoxOptionOption } from '@elastic/eui'; interface BaseDataPoint { key: string; @@ -17,6 +18,7 @@ export type AggregationDataPoint = BaseDataPoint & { }; export interface Group { + id: string; name: string; size: number; } @@ -28,14 +30,23 @@ export interface SelectedGroups { [groupType: string]: { [groupName: string]: number }; } +export type GroupOption = EuiComboBoxOptionOption; + +export interface AgentSelection { + agents: string[]; + allAgentsSelected: boolean; + platformsSelected: string[]; + policiesSelected: string[]; +} + interface BaseGroupOption { + id?: string; groupType: AGENT_GROUP_KEY; } export type AgentOptionValue = BaseGroupOption & { groups: { [groupType: string]: string }; online: boolean; - id: string; }; export type GroupOptionValue = BaseGroupOption & { diff --git a/x-pack/plugins/osquery/public/agents/use_agent_groups.ts b/x-pack/plugins/osquery/public/agents/use_agent_groups.ts index 0eaca65d02d4b..0853891f1919d 100644 --- a/x-pack/plugins/osquery/public/agents/use_agent_groups.ts +++ b/x-pack/plugins/osquery/public/agents/use_agent_groups.ts @@ -7,6 +7,7 @@ import { useState } from 'react'; import { useQuery } from 'react-query'; import { useKibana } from '../common/lib/kibana'; +import { useAgentPolicies } from './use_agent_policies'; import { OsqueryQueries, @@ -25,6 +26,7 @@ interface UseAgentGroups { export const useAgentGroups = ({ osqueryPolicies, osqueryPoliciesLoading }: UseAgentGroups) => { const { data } = useKibana().services; + const { agentPoliciesLoading, agentPolicyById } = useAgentPolicies(osqueryPolicies); const [platforms, setPlatforms] = useState([]); const [policies, setPolicies] = useState([]); const [loading, setLoading] = useState(true); @@ -78,14 +80,22 @@ export const useAgentGroups = ({ osqueryPolicies, osqueryPoliciesLoading }: UseA setPlatforms(newPlatforms); setOverlap(newOverlap); - setPolicies(newPolicies); + setPolicies( + newPolicies.map((p) => { + const name = agentPolicyById[p.id]?.name ?? p.name; + return { + ...p, + name, + }; + }) + ); } setLoading(false); setTotalCount(responseData.totalCount); }, { - enabled: !osqueryPoliciesLoading, + enabled: !osqueryPoliciesLoading && !agentPoliciesLoading, } ); diff --git a/x-pack/plugins/osquery/public/agents/use_agent_policies.ts b/x-pack/plugins/osquery/public/agents/use_agent_policies.ts new file mode 100644 index 0000000000000..3045423ccbe2d --- /dev/null +++ b/x-pack/plugins/osquery/public/agents/use_agent_policies.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQueries, UseQueryResult } from 'react-query'; +import { useKibana } from '../common/lib/kibana'; +import { + AgentPolicy, + agentPolicyRouteService, + GetOneAgentPolicyResponse, +} from '../../../fleet/common'; + +export const useAgentPolicies = (policyIds: string[] = []) => { + const { http } = useKibana().services; + + const agentResponse = useQueries( + policyIds.map((policyId) => ({ + queryKey: ['agentPolicy', policyId], + queryFn: () => http.get(agentPolicyRouteService.getInfoPath(policyId)), + enabled: policyIds.length > 0, + })) + ) as Array>; + + const agentPoliciesLoading = agentResponse.some((p) => p.isLoading); + const agentPolicies = agentResponse.map((p) => p.data?.item); + const agentPolicyById = agentPolicies.reduce((acc, p) => { + if (!p) { + return acc; + } + acc[p.id] = p; + return acc; + }, {} as { [key: string]: AgentPolicy }); + + return { agentPoliciesLoading, agentPolicies, agentPolicyById }; +}; diff --git a/x-pack/plugins/osquery/public/agents/use_all_agents.ts b/x-pack/plugins/osquery/public/agents/use_all_agents.ts index 607f9ae007692..bd9b1c32412e6 100644 --- a/x-pack/plugins/osquery/public/agents/use_all_agents.ts +++ b/x-pack/plugins/osquery/public/agents/use_all_agents.ts @@ -14,16 +14,30 @@ interface UseAllAgents { osqueryPoliciesLoading: boolean; } -export const useAllAgents = ({ osqueryPolicies, osqueryPoliciesLoading }: UseAllAgents) => { - // TODO: properly fetch these in an async manner +interface RequestOptions { + perPage?: number; + page?: number; +} + +// TODO: break out the paginated vs all cases into separate hooks +export const useAllAgents = ( + { osqueryPolicies, osqueryPoliciesLoading }: UseAllAgents, + searchValue = '', + opts: RequestOptions = { perPage: 9000 } +) => { + const { perPage } = opts; const { http } = useKibana().services; const { isLoading: agentsLoading, data: agentData } = useQuery( - ['agents', osqueryPolicies], + ['agents', osqueryPolicies, searchValue, perPage], async () => { + let kuery = `(${osqueryPolicies.map((p) => `policy_id:${p}`).join(' or ')})`; + if (searchValue) { + kuery += ` and (local_metadata.host.hostname:/${searchValue}/ or local_metadata.elastic.agent.id:/${searchValue}/)`; + } return await http.get('/api/fleet/agents', { query: { - kuery: osqueryPolicies.map((p) => `policy_id:${p}`).join(' or '), - perPage: 9000, + kuery, + perPage, }, }); }, diff --git a/x-pack/plugins/osquery/public/live_query/form/agents_table_field.tsx b/x-pack/plugins/osquery/public/live_query/form/agents_table_field.tsx index 4bc9262af7613..ccde0fd8305f9 100644 --- a/x-pack/plugins/osquery/public/live_query/form/agents_table_field.tsx +++ b/x-pack/plugins/osquery/public/live_query/form/agents_table_field.tsx @@ -7,10 +7,11 @@ import React, { useCallback } from 'react'; import { FieldHook } from '../../shared_imports'; -import { AgentsTable, AgentsSelection } from '../../agents/agents_table'; +import { AgentsTable } from '../../agents/agents_table'; +import { AgentSelection } from '../../agents/types'; interface AgentsTableFieldProps { - field: FieldHook; + field: FieldHook; } const AgentsTableFieldComponent: React.FC = ({ field }) => { From a89b75671000d6c8431ff150b4f555e1f00f361e Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Sat, 17 Apr 2021 15:52:32 +0100 Subject: [PATCH 10/82] skip flaky suite (#97387) --- x-pack/test/api_integration/apis/lens/existing_fields.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/lens/existing_fields.ts b/x-pack/test/api_integration/apis/lens/existing_fields.ts index 88949401f102a..0358786993919 100644 --- a/x-pack/test/api_integration/apis/lens/existing_fields.ts +++ b/x-pack/test/api_integration/apis/lens/existing_fields.ts @@ -160,7 +160,8 @@ export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('existing_fields apis', () => { + // FLAKY: https://github.com/elastic/kibana/issues/97387 + describe.skip('existing_fields apis', () => { before(async () => { await esArchiver.loadIfNeeded('logstash_functional'); await esArchiver.loadIfNeeded('visualize/default'); From 3b31d81196799a9ced9acd5f30082b0f7aed1ce7 Mon Sep 17 00:00:00 2001 From: Catherine Liu Date: Sat, 17 Apr 2021 22:29:27 -0700 Subject: [PATCH 11/82] [Dashboard] Makes lens default editor for creating new panels (#96181) * Makes lens default editor in dashboard Added all editors menu to dashboard panel toolbar Fixed toggle on editor menu Removed unnecessary comments Added data test subjects to editor menu buttons Populated editor menu with vis types Removed unused imports Fixed imports Adds showCreateNewMenu prop to AddPanelFlyout Rearranged order of editor menu options Fixed ts errors Added groupnig to embeddable factory Use embeddable state transfer service to redirect to editors Added showGroups to TypeSelectionState Fixed add panel flyout test Fixed data test subjects Fixed factory groupings Removed unused import Fixed page object Added telemtry to dashboard toolbar Added telemtry to editor menu Fix ml embeddable functional tests Fix lens dashboard test Fix empty dashboard test Fixed ts errors Fixed time to visualize security test Fixed empty dashboard test Fixed clickAddNewEmbeddableLink in dashboardAddPanel service Fixed agg based vis functional tests Revert test changes Fixed typo Fix tests Fix more tests Fix ts errors Fixed more tests Fixed toolbar sizes and margins to align with lens Fix tests Fixed callbacks Fixed button prop type New vis modal copy updates Added savedObjectMetaData to log stream embeddable factory Addressed feedback Fixed ts error Fix more tests Fixed ts errors Updated dashboard empty prompt copy Adds tooltip to log stream embeddable factory saved object meta data Made icons monochrome in toolbar Fixed icon colors in dark mode Cleaned up css Fixed ts errors Updated snapshot Fixed map icon color * Added tooltips for ML embeddables * Restored test * Added empty dashboard panel test * Fixed i18n id * Fix dashboard_embedding test * Removed unused service * Fixed i18n error * Added icon and description properties to embeddable factory definition * Fixed ts errors * Fixed expected value Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...public.embeddablefactory.getdescription.md | 17 ++ ...le-public.embeddablefactory.geticontype.md | 17 ++ ...dable-public.embeddablefactory.grouping.md | 13 + ...ins-embeddable-public.embeddablefactory.md | 3 + ...able-public.embeddablefactorydefinition.md | 2 +- ...ns-embeddable-public.openaddpanelflyout.md | 3 +- src/plugins/dashboard/kibana.json | 3 +- .../public/application/_dashboard_app.scss | 15 +- .../public/application/dashboard_router.tsx | 2 + .../dashboard_container_factory.tsx | 2 +- .../dashboard_empty_screen.test.tsx.snap | 2 +- .../listing/dashboard_listing.test.tsx | 2 + .../application/top_nav/dashboard_top_nav.tsx | 127 ++++++--- .../application/top_nav/editor_menu.tsx | 255 ++++++++++++++++++ .../dashboard/public/application/types.ts | 2 + .../dashboard/public/dashboard_strings.ts | 2 +- src/plugins/dashboard/public/plugin.tsx | 2 + .../default_embeddable_factory_provider.ts | 3 + .../lib/embeddables/embeddable_factory.ts | 17 ++ .../embeddable_factory_definition.ts | 3 + .../add_panel/add_panel_flyout.test.tsx | 2 + .../add_panel/add_panel_flyout.tsx | 5 +- .../add_panel/open_add_panel_flyout.tsx | 3 + src/plugins/embeddable/public/public.api.md | 7 +- .../solution_toolbar/items/button.scss | 1 - .../solution_toolbar/items/button.tsx | 10 +- .../solution_toolbar/items/popover.tsx | 10 +- .../items/primary_button.scss | 20 ++ .../solution_toolbar/items/primary_button.tsx | 18 +- .../solution_toolbar/items/quick_group.scss | 13 + .../solution_toolbar/items/quick_group.tsx | 12 +- .../solution_toolbar/solution_toolbar.scss | 15 +- .../solution_toolbar/solution_toolbar.tsx | 9 +- src/plugins/presentation_util/public/index.ts | 1 + .../visualize_embeddable_factory.tsx | 2 +- src/plugins/visualizations/public/index.ts | 2 +- .../public/wizard/dialog_navigation.tsx | 2 +- .../public/wizard/new_vis_modal.tsx | 7 +- .../public/wizard/show_new_vis.tsx | 7 + test/examples/embeddables/adding_children.ts | 23 +- .../dashboard/create_and_add_embeddables.ts | 26 +- .../dashboard/dashboard_unsaved_listing.ts | 8 +- .../apps/dashboard/dashboard_unsaved_state.ts | 4 +- .../dashboard/edit_embeddable_redirects.ts | 8 +- .../apps/dashboard/edit_visualizations.js | 3 +- .../apps/dashboard/empty_dashboard.ts | 9 +- test/functional/apps/dashboard/view_edit.ts | 6 +- .../functional/page_objects/dashboard_page.ts | 10 - .../services/dashboard/add_panel.ts | 30 ++- .../services/dashboard/visualizations.ts | 45 +--- .../new_visualize_flow/dashboard_embedding.ts | 5 - .../log_stream_embeddable_factory.ts | 10 + .../anomaly_charts_embeddable_factory.ts | 17 +- .../anomaly_swimlane_embeddable_factory.ts | 17 +- .../apps/ml_embeddables_in_dashboard.ts | 4 +- .../apps/dashboard/dashboard_lens_by_value.ts | 2 - .../apps/dashboard/dashboard_maps_by_value.ts | 9 +- .../time_to_visualize_security.ts | 7 +- .../functional/apps/dashboard/sync_colors.ts | 2 - .../dashboard_mode/dashboard_empty_screen.js | 7 - x-pack/test/functional/apps/lens/dashboard.ts | 2 - .../test/functional/apps/lens/lens_tagging.ts | 5 +- .../maps/embeddable/embeddable_library.js | 4 +- .../apps/maps/embeddable/save_and_return.js | 6 +- .../anomaly_charts_dashboard_embeddables.ts | 4 +- .../test/functional/page_objects/lens_page.ts | 3 +- 66 files changed, 684 insertions(+), 230 deletions(-) create mode 100644 docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.getdescription.md create mode 100644 docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.geticontype.md create mode 100644 docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.grouping.md create mode 100644 src/plugins/dashboard/public/application/top_nav/editor_menu.tsx create mode 100644 src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.scss diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.getdescription.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.getdescription.md new file mode 100644 index 0000000000000..1699351349bf8 --- /dev/null +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.getdescription.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-embeddable-public](./kibana-plugin-plugins-embeddable-public.md) > [EmbeddableFactory](./kibana-plugin-plugins-embeddable-public.embeddablefactory.md) > [getDescription](./kibana-plugin-plugins-embeddable-public.embeddablefactory.getdescription.md) + +## EmbeddableFactory.getDescription() method + +Returns a description about the embeddable. + +Signature: + +```typescript +getDescription(): string; +``` +Returns: + +`string` + diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.geticontype.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.geticontype.md new file mode 100644 index 0000000000000..58b987e5630c4 --- /dev/null +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.geticontype.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-embeddable-public](./kibana-plugin-plugins-embeddable-public.md) > [EmbeddableFactory](./kibana-plugin-plugins-embeddable-public.embeddablefactory.md) > [getIconType](./kibana-plugin-plugins-embeddable-public.embeddablefactory.geticontype.md) + +## EmbeddableFactory.getIconType() method + +Returns an EUI Icon type to be displayed in a menu. + +Signature: + +```typescript +getIconType(): string; +``` +Returns: + +`string` + diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.grouping.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.grouping.md new file mode 100644 index 0000000000000..c4dbe739ddfcb --- /dev/null +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.grouping.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-embeddable-public](./kibana-plugin-plugins-embeddable-public.md) > [EmbeddableFactory](./kibana-plugin-plugins-embeddable-public.embeddablefactory.md) > [grouping](./kibana-plugin-plugins-embeddable-public.embeddablefactory.grouping.md) + +## EmbeddableFactory.grouping property + +Indicates the grouping this factory should appear in a sub-menu. Example, this is used for grouping options in the editors menu in Dashboard for creating new embeddables + +Signature: + +```typescript +readonly grouping?: UiActionsPresentableGrouping; +``` diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.md index b355acd0567a8..8ee60e1f58a2b 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactory.md @@ -16,6 +16,7 @@ export interface EmbeddableFactoryUiActionsPresentableGrouping | Indicates the grouping this factory should appear in a sub-menu. Example, this is used for grouping options in the editors menu in Dashboard for creating new embeddables | | [isContainerType](./kibana-plugin-plugins-embeddable-public.embeddablefactory.iscontainertype.md) | boolean | True if is this factory create embeddables that are Containers. Used in the add panel to conditionally show whether these can be added to another container. It's just not supported right now, but once nested containers are officially supported we can probably get rid of this interface. | | [isEditable](./kibana-plugin-plugins-embeddable-public.embeddablefactory.iseditable.md) | () => Promise<boolean> | Returns whether the current user should be allowed to edit this type of embeddable. Most of the time this should be based off the capabilities service, hence it's async. | | [savedObjectMetaData](./kibana-plugin-plugins-embeddable-public.embeddablefactory.savedobjectmetadata.md) | SavedObjectMetaData<TSavedObjectAttributes> | | @@ -29,6 +30,8 @@ export interface EmbeddableFactoryThis will likely change in future iterations when we improve in place editing capabilities. | | [createFromSavedObject(savedObjectId, input, parent)](./kibana-plugin-plugins-embeddable-public.embeddablefactory.createfromsavedobject.md) | Creates a new embeddable instance based off the saved object id. | | [getDefaultInput(partial)](./kibana-plugin-plugins-embeddable-public.embeddablefactory.getdefaultinput.md) | Can be used to get any default input, to be passed in to during the creation process. Default input will not be stored in a parent container, so any inherited input from a container will trump default input parameters. | +| [getDescription()](./kibana-plugin-plugins-embeddable-public.embeddablefactory.getdescription.md) | Returns a description about the embeddable. | | [getDisplayName()](./kibana-plugin-plugins-embeddable-public.embeddablefactory.getdisplayname.md) | Returns a display name for this type of embeddable. Used in "Create new... " options in the add panel for containers. | | [getExplicitInput()](./kibana-plugin-plugins-embeddable-public.embeddablefactory.getexplicitinput.md) | Can be used to request explicit input from the user, to be passed in to EmbeddableFactory:create. Explicit input is stored on the parent container for this embeddable. It overrides any inherited input passed down from the parent container. | +| [getIconType()](./kibana-plugin-plugins-embeddable-public.embeddablefactory.geticontype.md) | Returns an EUI Icon type to be displayed in a menu. | diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactorydefinition.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactorydefinition.md index 6ecb88e7c017e..dd61272625160 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactorydefinition.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.embeddablefactorydefinition.md @@ -7,5 +7,5 @@ Signature: ```typescript -export declare type EmbeddableFactoryDefinition = IEmbeddable, T extends SavedObjectAttributes = SavedObjectAttributes> = Pick, 'create' | 'type' | 'isEditable' | 'getDisplayName'> & Partial, 'createFromSavedObject' | 'isContainerType' | 'getExplicitInput' | 'savedObjectMetaData' | 'canCreateNew' | 'getDefaultInput' | 'telemetry' | 'extract' | 'inject' | 'migrations'>>; +export declare type EmbeddableFactoryDefinition = IEmbeddable, T extends SavedObjectAttributes = SavedObjectAttributes> = Pick, 'create' | 'type' | 'isEditable' | 'getDisplayName'> & Partial, 'createFromSavedObject' | 'isContainerType' | 'getExplicitInput' | 'savedObjectMetaData' | 'canCreateNew' | 'getDefaultInput' | 'telemetry' | 'extract' | 'inject' | 'migrations' | 'grouping' | 'getIconType' | 'getDescription'>>; ``` diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.openaddpanelflyout.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.openaddpanelflyout.md index add4646375359..90caaa3035b34 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.openaddpanelflyout.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.openaddpanelflyout.md @@ -14,6 +14,7 @@ export declare function openAddPanelFlyout(options: { overlays: OverlayStart; notifications: NotificationsStart; SavedObjectFinder: React.ComponentType; + showCreateNewMenu?: boolean; }): OverlayRef; ``` @@ -21,7 +22,7 @@ export declare function openAddPanelFlyout(options: { | Parameter | Type | Description | | --- | --- | --- | -| options | {
embeddable: IContainer;
getFactory: EmbeddableStart['getEmbeddableFactory'];
getAllFactories: EmbeddableStart['getEmbeddableFactories'];
overlays: OverlayStart;
notifications: NotificationsStart;
SavedObjectFinder: React.ComponentType<any>;
} | | +| options | {
embeddable: IContainer;
getFactory: EmbeddableStart['getEmbeddableFactory'];
getAllFactories: EmbeddableStart['getEmbeddableFactories'];
overlays: OverlayStart;
notifications: NotificationsStart;
SavedObjectFinder: React.ComponentType<any>;
showCreateNewMenu?: boolean;
} | | Returns: diff --git a/src/plugins/dashboard/kibana.json b/src/plugins/dashboard/kibana.json index 41335069461fa..54eaf461b73d7 100644 --- a/src/plugins/dashboard/kibana.json +++ b/src/plugins/dashboard/kibana.json @@ -11,7 +11,8 @@ "share", "uiActions", "urlForwarding", - "presentationUtil" + "presentationUtil", + "visualizations" ], "optionalPlugins": [ "home", diff --git a/src/plugins/dashboard/public/application/_dashboard_app.scss b/src/plugins/dashboard/public/application/_dashboard_app.scss index 30253afff391f..f6525377cce70 100644 --- a/src/plugins/dashboard/public/application/_dashboard_app.scss +++ b/src/plugins/dashboard/public/application/_dashboard_app.scss @@ -66,4 +66,17 @@ .dshUnsavedListingItem__actions { flex-direction: column; } -} \ No newline at end of file +} + +// Temporary fix for two tone icons to make them monochrome +.dshSolutionToolbar__editorContextMenu--dark { + .euiIcon path { + fill: $euiColorGhost; + } +} + +.dshSolutionToolbar__editorContextMenu--light { + .euiIcon path { + fill: $euiColorInk; + } +} diff --git a/src/plugins/dashboard/public/application/dashboard_router.tsx b/src/plugins/dashboard/public/application/dashboard_router.tsx index e5281a257ee13..ed68afc5e97b1 100644 --- a/src/plugins/dashboard/public/application/dashboard_router.tsx +++ b/src/plugins/dashboard/public/application/dashboard_router.tsx @@ -80,6 +80,7 @@ export async function mountApp({ embeddable: embeddableStart, kibanaLegacy: { dashboardConfig }, savedObjectsTaggingOss, + visualizations, } = pluginsStart; const spacesApi = pluginsStart.spacesOss?.isSpacesAvailable ? pluginsStart.spacesOss : undefined; @@ -123,6 +124,7 @@ export async function mountApp({ visualizeCapabilities: { save: Boolean(coreStart.application.capabilities.visualize?.save) }, storeSearchSession: Boolean(coreStart.application.capabilities.dashboard.storeSearchSession), }, + visualizations, }; const getUrlStateStorage = (history: RouteComponentProps['history']) => diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx index 9b93f0bbd0711..ff592742488f5 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx @@ -49,7 +49,7 @@ export class DashboardContainerFactoryDefinition public readonly getDisplayName = () => { return i18n.translate('dashboard.factory.displayName', { - defaultMessage: 'dashboard', + defaultMessage: 'Dashboard', }); }; diff --git a/src/plugins/dashboard/public/application/embeddable/empty_screen/__snapshots__/dashboard_empty_screen.test.tsx.snap b/src/plugins/dashboard/public/application/embeddable/empty_screen/__snapshots__/dashboard_empty_screen.test.tsx.snap index 4cd3eb13f3609..138d665866af0 100644 --- a/src/plugins/dashboard/public/application/embeddable/empty_screen/__snapshots__/dashboard_empty_screen.test.tsx.snap +++ b/src/plugins/dashboard/public/application/embeddable/empty_screen/__snapshots__/dashboard_empty_screen.test.tsx.snap @@ -287,7 +287,7 @@ exports[`DashboardEmptyScreen renders correctly with edit mode 1`] = `

- Add your first panel + Add your first visualization

().services; const [state, setState] = useState({ chromeIsVisible: false }); const [isSaveInProgress, setIsSaveInProgress] = useState(false); + const lensAlias = visualizations.getAliases().find(({ name }) => name === 'lens'); + const quickButtonVisTypes = ['markdown', 'maps']; const stateTransferService = embeddable.getStateTransfer(); + const IS_DARK_THEME = uiSettings.get('theme:darkMode'); + + const trackUiMetric = usageCollection?.reportUiCounter.bind( + usageCollection, + DashboardConstants.DASHBOARDS_ID + ); useEffect(() => { const visibleSubscription = chrome.getIsVisible$().subscribe((chromeIsVisible) => { @@ -152,27 +161,36 @@ export function DashboardTopNav({ uiSettings, ]); - const createNew = useCallback(async () => { - const type = 'visualization'; - const factory = embeddable.getEmbeddableFactory(type); + const createNewVisType = useCallback( + (visType?: BaseVisType | VisTypeAlias) => () => { + let path = ''; + let appId = ''; - if (!factory) { - throw new EmbeddableFactoryNotFoundError(type); - } + if (visType) { + if (trackUiMetric) { + trackUiMetric(METRIC_TYPE.CLICK, visType.name); + } - await factory.create({} as EmbeddableInput, dashboardContainer); - }, [dashboardContainer, embeddable]); + if ('aliasPath' in visType) { + appId = visType.aliasApp; + path = visType.aliasPath; + } else { + appId = 'visualize'; + path = `#/create?type=${encodeURIComponent(visType.name)}`; + } + } else { + appId = 'visualize'; + path = '#/create?'; + } - const createNewVisType = useCallback( - (newVisType: string) => async () => { - stateTransferService.navigateToEditor('visualize', { - path: `#/create?type=${encodeURIComponent(newVisType)}`, + stateTransferService.navigateToEditor(appId, { + path, state: { originatingApp: DashboardConstants.DASHBOARDS_ID, }, }); }, - [stateTransferService] + [trackUiMetric, stateTransferService] ); const clearAddPanel = useCallback(() => { @@ -563,38 +581,57 @@ export function DashboardTopNav({ const { TopNavMenu } = navigation.ui; - const quickButtons = [ - { - iconType: 'visText', - createType: i18n.translate('dashboard.solutionToolbar.markdownQuickButtonLabel', { - defaultMessage: 'Markdown', - }), - onClick: createNewVisType('markdown'), - 'data-test-subj': 'dashboardMarkdownQuickButton', - }, - { - iconType: 'controlsHorizontal', - createType: i18n.translate('dashboard.solutionToolbar.inputControlsQuickButtonLabel', { - defaultMessage: 'Input control', - }), - onClick: createNewVisType('input_control_vis'), - 'data-test-subj': 'dashboardInputControlsQuickButton', - }, - ]; + const getVisTypeQuickButton = (visTypeName: string) => { + const visType = + visualizations.get(visTypeName) || + visualizations.getAliases().find(({ name }) => name === visTypeName); + + if (visType) { + if ('aliasPath' in visType) { + const { name, icon, title } = visType as VisTypeAlias; + + return { + iconType: icon, + createType: title, + onClick: createNewVisType(visType as VisTypeAlias), + 'data-test-subj': `dashboardQuickButton${name}`, + isDarkModeEnabled: IS_DARK_THEME, + }; + } else { + const { name, icon, title, titleInWizard } = visType as BaseVisType; + + return { + iconType: icon, + createType: titleInWizard || title, + onClick: createNewVisType(visType as BaseVisType), + 'data-test-subj': `dashboardQuickButton${name}`, + isDarkModeEnabled: IS_DARK_THEME, + }; + } + } + + return; + }; + + const quickButtons = quickButtonVisTypes + .map(getVisTypeQuickButton) + .filter((button) => button) as QuickButtonProps[]; return ( <> + {viewMode !== ViewMode.VIEW ? ( - + {{ primaryActionButton: ( ), @@ -605,6 +642,12 @@ export function DashboardTopNav({ data-test-subj="dashboardAddPanelButton" /> ), + extraButtons: [ + , + ], }} ) : null} diff --git a/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx b/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx new file mode 100644 index 0000000000000..5205f5b294c4f --- /dev/null +++ b/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx @@ -0,0 +1,255 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useCallback } from 'react'; +import { + EuiContextMenu, + EuiContextMenuPanelItemDescriptor, + EuiContextMenuItemIcon, +} from '@elastic/eui'; +import { METRIC_TYPE } from '@kbn/analytics'; +import { i18n } from '@kbn/i18n'; +import { BaseVisType, VisGroups, VisTypeAlias } from '../../../../visualizations/public'; +import { SolutionToolbarPopover } from '../../../../presentation_util/public'; +import { EmbeddableFactoryDefinition, EmbeddableInput } from '../../services/embeddable'; +import { useKibana } from '../../services/kibana_react'; +import { DashboardAppServices } from '../types'; +import { DashboardContainer } from '..'; +import { DashboardConstants } from '../../dashboard_constants'; +import { dashboardReplacePanelAction } from '../../dashboard_strings'; + +interface Props { + /** Dashboard container */ + dashboardContainer: DashboardContainer; + /** Handler for creating new visualization of a specified type */ + createNewVisType: (visType: BaseVisType | VisTypeAlias) => () => void; +} + +interface FactoryGroup { + id: string; + appName: string; + icon: EuiContextMenuItemIcon; + panelId: number; + factories: EmbeddableFactoryDefinition[]; +} + +export const EditorMenu = ({ dashboardContainer, createNewVisType }: Props) => { + const { + core, + embeddable, + visualizations, + usageCollection, + uiSettings, + } = useKibana().services; + + const IS_DARK_THEME = uiSettings.get('theme:darkMode'); + + const trackUiMetric = usageCollection?.reportUiCounter.bind( + usageCollection, + DashboardConstants.DASHBOARDS_ID + ); + + const createNewAggsBasedVis = useCallback( + (visType?: BaseVisType) => () => + visualizations.showNewVisModal({ + originatingApp: DashboardConstants.DASHBOARDS_ID, + outsideVisualizeApp: true, + showAggsSelection: true, + selectedVisType: visType, + }), + [visualizations] + ); + + const getVisTypesByGroup = (group: VisGroups) => + visualizations + .getByGroup(group) + .sort(({ name: a }: BaseVisType | VisTypeAlias, { name: b }: BaseVisType | VisTypeAlias) => { + if (a < b) { + return -1; + } + if (a > b) { + return 1; + } + return 0; + }) + .filter(({ hidden }: BaseVisType) => !hidden); + + const promotedVisTypes = getVisTypesByGroup(VisGroups.PROMOTED); + const aggsBasedVisTypes = getVisTypesByGroup(VisGroups.AGGBASED); + const toolVisTypes = getVisTypesByGroup(VisGroups.TOOLS); + const visTypeAliases = visualizations + .getAliases() + .sort(({ promotion: a = false }: VisTypeAlias, { promotion: b = false }: VisTypeAlias) => + a === b ? 0 : a ? -1 : 1 + ); + + const factories = embeddable + ? Array.from(embeddable.getEmbeddableFactories()).filter( + ({ type, isEditable, canCreateNew, isContainerType }) => + isEditable() && !isContainerType && canCreateNew() && type !== 'visualization' + ) + : []; + + const factoryGroupMap: Record = {}; + const ungroupedFactories: EmbeddableFactoryDefinition[] = []; + const aggBasedPanelID = 1; + + let panelCount = 1 + aggBasedPanelID; + + factories.forEach((factory: EmbeddableFactoryDefinition, index) => { + const { grouping } = factory; + + if (grouping) { + grouping.forEach((group) => { + if (factoryGroupMap[group.id]) { + factoryGroupMap[group.id].factories.push(factory); + } else { + factoryGroupMap[group.id] = { + id: group.id, + appName: group.getDisplayName ? group.getDisplayName({ embeddable }) : group.id, + icon: (group.getIconType + ? group.getIconType({ embeddable }) + : 'empty') as EuiContextMenuItemIcon, + factories: [factory], + panelId: panelCount, + }; + + panelCount++; + } + }); + } else { + ungroupedFactories.push(factory); + } + }); + + const getVisTypeMenuItem = (visType: BaseVisType): EuiContextMenuPanelItemDescriptor => { + const { name, title, titleInWizard, description, icon = 'empty', group } = visType; + return { + name: titleInWizard || title, + icon: icon as string, + onClick: + group === VisGroups.AGGBASED ? createNewAggsBasedVis(visType) : createNewVisType(visType), + 'data-test-subj': `visType-${name}`, + toolTipContent: description, + }; + }; + + const getVisTypeAliasMenuItem = ( + visTypeAlias: VisTypeAlias + ): EuiContextMenuPanelItemDescriptor => { + const { name, title, description, icon = 'empty' } = visTypeAlias; + + return { + name: title, + icon, + onClick: createNewVisType(visTypeAlias), + 'data-test-subj': `visType-${name}`, + toolTipContent: description, + }; + }; + + const getEmbeddableFactoryMenuItem = ( + factory: EmbeddableFactoryDefinition + ): EuiContextMenuPanelItemDescriptor => { + const icon = factory?.getIconType ? factory.getIconType() : 'empty'; + + const toolTipContent = factory?.getDescription ? factory.getDescription() : undefined; + + return { + name: factory.getDisplayName(), + icon, + toolTipContent, + onClick: async () => { + if (trackUiMetric) { + trackUiMetric(METRIC_TYPE.CLICK, factory.type); + } + let newEmbeddable; + if (factory.getExplicitInput) { + const explicitInput = await factory.getExplicitInput(); + newEmbeddable = await dashboardContainer.addNewEmbeddable(factory.type, explicitInput); + } else { + newEmbeddable = await factory.create({} as EmbeddableInput, dashboardContainer); + } + + if (newEmbeddable) { + core.notifications.toasts.addSuccess({ + title: dashboardReplacePanelAction.getSuccessMessage( + `'${newEmbeddable.getInput().title}'` || '' + ), + 'data-test-subj': 'addEmbeddableToDashboardSuccess', + }); + } + }, + 'data-test-subj': `createNew-${factory.type}`, + }; + }; + + const aggsPanelTitle = i18n.translate('dashboard.editorMenu.aggBasedGroupTitle', { + defaultMessage: 'Aggregation based', + }); + + const editorMenuPanels = [ + { + id: 0, + items: [ + ...visTypeAliases.map(getVisTypeAliasMenuItem), + ...Object.values(factoryGroupMap).map(({ id, appName, icon, panelId }) => ({ + name: appName, + icon, + panel: panelId, + 'data-test-subj': `dashboardEditorMenu-${id}Group`, + })), + ...ungroupedFactories.map(getEmbeddableFactoryMenuItem), + ...promotedVisTypes.map(getVisTypeMenuItem), + { + name: aggsPanelTitle, + icon: 'visualizeApp', + panel: aggBasedPanelID, + 'data-test-subj': `dashboardEditorAggBasedMenuItem`, + }, + ...toolVisTypes.map(getVisTypeMenuItem), + ], + }, + { + id: aggBasedPanelID, + title: aggsPanelTitle, + items: aggsBasedVisTypes.map(getVisTypeMenuItem), + }, + ...Object.values(factoryGroupMap).map( + ({ appName, panelId, factories: groupFactories }: FactoryGroup) => ({ + id: panelId, + title: appName, + items: groupFactories.map(getEmbeddableFactoryMenuItem), + }) + ), + ]; + + return ( + + + + ); +}; diff --git a/src/plugins/dashboard/public/application/types.ts b/src/plugins/dashboard/public/application/types.ts index 6415fdfd73ee8..dd291291ce9d6 100644 --- a/src/plugins/dashboard/public/application/types.ts +++ b/src/plugins/dashboard/public/application/types.ts @@ -25,6 +25,7 @@ import { DataPublicPluginStart, IndexPatternsContract } from '../services/data'; import { SavedObjectLoader, SavedObjectsStart } from '../services/saved_objects'; import { DashboardPanelStorage } from './lib'; import { UrlForwardingStart } from '../../../url_forwarding/public'; +import { VisualizationsStart } from '../../../visualizations/public'; export type DashboardRedirect = (props: RedirectToProps) => void; export type RedirectToProps = @@ -83,4 +84,5 @@ export interface DashboardAppServices { savedObjectsClient: SavedObjectsClientContract; setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; savedQueryService: DataPublicPluginStart['query']['savedQueries']; + visualizations: VisualizationsStart; } diff --git a/src/plugins/dashboard/public/dashboard_strings.ts b/src/plugins/dashboard/public/dashboard_strings.ts index 79a59d0cfa605..531ff815312cf 100644 --- a/src/plugins/dashboard/public/dashboard_strings.ts +++ b/src/plugins/dashboard/public/dashboard_strings.ts @@ -377,7 +377,7 @@ export const emptyScreenStrings = { }), getEmptyWidgetTitle: () => i18n.translate('dashboard.emptyWidget.addPanelTitle', { - defaultMessage: 'Add your first panel', + defaultMessage: 'Add your first visualization', }), getEmptyWidgetDescription: () => i18n.translate('dashboard.emptyWidget.addPanelDescription', { diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index e2f52a47455b3..0fad1c51f433a 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -24,6 +24,7 @@ import { PluginInitializerContext, SavedObjectsClientContract, } from '../../../core/public'; +import { VisualizationsStart } from '../../visualizations/public'; import { createKbnUrlTracker } from './services/kibana_utils'; import { UsageCollectionSetup } from './services/usage_collection'; @@ -115,6 +116,7 @@ export interface DashboardStartDependencies { presentationUtil: PresentationUtilPluginStart; savedObjectsTaggingOss?: SavedObjectTaggingOssPluginStart; spacesOss?: SpacesOssPluginStart; + visualizations: VisualizationsStart; } export type DashboardSetup = void; diff --git a/src/plugins/embeddable/public/lib/embeddables/default_embeddable_factory_provider.ts b/src/plugins/embeddable/public/lib/embeddables/default_embeddable_factory_provider.ts index 27164b3cddbc2..b260c594591fa 100644 --- a/src/plugins/embeddable/public/lib/embeddables/default_embeddable_factory_provider.ts +++ b/src/plugins/embeddable/public/lib/embeddables/default_embeddable_factory_provider.ts @@ -37,11 +37,14 @@ export const defaultEmbeddableFactoryProvider = < type: def.type, isEditable: def.isEditable.bind(def), getDisplayName: def.getDisplayName.bind(def), + getDescription: def.getDescription ? def.getDescription.bind(def) : () => '', + getIconType: def.getIconType ? def.getIconType.bind(def) : () => 'empty', savedObjectMetaData: def.savedObjectMetaData, telemetry: def.telemetry || (() => ({})), inject: def.inject || ((state: EmbeddableStateWithType) => state), extract: def.extract || ((state: EmbeddableStateWithType) => ({ state, references: [] })), migrations: def.migrations || {}, + grouping: def.grouping, }; return factory; }; diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts b/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts index 7f3277130f90f..6ec035f442dd2 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts @@ -14,6 +14,7 @@ import { IContainer } from '../containers/i_container'; import { PropertySpec } from '../types'; import { PersistableState } from '../../../../kibana_utils/common'; import { EmbeddableStateWithType } from '../../../common/types'; +import { UiActionsPresentableGrouping } from '../../../../ui_actions/public'; export interface EmbeddableInstanceConfiguration { id: string; @@ -48,6 +49,12 @@ export interface EmbeddableFactory< readonly savedObjectMetaData?: SavedObjectMetaData; + /** + * Indicates the grouping this factory should appear in a sub-menu. Example, this is used for grouping + * options in the editors menu in Dashboard for creating new embeddables + */ + readonly grouping?: UiActionsPresentableGrouping; + /** * True if is this factory create embeddables that are Containers. Used in the add panel to * conditionally show whether these can be added to another container. It's just not @@ -62,6 +69,16 @@ export interface EmbeddableFactory< */ getDisplayName(): string; + /** + * Returns an EUI Icon type to be displayed in a menu. + */ + getIconType(): string; + + /** + * Returns a description about the embeddable. + */ + getDescription(): string; + /** * If false, this type of embeddable can't be created with the "createNew" functionality. Instead, * use createFromSavedObject, where an existing saved object must first exist. diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable_factory_definition.ts b/src/plugins/embeddable/public/lib/embeddables/embeddable_factory_definition.ts index a64aa32c6e7c4..f2819f2a2e664 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable_factory_definition.ts +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable_factory_definition.ts @@ -33,5 +33,8 @@ export type EmbeddableFactoryDefinition< | 'extract' | 'inject' | 'migrations' + | 'grouping' + | 'getIconType' + | 'getDescription' > >; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx index 432897763aa04..1c96945f014c8 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx @@ -61,6 +61,7 @@ test('createNewEmbeddable() add embeddable to container', async () => { getAllFactories={start.getEmbeddableFactories} notifications={core.notifications} SavedObjectFinder={() => null} + showCreateNewMenu /> ) as ReactWrapper; @@ -112,6 +113,7 @@ test('selecting embeddable in "Create new ..." list calls createNewEmbeddable()' getAllFactories={start.getEmbeddableFactories} notifications={core.notifications} SavedObjectFinder={(props) => } + showCreateNewMenu /> ) as ReactWrapper; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx index 8caec4a4428c3..6d6a68d7e5e2a 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx @@ -26,6 +26,7 @@ interface Props { getAllFactories: EmbeddableStart['getEmbeddableFactories']; notifications: CoreSetup['notifications']; SavedObjectFinder: React.ComponentType; + showCreateNewMenu?: boolean; } interface State { @@ -134,7 +135,9 @@ export class AddPanelFlyout extends React.Component { defaultMessage: 'No matching objects found.', })} > - + {this.props.showCreateNewMenu ? ( + + ) : null} ); diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx index bed97c82095c7..f0c6e81644b3d 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx @@ -20,6 +20,7 @@ export function openAddPanelFlyout(options: { overlays: OverlayStart; notifications: NotificationsStart; SavedObjectFinder: React.ComponentType; + showCreateNewMenu?: boolean; }): OverlayRef { const { embeddable, @@ -28,6 +29,7 @@ export function openAddPanelFlyout(options: { overlays, notifications, SavedObjectFinder, + showCreateNewMenu, } = options; const flyoutSession = overlays.openFlyout( toMountPoint( @@ -42,6 +44,7 @@ export function openAddPanelFlyout(options: { getAllFactories={getAllFactories} notifications={notifications} SavedObjectFinder={SavedObjectFinder} + showCreateNewMenu={showCreateNewMenu} /> ), { diff --git a/src/plugins/embeddable/public/public.api.md b/src/plugins/embeddable/public/public.api.md index 220039de2f34e..d522a4e5fa8e8 100644 --- a/src/plugins/embeddable/public/public.api.md +++ b/src/plugins/embeddable/public/public.api.md @@ -378,8 +378,12 @@ export interface EmbeddableFactory; createFromSavedObject(savedObjectId: string, input: Partial, parent?: IContainer): Promise; getDefaultInput(partial: Partial): Partial; + getDescription(): string; getDisplayName(): string; getExplicitInput(): Promise>; + getIconType(): string; + // Warning: (ae-forgotten-export) The symbol "PresentableGrouping" needs to be exported by the entry point index.d.ts + readonly grouping?: PresentableGrouping; readonly isContainerType: boolean; readonly isEditable: () => Promise; // Warning: (ae-forgotten-export) The symbol "SavedObjectMetaData" needs to be exported by the entry point index.d.ts @@ -393,7 +397,7 @@ export interface EmbeddableFactory = IEmbeddable, T extends SavedObjectAttributes = SavedObjectAttributes> = Pick, 'create' | 'type' | 'isEditable' | 'getDisplayName'> & Partial, 'createFromSavedObject' | 'isContainerType' | 'getExplicitInput' | 'savedObjectMetaData' | 'canCreateNew' | 'getDefaultInput' | 'telemetry' | 'extract' | 'inject' | 'migrations'>>; +export type EmbeddableFactoryDefinition = IEmbeddable, T extends SavedObjectAttributes = SavedObjectAttributes> = Pick, 'create' | 'type' | 'isEditable' | 'getDisplayName'> & Partial, 'createFromSavedObject' | 'isContainerType' | 'getExplicitInput' | 'savedObjectMetaData' | 'canCreateNew' | 'getDefaultInput' | 'telemetry' | 'extract' | 'inject' | 'migrations' | 'grouping' | 'getIconType' | 'getDescription'>>; // Warning: (ae-missing-release-tag) "EmbeddableFactoryNotFoundError" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -724,6 +728,7 @@ export function openAddPanelFlyout(options: { overlays: OverlayStart_2; notifications: NotificationsStart_2; SavedObjectFinder: React.ComponentType; + showCreateNewMenu?: boolean; }): OverlayRef_2; // Warning: (ae-missing-release-tag) "OutputSpec" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/button.scss b/src/plugins/presentation_util/public/components/solution_toolbar/items/button.scss index 79c3d4cca7ace..b8022201acf59 100644 --- a/src/plugins/presentation_util/public/components/solution_toolbar/items/button.scss +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/button.scss @@ -1,4 +1,3 @@ - .solutionToolbarButton { line-height: $euiButtonHeight; // Keeps alignment of text and chart icon background-color: $euiColorEmptyShade; diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/button.tsx b/src/plugins/presentation_util/public/components/solution_toolbar/items/button.tsx index 5de8e24ef5f0d..ee1bbd64b5f87 100644 --- a/src/plugins/presentation_util/public/components/solution_toolbar/items/button.tsx +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/button.tsx @@ -12,17 +12,19 @@ import { EuiButtonPropsForButton } from '@elastic/eui/src/components/button/butt import './button.scss'; -export interface Props extends Pick { +export interface Props + extends Pick { label: string; primary?: boolean; + isDarkModeEnabled?: boolean; } -export const SolutionToolbarButton = ({ label, primary, ...rest }: Props) => ( +export const SolutionToolbarButton = ({ label, primary, className, ...rest }: Props) => ( {label} diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/popover.tsx b/src/plugins/presentation_util/public/components/solution_toolbar/items/popover.tsx index fbb34e165190d..33850005b498b 100644 --- a/src/plugins/presentation_util/public/components/solution_toolbar/items/popover.tsx +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/popover.tsx @@ -20,14 +20,20 @@ type AllowedPopoverProps = Omit< export type Props = AllowedButtonProps & AllowedPopoverProps; -export const SolutionToolbarPopover = ({ label, iconType, primary, ...popover }: Props) => { +export const SolutionToolbarPopover = ({ + label, + iconType, + primary, + iconSide, + ...popover +}: Props) => { const [isOpen, setIsOpen] = useState(false); const onButtonClick = () => setIsOpen((status) => !status); const closePopover = () => setIsOpen(false); const button = ( - + ); return ( diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.scss b/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.scss new file mode 100644 index 0000000000000..c3d89f430d70c --- /dev/null +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.scss @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// Temporary fix for lensApp icon not support ghost color +.solutionToolbar__primaryButton--dark { + .euiIcon path { + fill: $euiColorInk; + } +} + +.solutionToolbar__primaryButton--light { + .euiIcon path { + fill: $euiColorGhost; + } +} diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.tsx b/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.tsx index e2ef75e45a404..dcf16228ac63b 100644 --- a/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.tsx +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/primary_button.tsx @@ -10,6 +10,20 @@ import React from 'react'; import { SolutionToolbarButton, Props as SolutionToolbarButtonProps } from './button'; -export const PrimaryActionButton = (props: Omit) => ( - +import './primary_button.scss'; + +export interface Props extends Omit { + isDarkModeEnabled?: boolean; +} + +export const PrimaryActionButton = ({ isDarkModeEnabled, ...props }: Props) => ( + ); diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.scss b/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.scss index 639ff5bf2a117..870a9a945ed5d 100644 --- a/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.scss +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.scss @@ -2,4 +2,17 @@ .quickButtonGroup__button { background-color: $euiColorEmptyShade; } + + // Temporary fix for two tone icons to make them monochrome + .quickButtonGroup__button--dark { + .euiIcon path { + fill: $euiColorGhost; + } + } + // Temporary fix for two tone icons to make them monochrome + .quickButtonGroup__button--light { + .euiIcon path { + fill: $euiColorInk; + } + } } diff --git a/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.tsx b/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.tsx index 58f8bd803b636..eb0a395548cd9 100644 --- a/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.tsx +++ b/src/plugins/presentation_util/public/components/solution_toolbar/items/quick_group.tsx @@ -17,23 +17,27 @@ import './quick_group.scss'; export interface QuickButtonProps extends Pick { createType: string; onClick: () => void; + isDarkModeEnabled?: boolean; } export interface Props { buttons: QuickButtonProps[]; } -type Option = EuiButtonGroupOptionProps & Omit; +type Option = EuiButtonGroupOptionProps & + Omit; export const QuickButtonGroup = ({ buttons }: Props) => { const buttonGroupOptions: Option[] = buttons.map((button: QuickButtonProps, index) => { - const { createType: label, ...rest } = button; + const { createType: label, isDarkModeEnabled, ...rest } = button; const title = strings.getAriaButtonLabel(label); return { ...rest, 'aria-label': title, - className: 'quickButtonGroup__button', + className: `quickButtonGroup__button ${ + isDarkModeEnabled ? 'quickButtonGroup__button--dark' : 'quickButtonGroup__button--light' + }`, id: `${htmlIdGenerator()()}${index}`, label, title, @@ -46,7 +50,7 @@ export const QuickButtonGroup = ({ buttons }: Props) => { return ( { +export const SolutionToolbar = ({ isDarkModeEnabled, children }: Props) => { const { primaryActionButton, quickButtonGroup, @@ -49,8 +50,10 @@ export const SolutionToolbar = ({ children }: Props) => { return ( {primaryActionButton} diff --git a/src/plugins/presentation_util/public/index.ts b/src/plugins/presentation_util/public/index.ts index 9c5f65de40955..fd3ae89419297 100644 --- a/src/plugins/presentation_util/public/index.ts +++ b/src/plugins/presentation_util/public/index.ts @@ -19,6 +19,7 @@ export { LazySavedObjectSaveModalDashboard, withSuspense, } from './components'; + export { AddFromLibraryButton, PrimaryActionButton, diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx index 2b5a611cd946e..48bff8d203ebd 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx @@ -113,7 +113,7 @@ export class VisualizeEmbeddableFactory public getDisplayName() { return i18n.translate('visualizations.displayName', { - defaultMessage: 'visualization', + defaultMessage: 'Visualization', }); } diff --git a/src/plugins/visualizations/public/index.ts b/src/plugins/visualizations/public/index.ts index e5b1ba73d9d1c..dbcbb864d2316 100644 --- a/src/plugins/visualizations/public/index.ts +++ b/src/plugins/visualizations/public/index.ts @@ -25,7 +25,7 @@ export { getVisSchemas } from './vis_schemas'; /** @public types */ export { VisualizationsSetup, VisualizationsStart }; export { VisGroups } from './vis_types'; -export type { VisTypeAlias, VisTypeDefinition, Schema, ISchemas } from './vis_types'; +export type { BaseVisType, VisTypeAlias, VisTypeDefinition, Schema, ISchemas } from './vis_types'; export { SerializedVis, SerializedVisData, VisData } from './vis'; export type VisualizeEmbeddableFactoryContract = PublicContract; export type VisualizeEmbeddableContract = PublicContract; diff --git a/src/plugins/visualizations/public/wizard/dialog_navigation.tsx b/src/plugins/visualizations/public/wizard/dialog_navigation.tsx index 1de177e12f40d..c92514d54166f 100644 --- a/src/plugins/visualizations/public/wizard/dialog_navigation.tsx +++ b/src/plugins/visualizations/public/wizard/dialog_navigation.tsx @@ -24,7 +24,7 @@ function DialogNavigation(props: DialogNavigationProps) { {i18n.translate('visualizations.newVisWizard.goBackLink', { - defaultMessage: 'Go back', + defaultMessage: 'Select a different visualization', })} diff --git a/src/plugins/visualizations/public/wizard/new_vis_modal.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx index d36b734f75be2..317f9d1bb363d 100644 --- a/src/plugins/visualizations/public/wizard/new_vis_modal.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx @@ -41,6 +41,8 @@ interface TypeSelectionProps { outsideVisualizeApp?: boolean; stateTransfer?: EmbeddableStateTransfer; originatingApp?: string; + showAggsSelection?: boolean; + selectedVisType?: BaseVisType; } interface TypeSelectionState { @@ -69,8 +71,9 @@ class NewVisModal extends React.Component import('./new_vis_modal')); @@ -29,6 +30,8 @@ export interface ShowNewVisModalParams { originatingApp?: string; outsideVisualizeApp?: boolean; createByValue?: boolean; + showAggsSelection?: boolean; + selectedVisType?: BaseVisType; } /** @@ -41,6 +44,8 @@ export function showNewVisModal({ onClose, originatingApp, outsideVisualizeApp, + showAggsSelection, + selectedVisType, }: ShowNewVisModalParams = {}) { const container = document.createElement('div'); let isClosed = false; @@ -78,6 +83,8 @@ export function showNewVisModal({ usageCollection={getUsageCollector()} application={getApplication()} docLinks={getDocLinks()} + showAggsSelection={showAggsSelection} + selectedVisType={selectedVisType} /> diff --git a/test/examples/embeddables/adding_children.ts b/test/examples/embeddables/adding_children.ts index 8b59012bf9825..ee06622a33f51 100644 --- a/test/examples/embeddables/adding_children.ts +++ b/test/examples/embeddables/adding_children.ts @@ -13,31 +13,12 @@ import { PluginFunctionalProviderContext } from 'test/plugin_functional/services export default function ({ getService }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); const flyout = getService('flyout'); - const retry = getService('retry'); - describe('creating and adding children', () => { + describe('adding children', () => { before(async () => { await testSubjects.click('embeddablePanelExample'); }); - it('Can create a new child', async () => { - await testSubjects.click('embeddablePanelToggleMenuIcon'); - await testSubjects.click('embeddablePanelAction-ACTION_ADD_PANEL'); - - // this seem like an overkill, but clicking this button which opens context menu was flaky - await testSubjects.waitForEnabled('createNew'); - await retry.waitFor('createNew popover opened', async () => { - await testSubjects.click('createNew'); - return await testSubjects.exists('createNew-TODO_EMBEDDABLE'); - }); - await testSubjects.click('createNew-TODO_EMBEDDABLE'); - - await testSubjects.setValue('taskInputField', 'new task'); - await testSubjects.click('createTodoEmbeddable'); - const tasks = await testSubjects.getVisibleTextAll('todoEmbeddableTask'); - expect(tasks).to.eql(['Goes out on Wednesdays!', 'new task']); - }); - it('Can add a child backed off a saved object', async () => { await testSubjects.click('embeddablePanelToggleMenuIcon'); await testSubjects.click('embeddablePanelAction-ACTION_ADD_PANEL'); @@ -46,7 +27,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { await testSubjects.moveMouseTo('euiFlyoutCloseButton'); await flyout.ensureClosed('dashboardAddPanel'); const tasks = await testSubjects.getVisibleTextAll('todoEmbeddableTask'); - expect(tasks).to.eql(['Goes out on Wednesdays!', 'new task', 'Take the garbage out']); + expect(tasks).to.eql(['Goes out on Wednesdays!', 'Take the garbage out']); }); }); } diff --git a/test/functional/apps/dashboard/create_and_add_embeddables.ts b/test/functional/apps/dashboard/create_and_add_embeddables.ts index 9b8fc4785a671..3de3b2f843f55 100644 --- a/test/functional/apps/dashboard/create_and_add_embeddables.ts +++ b/test/functional/apps/dashboard/create_and_add_embeddables.ts @@ -35,8 +35,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('adds new visualization via the top nav link', async () => { const originalPanelCount = await PageObjects.dashboard.getPanelCount(); await PageObjects.dashboard.switchToEditMode(); - await dashboardAddPanel.clickCreateNewLink(); - await PageObjects.visualize.clickAggBasedVisualizations(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualizationExpectSuccess( @@ -52,9 +52,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('adds a new visualization', async () => { const originalPanelCount = await PageObjects.dashboard.getPanelCount(); - await dashboardAddPanel.ensureAddPanelIsShowing(); - await dashboardAddPanel.clickAddNewEmbeddableLink('visualization'); - await PageObjects.visualize.clickAggBasedVisualizations(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualizationExpectSuccess( @@ -71,7 +70,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('adds a markdown visualization via the quick button', async () => { const originalPanelCount = await PageObjects.dashboard.getPanelCount(); - await PageObjects.dashboard.clickMarkdownQuickButton(); + await dashboardAddPanel.clickMarkdownQuickButton(); await PageObjects.visualize.saveVisualizationExpectSuccess( 'visualization from markdown quick button', { redirectToOrigin: true } @@ -84,21 +83,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.waitForRenderComplete(); }); - it('adds an input control visualization via the quick button', async () => { - const originalPanelCount = await PageObjects.dashboard.getPanelCount(); - await PageObjects.dashboard.clickInputControlsQuickButton(); - await PageObjects.visualize.saveVisualizationExpectSuccess( - 'visualization from input control quick button', - { redirectToOrigin: true } - ); - - await retry.try(async () => { - const panelCount = await PageObjects.dashboard.getPanelCount(); - expect(panelCount).to.eql(originalPanelCount + 1); - }); - await PageObjects.dashboard.waitForRenderComplete(); - }); - it('saves the listing page instead of the visualization to the app link', async () => { await PageObjects.header.clickVisualize(true); const currentUrl = await browser.getCurrentUrl(); diff --git a/test/functional/apps/dashboard/dashboard_unsaved_listing.ts b/test/functional/apps/dashboard/dashboard_unsaved_listing.ts index 233d2e91467fe..1cdc4bbff2c53 100644 --- a/test/functional/apps/dashboard/dashboard_unsaved_listing.ts +++ b/test/functional/apps/dashboard/dashboard_unsaved_listing.ts @@ -25,8 +25,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('dashboard unsaved listing', () => { const addSomePanels = async () => { // add an area chart by value - await dashboardAddPanel.clickCreateNewLink(); - await PageObjects.visualize.clickAggBasedVisualizations(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualizationAndReturn(); @@ -132,8 +132,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.switchToEditMode(); // add another panel so we can delete it later - await dashboardAddPanel.clickCreateNewLink(); - await PageObjects.visualize.clickAggBasedVisualizations(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualizationExpectSuccess('Wildvis', { diff --git a/test/functional/apps/dashboard/dashboard_unsaved_state.ts b/test/functional/apps/dashboard/dashboard_unsaved_state.ts index e6cc91880010a..fd203cd8c1356 100644 --- a/test/functional/apps/dashboard/dashboard_unsaved_state.ts +++ b/test/functional/apps/dashboard/dashboard_unsaved_state.ts @@ -41,8 +41,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('shows the unsaved changes badge after adding panels', async () => { await PageObjects.dashboard.switchToEditMode(); // add an area chart by value - await dashboardAddPanel.clickCreateNewLink(); - await PageObjects.visualize.clickAggBasedVisualizations(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualizationAndReturn(); diff --git a/test/functional/apps/dashboard/edit_embeddable_redirects.ts b/test/functional/apps/dashboard/edit_embeddable_redirects.ts index 8b7b98a59aa12..be540e18a503f 100644 --- a/test/functional/apps/dashboard/edit_embeddable_redirects.ts +++ b/test/functional/apps/dashboard/edit_embeddable_redirects.ts @@ -13,10 +13,9 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['dashboard', 'header', 'visualize', 'settings', 'common']); const esArchiver = getService('esArchiver'); - const testSubjects = getService('testSubjects'); const kibanaServer = getService('kibanaServer'); const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardVisualizations = getService('dashboardVisualizations'); + const dashboardAddPanel = getService('dashboardAddPanel'); describe('edit embeddable redirects', () => { before(async () => { @@ -88,10 +87,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const newTitle = 'test create panel originatingApp'; await PageObjects.dashboard.loadSavedDashboard('few panels'); await PageObjects.dashboard.switchToEditMode(); - await testSubjects.exists('dashboardAddNewPanelButton'); - await testSubjects.click('dashboardAddNewPanelButton'); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickMarkdownWidget(); + await dashboardAddPanel.clickMarkdownQuickButton(); await PageObjects.visualize.saveVisualizationExpectSuccess(newTitle, { saveAsNew: true, redirectToOrigin: false, diff --git a/test/functional/apps/dashboard/edit_visualizations.js b/test/functional/apps/dashboard/edit_visualizations.js index ce32f53587e74..b2f21aefcf79c 100644 --- a/test/functional/apps/dashboard/edit_visualizations.js +++ b/test/functional/apps/dashboard/edit_visualizations.js @@ -14,13 +14,14 @@ export default function ({ getService, getPageObjects }) { const testSubjects = getService('testSubjects'); const appsMenu = getService('appsMenu'); const kibanaServer = getService('kibanaServer'); + const dashboardAddPanel = getService('dashboardAddPanel'); const dashboardPanelActions = getService('dashboardPanelActions'); const originalMarkdownText = 'Original markdown text'; const modifiedMarkdownText = 'Modified markdown text'; const createMarkdownVis = async (title) => { - await PageObjects.dashboard.clickMarkdownQuickButton(); + await dashboardAddPanel.clickMarkdownQuickButton(); await PageObjects.visEditor.setMarkdownTxt(originalMarkdownText); await PageObjects.visEditor.clickGo(); if (title) { diff --git a/test/functional/apps/dashboard/empty_dashboard.ts b/test/functional/apps/dashboard/empty_dashboard.ts index c096d90aa3595..2cfa6d73dcb72 100644 --- a/test/functional/apps/dashboard/empty_dashboard.ts +++ b/test/functional/apps/dashboard/empty_dashboard.ts @@ -41,15 +41,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should open add panel when add button is clicked', async () => { - await testSubjects.click('dashboardAddPanelButton'); + await dashboardAddPanel.clickOpenAddPanel(); const isAddPanelOpen = await dashboardAddPanel.isAddPanelOpen(); expect(isAddPanelOpen).to.be(true); await testSubjects.click('euiFlyoutCloseButton'); }); it('should add new visualization from dashboard', async () => { - await testSubjects.exists('dashboardAddNewPanelButton'); - await testSubjects.click('dashboardAddNewPanelButton'); await dashboardVisualizations.createAndAddMarkdown({ name: 'Dashboard Test Markdown', markdown: 'Markdown text', @@ -57,5 +55,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.waitForRenderComplete(); await dashboardExpect.markdownWithValuesExists(['Markdown text']); }); + + it('should open editor menu when editor button is clicked', async () => { + await dashboardAddPanel.clickEditorMenuButton(); + await testSubjects.existOrFail('dashboardEditorContextMenu'); + }); }); } diff --git a/test/functional/apps/dashboard/view_edit.ts b/test/functional/apps/dashboard/view_edit.ts index c5c7daab27ff1..99a78ebd069c5 100644 --- a/test/functional/apps/dashboard/view_edit.ts +++ b/test/functional/apps/dashboard/view_edit.ts @@ -113,10 +113,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('when a new vis is added', async function () { const originalPanelCount = await PageObjects.dashboard.getPanelCount(); - - await dashboardAddPanel.ensureAddPanelIsShowing(); - await dashboardAddPanel.clickAddNewEmbeddableLink('visualization'); - await PageObjects.visualize.clickAggBasedVisualizations(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualizationExpectSuccess('new viz panel', { diff --git a/test/functional/page_objects/dashboard_page.ts b/test/functional/page_objects/dashboard_page.ts index 34559afdf6ae1..9c12296db138c 100644 --- a/test/functional/page_objects/dashboard_page.ts +++ b/test/functional/page_objects/dashboard_page.ts @@ -413,16 +413,6 @@ export function DashboardPageProvider({ getService, getPageObjects }: FtrProvide await testSubjects.click('confirmSaveSavedObjectButton'); } - public async clickMarkdownQuickButton() { - log.debug('Click markdown quick button'); - await testSubjects.click('dashboardMarkdownQuickButton'); - } - - public async clickInputControlsQuickButton() { - log.debug('Click input controls quick button'); - await testSubjects.click('dashboardInputControlsQuickButton'); - } - /** * * @param dashboardTitle {String} diff --git a/test/functional/services/dashboard/add_panel.ts b/test/functional/services/dashboard/add_panel.ts index 7bb1603e0193f..a4e0c8b2647dd 100644 --- a/test/functional/services/dashboard/add_panel.ts +++ b/test/functional/services/dashboard/add_panel.ts @@ -30,15 +30,41 @@ export function DashboardAddPanelProvider({ getService, getPageObjects }: FtrPro await PageObjects.common.sleep(500); } + async clickQuickButton(visType: string) { + log.debug(`DashboardAddPanel.clickQuickButton${visType}`); + await testSubjects.click(`dashboardQuickButton${visType}`); + } + + async clickMarkdownQuickButton() { + await this.clickQuickButton('markdown'); + } + + async clickMapQuickButton() { + await this.clickQuickButton('map'); + } + + async clickEditorMenuButton() { + log.debug('DashboardAddPanel.clickEditorMenuButton'); + await testSubjects.click('dashboardEditorMenuButton'); + } + + async clickAggBasedVisualizations() { + log.debug('DashboardAddPanel.clickEditorMenuAggBasedMenuItem'); + await testSubjects.click('dashboardEditorAggBasedMenuItem'); + } + async clickVisType(visType: string) { log.debug('DashboardAddPanel.clickVisType'); await testSubjects.click(`visType-${visType}`); } + async clickEmbeddableFactoryGroupButton(groupId: string) { + log.debug('DashboardAddPanel.clickEmbeddableFactoryGroupButton'); + await testSubjects.click(`dashboardEditorMenu-${groupId}Group`); + } + async clickAddNewEmbeddableLink(type: string) { - await testSubjects.click('createNew'); await testSubjects.click(`createNew-${type}`); - await testSubjects.missingOrFail(`createNew-${type}`); } async toggleFilterPopover() { diff --git a/test/functional/services/dashboard/visualizations.ts b/test/functional/services/dashboard/visualizations.ts index d1aaa6aa1bd70..2bf7458ff9c5f 100644 --- a/test/functional/services/dashboard/visualizations.ts +++ b/test/functional/services/dashboard/visualizations.ts @@ -10,8 +10,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export function DashboardVisualizationProvider({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); - const find = getService('find'); - const retry = getService('retry'); const queryBar = getService('queryBar'); const testSubjects = getService('testSubjects'); const dashboardAddPanel = getService('dashboardAddPanel'); @@ -31,8 +29,8 @@ export function DashboardVisualizationProvider({ getService, getPageObjects }: F if (inViewMode) { await PageObjects.dashboard.switchToEditMode(); } - await dashboardAddPanel.ensureAddPanelIsShowing(); - await dashboardAddPanel.clickAddNewEmbeddableLink('visualization'); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAddNewEmbeddableLink('metrics'); await PageObjects.visualize.clickVisualBuilder(); await PageObjects.visualize.saveVisualizationExpectSuccess(name); } @@ -87,39 +85,13 @@ export function DashboardVisualizationProvider({ getService, getPageObjects }: F await dashboardAddPanel.addSavedSearch(name); } - async clickAddVisualizationButton() { - log.debug('DashboardVisualizations.clickAddVisualizationButton'); - await testSubjects.click('dashboardAddNewPanelButton'); - } - - async isNewVisDialogShowing() { - log.debug('DashboardVisualizations.isNewVisDialogShowing'); - return await find.existsByCssSelector('.visNewVisDialog'); - } - - async ensureNewVisualizationDialogIsShowing() { - let isShowing = await this.isNewVisDialogShowing(); - log.debug(`DashboardVisualizations.ensureNewVisualizationDialogIsShowing:${isShowing}`); - if (!isShowing) { - await retry.try(async () => { - await this.clickAddVisualizationButton(); - isShowing = await this.isNewVisDialogShowing(); - log.debug(`DashboardVisualizations.ensureNewVisualizationDialogIsShowing:${isShowing}`); - if (!isShowing) { - throw new Error('New Vis Dialog still not open, trying again.'); - } - }); - } - } - async createAndAddMarkdown({ name, markdown }: { name: string; markdown: string }) { log.debug(`createAndAddMarkdown(${markdown})`); const inViewMode = await PageObjects.dashboard.getIsInViewMode(); if (inViewMode) { await PageObjects.dashboard.switchToEditMode(); } - await this.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickMarkdownWidget(); + await dashboardAddPanel.clickMarkdownQuickButton(); await PageObjects.visEditor.setMarkdownTxt(markdown); await PageObjects.visEditor.clickGo(); await PageObjects.visualize.saveVisualizationExpectSuccess(name, { @@ -134,10 +106,10 @@ export function DashboardVisualizationProvider({ getService, getPageObjects }: F if (inViewMode) { await PageObjects.dashboard.switchToEditMode(); } - await this.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickAggBasedVisualizations(); - await PageObjects.visualize.clickMetric(); - await find.clickByCssSelector('li.euiListGroupItem:nth-of-type(2)'); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAggBasedVisualizations(); + await dashboardAddPanel.clickVisType('metric'); + await testSubjects.click('savedObjectTitlelogstash-*'); await testSubjects.exists('visualizesaveAndReturnButton'); await testSubjects.click('visualizesaveAndReturnButton'); } @@ -148,8 +120,7 @@ export function DashboardVisualizationProvider({ getService, getPageObjects }: F if (inViewMode) { await PageObjects.dashboard.switchToEditMode(); } - await this.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickMarkdownWidget(); + await dashboardAddPanel.clickMarkdownQuickButton(); await PageObjects.visEditor.setMarkdownTxt(markdown); await PageObjects.visEditor.clickGo(); await testSubjects.click('visualizesaveAndReturnButton'); diff --git a/test/new_visualize_flow/dashboard_embedding.ts b/test/new_visualize_flow/dashboard_embedding.ts index 6a1315dbfc91e..04b91542223ba 100644 --- a/test/new_visualize_flow/dashboard_embedding.ts +++ b/test/new_visualize_flow/dashboard_embedding.ts @@ -22,7 +22,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const dashboardExpect = getService('dashboardExpect'); - const testSubjects = getService('testSubjects'); const dashboardVisualizations = getService('dashboardVisualizations'); const PageObjects = getPageObjects([ 'common', @@ -47,8 +46,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('adding a metric visualization', async function () { const originalPanelCount = await PageObjects.dashboard.getPanelCount(); expect(originalPanelCount).to.eql(0); - await testSubjects.exists('dashboardAddNewPanelButton'); - await testSubjects.click('dashboardAddNewPanelButton'); await dashboardVisualizations.createAndEmbedMetric('Embedding Vis Test'); await PageObjects.dashboard.waitForRenderComplete(); await dashboardExpect.metricValuesExist(['0']); @@ -59,8 +56,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('adding a markdown', async function () { const originalPanelCount = await PageObjects.dashboard.getPanelCount(); expect(originalPanelCount).to.eql(1); - await testSubjects.exists('dashboardAddNewPanelButton'); - await testSubjects.click('dashboardAddNewPanelButton'); await dashboardVisualizations.createAndEmbedMarkdown({ name: 'Embedding Markdown Test', markdown: 'Nice to meet you, markdown is my name', diff --git a/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts b/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts index 4b9b2f99215b7..1c7e8ceb28fb4 100644 --- a/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts +++ b/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts @@ -40,6 +40,16 @@ export class LogStreamEmbeddableFactoryDefinition }); } + public getDescription() { + return i18n.translate('xpack.infra.logStreamEmbeddable.description', { + defaultMessage: 'Add a table of live streaming logs.', + }); + } + + public getIconType() { + return 'logsApp'; + } + public async getExplicitInput() { return { title: i18n.translate('xpack.infra.logStreamEmbeddable.title', { diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts index ac5ff2094e22b..4788d809f016f 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { StartServicesAccessor } from 'kibana/public'; +import { PLUGIN_ICON, PLUGIN_ID, ML_APP_NAME } from '../../../common/constants/app'; import type { EmbeddableFactoryDefinition, IContainer, @@ -27,6 +28,14 @@ export class AnomalyChartsEmbeddableFactory implements EmbeddableFactoryDefinition { public readonly type = ANOMALY_EXPLORER_CHARTS_EMBEDDABLE_TYPE; + public readonly grouping = [ + { + id: PLUGIN_ID, + getDisplayName: () => ML_APP_NAME, + getIconType: () => PLUGIN_ICON, + }, + ]; + constructor( private getStartServices: StartServicesAccessor ) {} @@ -37,7 +46,13 @@ export class AnomalyChartsEmbeddableFactory public getDisplayName() { return i18n.translate('xpack.ml.components.mlAnomalyExplorerEmbeddable.displayName', { - defaultMessage: 'ML anomaly chart', + defaultMessage: 'Anomaly chart', + }); + } + + public getDescription() { + return i18n.translate('xpack.ml.components.mlAnomalyExplorerEmbeddable.description', { + defaultMessage: 'View anomaly detection results in a chart.', }); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts index fdb2ef8527923..bc45e075710c5 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { StartServicesAccessor } from 'kibana/public'; +import { PLUGIN_ID, PLUGIN_ICON, ML_APP_NAME } from '../../../common/constants/app'; import type { EmbeddableFactoryDefinition, IContainer, @@ -26,6 +27,14 @@ export class AnomalySwimlaneEmbeddableFactory implements EmbeddableFactoryDefinition { public readonly type = ANOMALY_SWIMLANE_EMBEDDABLE_TYPE; + public readonly grouping = [ + { + id: PLUGIN_ID, + getDisplayName: () => ML_APP_NAME, + getIconType: () => PLUGIN_ICON, + }, + ]; + constructor( private getStartServices: StartServicesAccessor ) {} @@ -36,7 +45,13 @@ export class AnomalySwimlaneEmbeddableFactory public getDisplayName() { return i18n.translate('xpack.ml.components.jobAnomalyScoreEmbeddable.displayName', { - defaultMessage: 'ML anomaly swim lane', + defaultMessage: 'Anomaly swim lane', + }); + } + + public getDescription() { + return i18n.translate('xpack.ml.components.jobAnomalyScoreEmbeddable.description', { + defaultMessage: 'View anomaly detection results in a timeline.', }); } diff --git a/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts b/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts index deb91f6b9b1ef..51875c683346e 100644 --- a/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts +++ b/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts @@ -96,8 +96,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('can open job selection flyout', async () => { await PageObjects.dashboard.clickCreateDashboardPrompt(); await ml.dashboardEmbeddables.assertDashboardIsEmpty(); - await dashboardAddPanel.clickOpenAddPanel(); - await dashboardAddPanel.ensureAddPanelIsShowing(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickEmbeddableFactoryGroupButton('ml'); await dashboardAddPanel.clickAddNewEmbeddableLink('ml_anomaly_charts'); await ml.dashboardJobSelectionTable.assertJobSelectionTableExists(); await a11y.testAppSnapshot(); diff --git a/x-pack/test/functional/apps/dashboard/dashboard_lens_by_value.ts b/x-pack/test/functional/apps/dashboard/dashboard_lens_by_value.ts index 56a8ab46a57da..87ecfe0dcada9 100644 --- a/x-pack/test/functional/apps/dashboard/dashboard_lens_by_value.ts +++ b/x-pack/test/functional/apps/dashboard/dashboard_lens_by_value.ts @@ -15,7 +15,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardVisualizations = getService('dashboardVisualizations'); describe('dashboard lens by value', function () { before(async () => { @@ -27,7 +26,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('can add a lens panel by value', async () => { - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await PageObjects.lens.createAndAddLensFromDashboard({}); const newPanelCount = await PageObjects.dashboard.getPanelCount(); expect(newPanelCount).to.eql(1); diff --git a/x-pack/test/functional/apps/dashboard/dashboard_maps_by_value.ts b/x-pack/test/functional/apps/dashboard/dashboard_maps_by_value.ts index 15c76c3367a86..487dc90e1877e 100644 --- a/x-pack/test/functional/apps/dashboard/dashboard_maps_by_value.ts +++ b/x-pack/test/functional/apps/dashboard/dashboard_maps_by_value.ts @@ -19,10 +19,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const log = getService('log'); const esArchiver = getService('esArchiver'); - const dashboardVisualizations = getService('dashboardVisualizations'); const dashboardPanelActions = getService('dashboardPanelActions'); const testSubjects = getService('testSubjects'); const appsMenu = getService('appsMenu'); + const dashboardAddPanel = getService('dashboardAddPanel'); const LAYER_NAME = 'World Countries'; let mapCounter = 0; @@ -33,7 +33,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { if (inViewMode) { await PageObjects.dashboard.switchToEditMode(); } - await PageObjects.visualize.clickMapsApp(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickVisType('maps'); await PageObjects.maps.clickSaveAndReturnButton(); } @@ -82,8 +83,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('adding a map by value', () => { it('can add a map by value', async () => { await createNewDashboard(); - - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await createAndAddMapByValue(); const newPanelCount = await PageObjects.dashboard.getPanelCount(); expect(newPanelCount).to.eql(1); @@ -93,7 +92,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('editing a map by value', () => { before(async () => { await createNewDashboard(); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await createAndAddMapByValue(); await editByValueMap(); }); @@ -112,7 +110,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('editing a map and adding to map library', () => { beforeEach(async () => { await createNewDashboard(); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await createAndAddMapByValue(); }); diff --git a/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts b/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts index 3ebc53cc7cf27..730c00a8d5e4f 100644 --- a/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts +++ b/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts @@ -21,7 +21,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'lens', ]); - const dashboardVisualizations = getService('dashboardVisualizations'); + const dashboardAddPanel = getService('dashboardAddPanel'); const dashboardPanelActions = getService('dashboardPanelActions'); const dashboardExpect = getService('dashboardExpect'); const testSubjects = getService('testSubjects'); @@ -85,7 +85,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('can add a lens panel by value', async () => { - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await PageObjects.lens.createAndAddLensFromDashboard({}); const newPanelCount = await PageObjects.dashboard.getPanelCount(); expect(newPanelCount).to.eql(1); @@ -171,9 +170,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.waitForRenderComplete(); - await testSubjects.click('dashboardAddNewPanelButton'); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickMarkdownWidget(); + await dashboardAddPanel.clickMarkdownQuickButton(); await PageObjects.visEditor.setMarkdownTxt(originalMarkdownText); await PageObjects.visEditor.clickGo(); diff --git a/x-pack/test/functional/apps/dashboard/sync_colors.ts b/x-pack/test/functional/apps/dashboard/sync_colors.ts index 7e54f966870c3..09575c355913e 100644 --- a/x-pack/test/functional/apps/dashboard/sync_colors.ts +++ b/x-pack/test/functional/apps/dashboard/sync_colors.ts @@ -49,7 +49,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await elasticChart.setNewChartUiDebugFlag(true); await PageObjects.dashboard.clickCreateDashboardPrompt(); await dashboardAddPanel.clickCreateNewLink(); - await dashboardAddPanel.clickVisType('lens'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.lens.goToTimeRange(); @@ -68,7 +67,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.save('vis1', false, true); await PageObjects.header.waitUntilLoadingHasFinished(); await dashboardAddPanel.clickCreateNewLink(); - await dashboardAddPanel.clickVisType('lens'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.lens.configureDimension({ diff --git a/x-pack/test/functional/apps/dashboard_mode/dashboard_empty_screen.js b/x-pack/test/functional/apps/dashboard_mode/dashboard_empty_screen.js index 57925ad50d155..37311de534195 100644 --- a/x-pack/test/functional/apps/dashboard_mode/dashboard_empty_screen.js +++ b/x-pack/test/functional/apps/dashboard_mode/dashboard_empty_screen.js @@ -10,7 +10,6 @@ import expect from '@kbn/expect'; export default function ({ getPageObjects, getService }) { const testSubjects = getService('testSubjects'); const esArchiver = getService('esArchiver'); - const dashboardVisualizations = getService('dashboardVisualizations'); const dashboardPanelActions = getService('dashboardPanelActions'); const PageObjects = getPageObjects(['common', 'dashboard', 'visualize', 'lens']); @@ -29,9 +28,6 @@ export default function ({ getPageObjects, getService }) { it('adds Lens visualization to empty dashboard', async () => { const title = 'Dashboard Test Lens'; - await testSubjects.exists('dashboardAddNewPanelButton'); - await testSubjects.click('dashboardAddNewPanelButton'); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await PageObjects.lens.createAndAddLensFromDashboard({ title, redirectToOrigin: true }); await PageObjects.dashboard.waitForRenderComplete(); await testSubjects.exists(`embeddablePanelHeading-${title}`); @@ -87,9 +83,6 @@ export default function ({ getPageObjects, getService }) { const title = 'non-dashboard Test Lens'; await PageObjects.dashboard.loadSavedDashboard('empty dashboard test'); await PageObjects.dashboard.switchToEditMode(); - await testSubjects.exists('dashboardAddNewPanelButton'); - await testSubjects.click('dashboardAddNewPanelButton'); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); await PageObjects.lens.createAndAddLensFromDashboard({ title }); await PageObjects.lens.notLinkedToOriginatingApp(); await PageObjects.common.navigateToApp('dashboard'); diff --git a/x-pack/test/functional/apps/lens/dashboard.ts b/x-pack/test/functional/apps/lens/dashboard.ts index a15176d76f953..1490abb320ca6 100644 --- a/x-pack/test/functional/apps/lens/dashboard.ts +++ b/x-pack/test/functional/apps/lens/dashboard.ts @@ -134,7 +134,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await filterBar.addFilter('geo.dest', 'is', 'LS'); await dashboardAddPanel.clickCreateNewLink(); - await dashboardAddPanel.clickVisType('lens'); await PageObjects.header.waitUntilLoadingHasFinished(); const hasGeoDestFilter = await filterBar.hasFilter('geo.dest', 'LS'); expect(hasGeoDestFilter).to.be(false); @@ -200,7 +199,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.clickNewDashboard(); await dashboardAddPanel.clickCreateNewLink(); - await dashboardAddPanel.clickVisType('lens'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.lens.goToTimeRange(); diff --git a/x-pack/test/functional/apps/lens/lens_tagging.ts b/x-pack/test/functional/apps/lens/lens_tagging.ts index 7ce31709498fc..6fff2baa2d0cc 100644 --- a/x-pack/test/functional/apps/lens/lens_tagging.ts +++ b/x-pack/test/functional/apps/lens/lens_tagging.ts @@ -14,7 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const retry = getService('retry'); const find = getService('find'); - const dashboardVisualizations = getService('dashboardVisualizations'); + const dashboardAddPanel = getService('dashboardAddPanel'); const dashboardPanelActions = getService('dashboardPanelActions'); const PageObjects = getPageObjects([ 'common', @@ -39,8 +39,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('adds a new tag to a Lens visualization', async () => { // create lens - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickLensWidget(); + await dashboardAddPanel.clickCreateNewLink(); await PageObjects.lens.goToTimeRange(); await PageObjects.lens.configureDimension({ dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', diff --git a/x-pack/test/functional/apps/maps/embeddable/embeddable_library.js b/x-pack/test/functional/apps/maps/embeddable/embeddable_library.js index 40e73f0d8a763..9bff4e56c6c5b 100644 --- a/x-pack/test/functional/apps/maps/embeddable/embeddable_library.js +++ b/x-pack/test/functional/apps/maps/embeddable/embeddable_library.js @@ -15,7 +15,6 @@ export default function ({ getPageObjects, getService }) { const security = getService('security'); const dashboardAddPanel = getService('dashboardAddPanel'); const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardVisualizations = getService('dashboardVisualizations'); describe('maps in embeddable library', () => { before(async () => { @@ -34,8 +33,7 @@ export default function ({ getPageObjects, getService }) { }); await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.clickNewDashboard(); - await dashboardAddPanel.clickCreateNewLink(); - await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); + await dashboardAddPanel.clickEditorMenuButton(); await PageObjects.visualize.clickMapsApp(); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.maps.waitForLayersToLoad(); diff --git a/x-pack/test/functional/apps/maps/embeddable/save_and_return.js b/x-pack/test/functional/apps/maps/embeddable/save_and_return.js index a3abb01b4cf9f..a7e649548306b 100644 --- a/x-pack/test/functional/apps/maps/embeddable/save_and_return.js +++ b/x-pack/test/functional/apps/maps/embeddable/save_and_return.js @@ -11,7 +11,6 @@ export default function ({ getPageObjects, getService }) { const PageObjects = getPageObjects(['common', 'dashboard', 'header', 'maps', 'visualize']); const dashboardAddPanel = getService('dashboardAddPanel'); const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardVisualizations = getService('dashboardVisualizations'); const testSubjects = getService('testSubjects'); const security = getService('security'); @@ -37,9 +36,8 @@ export default function ({ getPageObjects, getService }) { beforeEach(async () => { await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.clickNewDashboard(); - await dashboardAddPanel.clickCreateNewLink(); - await await dashboardVisualizations.ensureNewVisualizationDialogIsShowing(); - await PageObjects.visualize.clickMapsApp(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickVisType('maps'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.maps.waitForLayersToLoad(); }); diff --git a/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts b/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts index f7bfd7f7a4c62..0aee183c1a4a5 100644 --- a/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts +++ b/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts @@ -87,8 +87,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('can open job selection flyout', async () => { await PageObjects.dashboard.clickCreateDashboardPrompt(); await ml.dashboardEmbeddables.assertDashboardIsEmpty(); - await dashboardAddPanel.clickOpenAddPanel(); - await dashboardAddPanel.ensureAddPanelIsShowing(); + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickEmbeddableFactoryGroupButton('ml'); await dashboardAddPanel.clickAddNewEmbeddableLink('ml_anomaly_charts'); await ml.dashboardJobSelectionTable.assertJobSelectionTableExists(); }); diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 65020be390f9d..100ed8e079d37 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -18,6 +18,7 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont const find = getService('find'); const comboBox = getService('comboBox'); const browser = getService('browser'); + const dashboardAddPanel = getService('dashboardAddPanel'); const PageObjects = getPageObjects([ 'common', @@ -753,7 +754,7 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont if (inViewMode) { await PageObjects.dashboard.switchToEditMode(); } - await PageObjects.visualize.clickLensWidget(); + await dashboardAddPanel.clickCreateNewLink(); await this.goToTimeRange(); await this.configureDimension({ dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', From 1a3e033c90eb9217168073abddcca2e11220009a Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Sun, 18 Apr 2021 12:50:02 +0300 Subject: [PATCH 12/82] [Partial Results] Move other bucket into Search Source (#96384) * Move inspector adapter integration into search source * docs and ts * Move other bucket to search source * test ts + delete unused tabilfy function * hierarchical param in aggconfig. ts improvements more inspector tests * fix jest * separate inspect more tests * jest * inspector * Error handling and more tests * put the fun in functional tests * code review * Add functional test for other bucket in search example app * test * test * ts * test * test * ts Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...ins-data-public.aggconfigs.hierarchical.md | 11 + ...a-plugin-plugins-data-public.aggconfigs.md | 3 +- ...in-plugins-data-public.aggconfigs.todsl.md | 9 +- ...s-data-public.isearchoptions.inspector.md} | 8 +- ...ugin-plugins-data-public.isearchoptions.md | 2 +- ...-plugins-data-public.searchsource.fetch.md | 4 +- ...plugins-data-public.searchsource.fetch_.md | 4 +- ...ins-data-public.searchsourcefields.aggs.md | 2 +- ...-plugins-data-public.searchsourcefields.md | 2 +- ...s-data-server.isearchoptions.inspector.md} | 8 +- ...ugin-plugins-data-server.isearchoptions.md | 2 +- examples/search_examples/public/index.scss | 6 + .../search_examples/public/search/app.tsx | 274 ++++++---- .../common/search/aggs/agg_configs.test.ts | 8 +- .../data/common/search/aggs/agg_configs.ts | 8 +- .../data/common/search/aggs/agg_type.ts | 31 +- .../_terms_other_bucket_helper.test.ts | 6 +- .../buckets/_terms_other_bucket_helper.ts | 13 +- .../data/common/search/aggs/buckets/terms.ts | 26 +- .../esaggs/request_handler.test.ts | 43 +- .../expressions/esaggs/request_handler.ts | 62 +-- .../search_source/inspect/inspector_stats.ts | 2 +- .../search_source/search_source.test.ts | 482 +++++++++++++++--- .../search/search_source/search_source.ts | 179 ++++++- .../data/common/search/search_source/types.ts | 3 +- .../data/common/search/tabify/index.ts | 23 +- src/plugins/data/common/search/types.ts | 15 +- src/plugins/data/public/public.api.md | 17 +- .../public/search/expressions/esaggs.test.ts | 7 +- .../data/public/search/expressions/esaggs.ts | 7 +- .../server/search/expressions/esaggs.test.ts | 6 +- .../data/server/search/expressions/esaggs.ts | 8 +- src/plugins/data/server/server.api.md | 8 +- .../public/application/angular/discover.js | 22 +- .../embeddable/search_embeddable.ts | 22 +- .../classes/sources/es_source/es_source.ts | 13 +- x-pack/test/examples/search_examples/index.ts | 3 +- .../search_examples/search_example.ts | 38 ++ 38 files changed, 964 insertions(+), 423 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.hierarchical.md rename docs/development/plugins/data/public/{kibana-plugin-plugins-data-public.isearchoptions.requestresponder.md => kibana-plugin-plugins-data-public.isearchoptions.inspector.md} (52%) rename docs/development/plugins/data/server/{kibana-plugin-plugins-data-server.isearchoptions.requestresponder.md => kibana-plugin-plugins-data-server.isearchoptions.inspector.md} (52%) create mode 100644 x-pack/test/examples/search_examples/search_example.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.hierarchical.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.hierarchical.md new file mode 100644 index 0000000000000..66d540c48c3bc --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.hierarchical.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [AggConfigs](./kibana-plugin-plugins-data-public.aggconfigs.md) > [hierarchical](./kibana-plugin-plugins-data-public.aggconfigs.hierarchical.md) + +## AggConfigs.hierarchical property + +Signature: + +```typescript +hierarchical?: boolean; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md index 22f8994747aa2..02e9a63d95ba3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.md @@ -22,6 +22,7 @@ export declare class AggConfigs | --- | --- | --- | --- | | [aggs](./kibana-plugin-plugins-data-public.aggconfigs.aggs.md) | | IAggConfig[] | | | [createAggConfig](./kibana-plugin-plugins-data-public.aggconfigs.createaggconfig.md) | | <T extends AggConfig = AggConfig>(params: CreateAggConfigParams, { addToAggConfigs }?: {
addToAggConfigs?: boolean | undefined;
}) => T | | +| [hierarchical](./kibana-plugin-plugins-data-public.aggconfigs.hierarchical.md) | | boolean | | | [indexPattern](./kibana-plugin-plugins-data-public.aggconfigs.indexpattern.md) | | IndexPattern | | | [timeFields](./kibana-plugin-plugins-data-public.aggconfigs.timefields.md) | | string[] | | | [timeRange](./kibana-plugin-plugins-data-public.aggconfigs.timerange.md) | | TimeRange | | @@ -46,5 +47,5 @@ export declare class AggConfigs | [onSearchRequestStart(searchSource, options)](./kibana-plugin-plugins-data-public.aggconfigs.onsearchrequeststart.md) | | | | [setTimeFields(timeFields)](./kibana-plugin-plugins-data-public.aggconfigs.settimefields.md) | | | | [setTimeRange(timeRange)](./kibana-plugin-plugins-data-public.aggconfigs.settimerange.md) | | | -| [toDsl(hierarchical)](./kibana-plugin-plugins-data-public.aggconfigs.todsl.md) | | | +| [toDsl()](./kibana-plugin-plugins-data-public.aggconfigs.todsl.md) | | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.todsl.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.todsl.md index 055c4113ca3e4..1327e976db0ce 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.todsl.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggconfigs.todsl.md @@ -7,15 +7,8 @@ Signature: ```typescript -toDsl(hierarchical?: boolean): Record; +toDsl(): Record; ``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| hierarchical | boolean | | - Returns: `Record` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.requestresponder.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.inspector.md similarity index 52% rename from docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.requestresponder.md rename to docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.inspector.md index b4431b9467b71..9961292aaf217 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.requestresponder.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.inspector.md @@ -1,11 +1,13 @@ -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) > [requestResponder](./kibana-plugin-plugins-data-public.isearchoptions.requestresponder.md) +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) > [inspector](./kibana-plugin-plugins-data-public.isearchoptions.inspector.md) -## ISearchOptions.requestResponder property +## ISearchOptions.inspector property + +Inspector integration options Signature: ```typescript -requestResponder?: RequestResponder; +inspector?: IInspectorInfo; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md index cc0cb538be611..21fb7e3dfc7e8 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md @@ -16,10 +16,10 @@ export interface ISearchOptions | --- | --- | --- | | [abortSignal](./kibana-plugin-plugins-data-public.isearchoptions.abortsignal.md) | AbortSignal | An AbortSignal that allows the caller of search to abort a search request. | | [indexPattern](./kibana-plugin-plugins-data-public.isearchoptions.indexpattern.md) | IndexPattern | Index pattern reference is used for better error messages | +| [inspector](./kibana-plugin-plugins-data-public.isearchoptions.inspector.md) | IInspectorInfo | Inspector integration options | | [isRestore](./kibana-plugin-plugins-data-public.isearchoptions.isrestore.md) | boolean | Whether the session is restored (i.e. search requests should re-use the stored search IDs, rather than starting from scratch) | | [isStored](./kibana-plugin-plugins-data-public.isearchoptions.isstored.md) | boolean | Whether the session is already saved (i.e. sent to background) | | [legacyHitsTotal](./kibana-plugin-plugins-data-public.isearchoptions.legacyhitstotal.md) | boolean | Request the legacy format for the total number of hits. If sending rest_total_hits_as_int to something other than true, this should be set to false. | -| [requestResponder](./kibana-plugin-plugins-data-public.isearchoptions.requestresponder.md) | RequestResponder | | | [sessionId](./kibana-plugin-plugins-data-public.isearchoptions.sessionid.md) | string | A session ID, grouping multiple search requests into a single session. | | [strategy](./kibana-plugin-plugins-data-public.isearchoptions.strategy.md) | string | Use this option to force using a specific server side search strategy. Leave empty to use the default strategy. | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch.md index 623d6366d4d13..e6ba1a51a867d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch.md @@ -14,7 +14,7 @@ Fetch this source and reject the returned Promise on error Signature: ```typescript -fetch(options?: ISearchOptions): Promise>; +fetch(options?: ISearchOptions): Promise>; ``` ## Parameters @@ -25,5 +25,5 @@ fetch(options?: ISearchOptions): PromiseReturns: -`Promise>` +`Promise>` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch_.md index d5641107a88aa..4369cf7c087da 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsource.fetch_.md @@ -9,7 +9,7 @@ Fetch this source from Elasticsearch, returning an observable over the response( Signature: ```typescript -fetch$(options?: ISearchOptions): import("rxjs").Observable>; +fetch$(options?: ISearchOptions): Observable>; ``` ## Parameters @@ -20,5 +20,5 @@ fetch$(options?: ISearchOptions): import("rxjs").ObservableReturns: -`import("rxjs").Observable>` +`Observable>` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.aggs.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.aggs.md index f6bab8e424857..12011f8242996 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.aggs.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.aggs.md @@ -9,5 +9,5 @@ Signature: ```typescript -aggs?: any; +aggs?: object | IAggConfigs | (() => object); ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.md index d0f53936eb56a..981d956a9e89b 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchsourcefields.md @@ -16,7 +16,7 @@ export interface SearchSourceFields | Property | Type | Description | | --- | --- | --- | -| [aggs](./kibana-plugin-plugins-data-public.searchsourcefields.aggs.md) | any | [AggConfigs](./kibana-plugin-plugins-data-public.aggconfigs.md) | +| [aggs](./kibana-plugin-plugins-data-public.searchsourcefields.aggs.md) | object | IAggConfigs | (() => object) | [AggConfigs](./kibana-plugin-plugins-data-public.aggconfigs.md) | | [fields](./kibana-plugin-plugins-data-public.searchsourcefields.fields.md) | SearchFieldValue[] | Retrieve fields via the search Fields API | | [fieldsFromSource](./kibana-plugin-plugins-data-public.searchsourcefields.fieldsfromsource.md) | NameList | Retreive fields directly from \_source (legacy behavior) | | [filter](./kibana-plugin-plugins-data-public.searchsourcefields.filter.md) | Filter[] | Filter | (() => Filter[] | Filter | undefined) | [Filter](./kibana-plugin-plugins-data-public.filter.md) | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.requestresponder.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.inspector.md similarity index 52% rename from docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.requestresponder.md rename to docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.inspector.md index 7440f5a9d26cf..ab755334643aa 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.requestresponder.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.inspector.md @@ -1,11 +1,13 @@ -[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [ISearchOptions](./kibana-plugin-plugins-data-server.isearchoptions.md) > [requestResponder](./kibana-plugin-plugins-data-server.isearchoptions.requestresponder.md) +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [ISearchOptions](./kibana-plugin-plugins-data-server.isearchoptions.md) > [inspector](./kibana-plugin-plugins-data-server.isearchoptions.inspector.md) -## ISearchOptions.requestResponder property +## ISearchOptions.inspector property + +Inspector integration options Signature: ```typescript -requestResponder?: RequestResponder; +inspector?: IInspectorInfo; ``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.md index 413a59be3d427..cdb5664f96cdd 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchoptions.md @@ -16,10 +16,10 @@ export interface ISearchOptions | --- | --- | --- | | [abortSignal](./kibana-plugin-plugins-data-server.isearchoptions.abortsignal.md) | AbortSignal | An AbortSignal that allows the caller of search to abort a search request. | | [indexPattern](./kibana-plugin-plugins-data-server.isearchoptions.indexpattern.md) | IndexPattern | Index pattern reference is used for better error messages | +| [inspector](./kibana-plugin-plugins-data-server.isearchoptions.inspector.md) | IInspectorInfo | Inspector integration options | | [isRestore](./kibana-plugin-plugins-data-server.isearchoptions.isrestore.md) | boolean | Whether the session is restored (i.e. search requests should re-use the stored search IDs, rather than starting from scratch) | | [isStored](./kibana-plugin-plugins-data-server.isearchoptions.isstored.md) | boolean | Whether the session is already saved (i.e. sent to background) | | [legacyHitsTotal](./kibana-plugin-plugins-data-server.isearchoptions.legacyhitstotal.md) | boolean | Request the legacy format for the total number of hits. If sending rest_total_hits_as_int to something other than true, this should be set to false. | -| [requestResponder](./kibana-plugin-plugins-data-server.isearchoptions.requestresponder.md) | RequestResponder | | | [sessionId](./kibana-plugin-plugins-data-server.isearchoptions.sessionid.md) | string | A session ID, grouping multiple search requests into a single session. | | [strategy](./kibana-plugin-plugins-data-server.isearchoptions.strategy.md) | string | Use this option to force using a specific server side search strategy. Leave empty to use the default strategy. | diff --git a/examples/search_examples/public/index.scss b/examples/search_examples/public/index.scss index e69de29bb2d1d..b623fecf78640 100644 --- a/examples/search_examples/public/index.scss +++ b/examples/search_examples/public/index.scss @@ -0,0 +1,6 @@ +@import '@elastic/eui/src/global_styling/variables/header'; + +.searchExampleStepDsc { + padding-left: $euiSizeXL; + font-style: italic; +} diff --git a/examples/search_examples/public/search/app.tsx b/examples/search_examples/public/search/app.tsx index 8f31d242faf5e..b2a4991d0717b 100644 --- a/examples/search_examples/public/search/app.tsx +++ b/examples/search_examples/public/search/app.tsx @@ -20,13 +20,13 @@ import { EuiTitle, EuiText, EuiFlexGrid, - EuiFlexGroup, EuiFlexItem, EuiCheckbox, EuiSpacer, EuiCode, EuiComboBox, EuiFormLabel, + EuiTabbedContent, } from '@elastic/eui'; import { CoreStart } from '../../../../src/core/public'; @@ -60,6 +60,11 @@ function getNumeric(fields?: IndexPatternField[]) { return fields?.filter((f) => f.type === 'number' && f.aggregatable); } +function getAggregatableStrings(fields?: IndexPatternField[]) { + if (!fields) return []; + return fields?.filter((f) => f.type === 'string' && f.aggregatable); +} + function formatFieldToComboBox(field?: IndexPatternField | null) { if (!field) return []; return formatFieldsToComboBox([field]); @@ -90,6 +95,9 @@ export const SearchExamplesApp = ({ const [selectedNumericField, setSelectedNumericField] = useState< IndexPatternField | null | undefined >(); + const [selectedBucketField, setSelectedBucketField] = useState< + IndexPatternField | null | undefined + >(); const [request, setRequest] = useState>({}); const [response, setResponse] = useState>({}); @@ -108,6 +116,7 @@ export const SearchExamplesApp = ({ setFields(indexPattern?.fields); }, [indexPattern]); useEffect(() => { + setSelectedBucketField(fields?.length ? getAggregatableStrings(fields)[0] : null); setSelectedNumericField(fields?.length ? getNumeric(fields)[0] : null); }, [fields]); @@ -203,28 +212,40 @@ export const SearchExamplesApp = ({ .setField('index', indexPattern) .setField('filter', filters) .setField('query', query) - .setField('fields', selectedFields.length ? selectedFields.map((f) => f.name) : ['*']) + .setField('fields', selectedFields.length ? selectedFields.map((f) => f.name) : ['']) + .setField('size', selectedFields.length ? 100 : 0) .setField('trackTotalHits', 100); - if (selectedNumericField) { - searchSource.setField('aggs', () => { - return data.search.aggs - .createAggConfigs(indexPattern, [ - { type: 'avg', params: { field: selectedNumericField.name } }, - ]) - .toDsl(); + const aggDef = []; + if (selectedBucketField) { + aggDef.push({ + type: 'terms', + schema: 'split', + params: { field: selectedBucketField.name, size: 2, otherBucket: true }, }); } + if (selectedNumericField) { + aggDef.push({ type: 'avg', params: { field: selectedNumericField.name } }); + } + if (aggDef.length > 0) { + const ac = data.search.aggs.createAggConfigs(indexPattern, aggDef); + searchSource.setField('aggs', ac); + } setRequest(searchSource.getSearchRequestBody()); const res = await searchSource.fetch$().toPromise(); setResponse(res); const message = Searched {res.hits.total} documents.; - notifications.toasts.addSuccess({ - title: 'Query result', - text: mountReactNode(message), - }); + notifications.toasts.addSuccess( + { + title: 'Query result', + text: mountReactNode(message), + }, + { + toastLifeTimeMs: 300000, + } + ); } catch (e) { setResponse(e.body); notifications.toasts.addWarning(`An error has occurred: ${e.message}`); @@ -263,6 +284,55 @@ export const SearchExamplesApp = ({ doSearchSourceSearch(); }; + const reqTabs = [ + { + id: 'request', + name: Request, + content: ( + <> + + Search body sent to ES + + {JSON.stringify(request, null, 2)} + + + ), + }, + { + id: 'response', + name: Response, + content: ( + <> + + + + + + {JSON.stringify(response, null, 2)} + + + ), + }, + ]; + return ( @@ -284,59 +354,75 @@ export const SearchExamplesApp = ({ useDefaultBehaviors={true} indexPatterns={indexPattern ? [indexPattern] : undefined} /> - + + + Index Pattern + { + const newIndexPattern = await data.indexPatterns.get(newIndexPatternId); + setIndexPattern(newIndexPattern); + }} + isClearable={false} + /> + + + Field (bucket) + { + if (option.length) { + const fld = indexPattern?.getFieldByName(option[0].label); + setSelectedBucketField(fld || null); + } else { + setSelectedBucketField(null); + } + }} + sortMatchesBy="startsWith" + data-test-subj="searchBucketField" + /> + + + Numeric Field (metric) + { + if (option.length) { + const fld = indexPattern?.getFieldByName(option[0].label); + setSelectedNumericField(fld || null); + } else { + setSelectedNumericField(null); + } + }} + sortMatchesBy="startsWith" + data-test-subj="searchMetricField" + /> + + + Fields to queryString + { + const flds = option + .map((opt) => indexPattern?.getFieldByName(opt?.label)) + .filter((f) => f); + setSelectedFields(flds.length ? (flds as IndexPatternField[]) : []); + }} + sortMatchesBy="startsWith" + /> + + + - - - - Index Pattern - { - const newIndexPattern = await data.indexPatterns.get(newIndexPatternId); - setIndexPattern(newIndexPattern); - }} - isClearable={false} - /> - - - Numeric Field to Aggregate - { - const fld = indexPattern?.getFieldByName(option[0].label); - setSelectedNumericField(fld || null); - }} - sortMatchesBy="startsWith" - /> - - - - - Fields to query (leave blank to include all fields) - { - const flds = option - .map((opt) => indexPattern?.getFieldByName(opt?.label)) - .filter((f) => f); - setSelectedFields(flds.length ? (flds as IndexPatternField[]) : []); - }} - sortMatchesBy="startsWith" - /> - - -

@@ -352,15 +438,32 @@ export const SearchExamplesApp = ({ - + + + + + + + @@ -446,41 +549,8 @@ export const SearchExamplesApp = ({ - - -

Request

-
- Search body sent to ES - - {JSON.stringify(request, null, 2)} - -
- - -

Response

-
- - - - - {JSON.stringify(response, null, 2)} - + + diff --git a/src/plugins/data/common/search/aggs/agg_configs.test.ts b/src/plugins/data/common/search/aggs/agg_configs.test.ts index 3ce528e6ed893..28102544ae055 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.test.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.test.ts @@ -342,8 +342,8 @@ describe('AggConfigs', () => { { enabled: true, type: 'max', schema: 'metric', params: { field: 'bytes' } }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); - const topLevelDsl = ac.toDsl(true); + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, hierarchical: true }); + const topLevelDsl = ac.toDsl(); const buckets = ac.bySchemaName('buckets'); const metrics = ac.bySchemaName('metrics'); @@ -412,8 +412,8 @@ describe('AggConfigs', () => { }, ]; - const ac = new AggConfigs(indexPattern, configStates, { typesRegistry }); - const topLevelDsl = ac.toDsl(true)['2']; + const ac = new AggConfigs(indexPattern, configStates, { typesRegistry, hierarchical: true }); + const topLevelDsl = ac.toDsl()['2']; expect(Object.keys(topLevelDsl.aggs)).toContain('1'); expect(Object.keys(topLevelDsl.aggs)).toContain('1-bucket'); diff --git a/src/plugins/data/common/search/aggs/agg_configs.ts b/src/plugins/data/common/search/aggs/agg_configs.ts index 4d5d49754387d..2932ef7325aed 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.ts @@ -43,6 +43,7 @@ function parseParentAggs(dslLvlCursor: any, dsl: any) { export interface AggConfigsOptions { typesRegistry: AggTypesRegistryStart; + hierarchical?: boolean; } export type CreateAggConfigParams = Assign; @@ -65,6 +66,8 @@ export class AggConfigs { public indexPattern: IndexPattern; public timeRange?: TimeRange; public timeFields?: string[]; + public hierarchical?: boolean = false; + private readonly typesRegistry: AggTypesRegistryStart; aggs: IAggConfig[]; @@ -80,6 +83,7 @@ export class AggConfigs { this.aggs = []; this.indexPattern = indexPattern; + this.hierarchical = opts.hierarchical; configStates.forEach((params: any) => this.createAggConfig(params)); } @@ -174,12 +178,12 @@ export class AggConfigs { return true; } - toDsl(hierarchical: boolean = false): Record { + toDsl(): Record { const dslTopLvl = {}; let dslLvlCursor: Record; let nestedMetrics: Array<{ config: AggConfig; dsl: Record }> | []; - if (hierarchical) { + if (this.hierarchical) { // collect all metrics, and filter out the ones that we won't be copying nestedMetrics = this.aggs .filter(function (agg) { diff --git a/src/plugins/data/common/search/aggs/agg_type.ts b/src/plugins/data/common/search/aggs/agg_type.ts index 33fdc45a605b7..f0f3912bf64fe 100644 --- a/src/plugins/data/common/search/aggs/agg_type.ts +++ b/src/plugins/data/common/search/aggs/agg_type.ts @@ -13,12 +13,23 @@ import { ISearchSource } from 'src/plugins/data/public'; import { DatatableColumnType, SerializedFieldFormat } from 'src/plugins/expressions/common'; import type { RequestAdapter } from 'src/plugins/inspector/common'; +import { estypes } from '@elastic/elasticsearch'; import { initParams } from './agg_params'; import { AggConfig } from './agg_config'; import { IAggConfigs } from './agg_configs'; import { BaseParamType } from './param_types/base'; import { AggParamType } from './param_types/agg'; +type PostFlightRequestFn = ( + resp: estypes.SearchResponse, + aggConfigs: IAggConfigs, + aggConfig: TAggConfig, + searchSource: ISearchSource, + inspectorRequestAdapter?: RequestAdapter, + abortSignal?: AbortSignal, + searchSessionId?: string +) => Promise>; + export interface AggTypeConfig< TAggConfig extends AggConfig = AggConfig, TParam extends AggParamType = AggParamType @@ -40,15 +51,7 @@ export interface AggTypeConfig< customLabels?: boolean; json?: boolean; decorateAggConfig?: () => any; - postFlightRequest?: ( - resp: any, - aggConfigs: IAggConfigs, - aggConfig: TAggConfig, - searchSource: ISearchSource, - inspectorRequestAdapter?: RequestAdapter, - abortSignal?: AbortSignal, - searchSessionId?: string - ) => Promise; + postFlightRequest?: PostFlightRequestFn; getSerializedFormat?: (agg: TAggConfig) => SerializedFieldFormat; getValue?: (agg: TAggConfig, bucket: any) => any; getKey?: (bucket: any, key: any, agg: TAggConfig) => any; @@ -188,15 +191,7 @@ export class AggType< * @param searchSessionId - searchSessionId to be used for grouping requests into a single search session * @return {Promise} */ - postFlightRequest: ( - resp: any, - aggConfigs: IAggConfigs, - aggConfig: TAggConfig, - searchSource: ISearchSource, - inspectorRequestAdapter?: RequestAdapter, - abortSignal?: AbortSignal, - searchSessionId?: string - ) => Promise; + postFlightRequest: PostFlightRequestFn; /** * Get the serialized format for the values produced by this agg type, * overridden by several metrics that always output a simple number. diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts index 56e720d237c45..2aa0d346afe34 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts @@ -433,7 +433,7 @@ describe('Terms Agg Other bucket helper', () => { aggConfigs.aggs[0] as IBucketAggConfig, otherAggConfig() ); - expect(mergedResponse.aggregations['1'].buckets[3].key).toEqual('__other__'); + expect((mergedResponse!.aggregations!['1'] as any).buckets[3].key).toEqual('__other__'); } }); @@ -455,7 +455,7 @@ describe('Terms Agg Other bucket helper', () => { otherAggConfig() ); - expect(mergedResponse.aggregations['1'].buckets[1]['2'].buckets[3].key).toEqual( + expect((mergedResponse!.aggregations!['1'] as any).buckets[1]['2'].buckets[3].key).toEqual( '__other__' ); } @@ -471,7 +471,7 @@ describe('Terms Agg Other bucket helper', () => { aggConfigs.aggs[0] as IBucketAggConfig ); expect( - updatedResponse.aggregations['1'].buckets.find( + (updatedResponse!.aggregations!['1'] as any).buckets.find( (bucket: Record) => bucket.key === '__missing__' ) ).toBeDefined(); diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts index 742615bc49d8f..6230ae897b170 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.ts @@ -7,6 +7,7 @@ */ import { isNumber, keys, values, find, each, cloneDeep, flatten } from 'lodash'; +import { estypes } from '@elastic/elasticsearch'; import { buildExistsFilter, buildPhrasesFilter, buildQueryFromFilters } from '../../../../common'; import { AggGroupNames } from '../agg_groups'; import { IAggConfigs } from '../agg_configs'; @@ -42,7 +43,7 @@ const getNestedAggDSL = (aggNestedDsl: Record, startFromAggId: stri */ const getAggResultBuckets = ( aggConfigs: IAggConfigs, - response: any, + response: estypes.SearchResponse['aggregations'], aggWithOtherBucket: IBucketAggConfig, key: string ) => { @@ -72,8 +73,8 @@ const getAggResultBuckets = ( } } } - if (responseAgg[aggWithOtherBucket.id]) { - return responseAgg[aggWithOtherBucket.id].buckets; + if (responseAgg?.[aggWithOtherBucket.id]) { + return (responseAgg[aggWithOtherBucket.id] as any).buckets; } return []; }; @@ -235,11 +236,11 @@ export const buildOtherBucketAgg = ( export const mergeOtherBucketAggResponse = ( aggsConfig: IAggConfigs, - response: any, + response: estypes.SearchResponse, otherResponse: any, otherAgg: IBucketAggConfig, requestAgg: Record -) => { +): estypes.SearchResponse => { const updatedResponse = cloneDeep(response); each(otherResponse.aggregations['other-filter'].buckets, (bucket, key) => { if (!bucket.doc_count || key === undefined) return; @@ -276,7 +277,7 @@ export const mergeOtherBucketAggResponse = ( }; export const updateMissingBucket = ( - response: any, + response: estypes.SearchResponse, aggConfigs: IAggConfigs, agg: IBucketAggConfig ) => { diff --git a/src/plugins/data/common/search/aggs/buckets/terms.ts b/src/plugins/data/common/search/aggs/buckets/terms.ts index 77c9c6e391c0a..03cf14a577a50 100644 --- a/src/plugins/data/common/search/aggs/buckets/terms.ts +++ b/src/plugins/data/common/search/aggs/buckets/terms.ts @@ -101,25 +101,21 @@ export const getTermsBucketAgg = () => nestedSearchSource.setField('aggs', filterAgg); - const requestResponder = inspectorRequestAdapter?.start( - i18n.translate('data.search.aggs.buckets.terms.otherBucketTitle', { - defaultMessage: 'Other bucket', - }), - { - description: i18n.translate('data.search.aggs.buckets.terms.otherBucketDescription', { - defaultMessage: - 'This request counts the number of documents that fall ' + - 'outside the criterion of the data buckets.', - }), - searchSessionId, - } - ); - const response = await nestedSearchSource .fetch$({ abortSignal, sessionId: searchSessionId, - requestResponder, + inspector: { + adapter: inspectorRequestAdapter, + title: i18n.translate('data.search.aggs.buckets.terms.otherBucketTitle', { + defaultMessage: 'Other bucket', + }), + description: i18n.translate('data.search.aggs.buckets.terms.otherBucketDescription', { + defaultMessage: + 'This request counts the number of documents that fall ' + + 'outside the criterion of the data buckets.', + }), + }, }) .toPromise(); diff --git a/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts b/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts index c2566535916a8..b30e5740fa3fb 100644 --- a/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts +++ b/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts @@ -9,7 +9,7 @@ import type { MockedKeys } from '@kbn/utility-types/jest'; import type { Filter } from '../../../es_query'; import type { IndexPattern } from '../../../index_patterns'; -import type { IAggConfig, IAggConfigs } from '../../aggs'; +import type { IAggConfigs } from '../../aggs'; import type { ISearchSource } from '../../search_source'; import { searchSourceCommonMock } from '../../search_source/mocks'; @@ -38,7 +38,6 @@ describe('esaggs expression function - public', () => { filters: undefined, indexPattern: ({ id: 'logstash-*' } as unknown) as jest.Mocked, inspectorAdapters: {}, - metricsAtAllLevels: false, partialRows: false, query: undefined, searchSessionId: 'abc123', @@ -76,21 +75,7 @@ describe('esaggs expression function - public', () => { test('setField(aggs)', async () => { expect(searchSource.setField).toHaveBeenCalledTimes(5); - expect(typeof (searchSource.setField as jest.Mock).mock.calls[2][1]).toBe('function'); - expect((searchSource.setField as jest.Mock).mock.calls[2][1]()).toEqual( - mockParams.aggs.toDsl() - ); - expect(mockParams.aggs.toDsl).toHaveBeenCalledWith(mockParams.metricsAtAllLevels); - - // make sure param is passed through - jest.clearAllMocks(); - await handleRequest({ - ...mockParams, - metricsAtAllLevels: true, - }); - searchSource = await mockParams.searchSourceService.create(); - (searchSource.setField as jest.Mock).mock.calls[2][1](); - expect(mockParams.aggs.toDsl).toHaveBeenCalledWith(true); + expect((searchSource.setField as jest.Mock).mock.calls[2][1]).toEqual(mockParams.aggs); }); test('setField(filter)', async () => { @@ -133,36 +118,24 @@ describe('esaggs expression function - public', () => { test('calls searchSource.fetch', async () => { await handleRequest(mockParams); const searchSource = await mockParams.searchSourceService.create(); + expect(searchSource.fetch$).toHaveBeenCalledWith({ abortSignal: mockParams.abortSignal, sessionId: mockParams.searchSessionId, + inspector: { + title: 'Data', + description: 'This request queries Elasticsearch to fetch the data for the visualization.', + adapter: undefined, + }, }); }); - test('calls agg.postFlightRequest if it exiests and agg is enabled', async () => { - mockParams.aggs.aggs[0].enabled = true; - await handleRequest(mockParams); - expect(mockParams.aggs.aggs[0].type.postFlightRequest).toHaveBeenCalledTimes(1); - - // ensure it works if the function doesn't exist - jest.clearAllMocks(); - mockParams.aggs.aggs[0] = ({ type: { name: 'count' } } as unknown) as IAggConfig; - expect(async () => await handleRequest(mockParams)).not.toThrowError(); - }); - - test('should skip agg.postFlightRequest call if the agg is disabled', async () => { - mockParams.aggs.aggs[0].enabled = false; - await handleRequest(mockParams); - expect(mockParams.aggs.aggs[0].type.postFlightRequest).toHaveBeenCalledTimes(0); - }); - test('tabifies response data', async () => { await handleRequest(mockParams); expect(tabifyAggResponse).toHaveBeenCalledWith( mockParams.aggs, {}, { - metricsAtAllLevels: mockParams.metricsAtAllLevels, partialRows: mockParams.partialRows, timeRange: mockParams.timeRange, } diff --git a/src/plugins/data/common/search/expressions/esaggs/request_handler.ts b/src/plugins/data/common/search/expressions/esaggs/request_handler.ts index 5620698a47538..173b2067cad6b 100644 --- a/src/plugins/data/common/search/expressions/esaggs/request_handler.ts +++ b/src/plugins/data/common/search/expressions/esaggs/request_handler.ts @@ -40,28 +40,12 @@ export interface RequestHandlerParams { getNow?: () => Date; } -function getRequestMainResponder(inspectorAdapters: Adapters, searchSessionId?: string) { - return inspectorAdapters.requests?.start( - i18n.translate('data.functions.esaggs.inspector.dataRequest.title', { - defaultMessage: 'Data', - }), - { - description: i18n.translate('data.functions.esaggs.inspector.dataRequest.description', { - defaultMessage: - 'This request queries Elasticsearch to fetch the data for the visualization.', - }), - searchSessionId, - } - ); -} - export const handleRequest = async ({ abortSignal, aggs, filters, indexPattern, inspectorAdapters, - metricsAtAllLevels, partialRows, query, searchSessionId, @@ -100,9 +84,7 @@ export const handleRequest = async ({ }, }); - requestSearchSource.setField('aggs', function () { - return aggs.toDsl(metricsAtAllLevels); - }); + requestSearchSource.setField('aggs', aggs); requestSearchSource.onRequestStart((paramSearchSource, options) => { return aggs.onSearchRequestStart(paramSearchSource, options); @@ -128,35 +110,27 @@ export const handleRequest = async ({ requestSearchSource.setField('query', query); inspectorAdapters.requests?.reset(); - const requestResponder = getRequestMainResponder(inspectorAdapters, searchSessionId); - const response$ = await requestSearchSource.fetch$({ - abortSignal, - sessionId: searchSessionId, - requestResponder, - }); - - // Note that rawResponse is not deeply cloned here, so downstream applications using courier - // must take care not to mutate it, or it could have unintended side effects, e.g. displaying - // response data incorrectly in the inspector. - let response = await response$.toPromise(); - for (const agg of aggs.aggs) { - if (agg.enabled && typeof agg.type.postFlightRequest === 'function') { - response = await agg.type.postFlightRequest( - response, - aggs, - agg, - requestSearchSource, - inspectorAdapters.requests, - abortSignal, - searchSessionId - ); - } - } + const response = await requestSearchSource + .fetch$({ + abortSignal, + sessionId: searchSessionId, + inspector: { + adapter: inspectorAdapters.requests, + title: i18n.translate('data.functions.esaggs.inspector.dataRequest.title', { + defaultMessage: 'Data', + }), + description: i18n.translate('data.functions.esaggs.inspector.dataRequest.description', { + defaultMessage: + 'This request queries Elasticsearch to fetch the data for the visualization.', + }), + }, + }) + .toPromise(); const parsedTimeRange = timeRange ? calculateBounds(timeRange, { forceNow }) : null; const tabifyParams = { - metricsAtAllLevels, + metricsAtAllLevels: aggs.hierarchical, partialRows, timeRange: parsedTimeRange ? { from: parsedTimeRange.min, to: parsedTimeRange.max, timeFields: allTimeFields } diff --git a/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts b/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts index 24507a7e13058..e5a3acc23eee8 100644 --- a/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts +++ b/src/plugins/data/common/search/search_source/inspect/inspector_stats.ts @@ -50,7 +50,7 @@ export function getRequestInspectorStats(searchSource: ISearchSource) { /** @public */ export function getResponseInspectorStats( - resp: estypes.SearchResponse, + resp?: estypes.SearchResponse, searchSource?: ISearchSource ) { const lastRequest = diff --git a/src/plugins/data/common/search/search_source/search_source.test.ts b/src/plugins/data/common/search/search_source/search_source.test.ts index 3726e5d0c33e8..7f8a4fceff05d 100644 --- a/src/plugins/data/common/search/search_source/search_source.test.ts +++ b/src/plugins/data/common/search/search_source/search_source.test.ts @@ -11,6 +11,10 @@ import { IndexPattern } from '../../index_patterns'; import { GetConfigFn } from '../../types'; import { fetchSoon } from './legacy'; import { SearchSource, SearchSourceDependencies, SortDirection } from './'; +import { AggConfigs, AggTypesRegistryStart } from '../../'; +import { mockAggTypesRegistry } from '../aggs/test_helpers'; +import { RequestResponder } from 'src/plugins/inspector/common'; +import { switchMap } from 'rxjs/operators'; jest.mock('./legacy', () => ({ fetchSoon: jest.fn().mockResolvedValue({}), @@ -39,6 +43,21 @@ const indexPattern2 = ({ getSourceFiltering: () => mockSource2, } as unknown) as IndexPattern; +const fields3 = [{ name: 'foo-bar' }, { name: 'field1' }, { name: 'field2' }]; +const indexPattern3 = ({ + title: 'foo', + fields: { + getByName: (name: string) => { + return fields3.find((field) => field.name === name); + }, + filter: () => { + return fields3; + }, + }, + getComputedFields, + getSourceFiltering: () => mockSource, +} as unknown) as IndexPattern; + const runtimeFieldDef = { type: 'keyword', script: { @@ -61,8 +80,8 @@ describe('SearchSource', () => { .fn() .mockReturnValue( of( - { rawResponse: { isPartial: true, isRunning: true } }, - { rawResponse: { isPartial: false, isRunning: false } } + { rawResponse: { test: 1 }, isPartial: true, isRunning: true }, + { rawResponse: { test: 2 }, isPartial: false, isRunning: false } ) ); @@ -81,17 +100,19 @@ describe('SearchSource', () => { describe('#getField()', () => { test('gets the value for the property', () => { - searchSource.setField('aggs', 5); - expect(searchSource.getField('aggs')).toBe(5); + searchSource.setField('aggs', { i: 5 }); + expect(searchSource.getField('aggs')).toStrictEqual({ i: 5 }); }); }); describe('#getFields()', () => { test('gets the value for the property', () => { - searchSource.setField('aggs', 5); + searchSource.setField('aggs', { i: 5 }); expect(searchSource.getFields()).toMatchInlineSnapshot(` Object { - "aggs": 5, + "aggs": Object { + "i": 5, + }, } `); }); @@ -100,7 +121,7 @@ describe('SearchSource', () => { describe('#removeField()', () => { test('remove property', () => { searchSource = new SearchSource({}, searchSourceDependencies); - searchSource.setField('aggs', 5); + searchSource.setField('aggs', { i: 5 }); searchSource.removeField('aggs'); expect(searchSource.getField('aggs')).toBeFalsy(); }); @@ -108,8 +129,20 @@ describe('SearchSource', () => { describe('#setField() / #flatten', () => { test('sets the value for the property', () => { - searchSource.setField('aggs', 5); - expect(searchSource.getField('aggs')).toBe(5); + searchSource.setField('aggs', { i: 5 }); + expect(searchSource.getField('aggs')).toStrictEqual({ i: 5 }); + }); + + test('sets the value for the property with AggConfigs', () => { + const typesRegistry = mockAggTypesRegistry(); + + const ac = new AggConfigs(indexPattern3, [{ type: 'avg', params: { field: 'field1' } }], { + typesRegistry, + }); + + searchSource.setField('aggs', ac); + const request = searchSource.getSearchRequestBody(); + expect(request.aggs).toStrictEqual({ '1': { avg: { field: 'field1' } } }); }); describe('computed fields handling', () => { @@ -631,7 +664,7 @@ describe('SearchSource', () => { const fn = jest.fn(); searchSource.onRequestStart(fn); const options = {}; - await searchSource.fetch(options); + await searchSource.fetch$(options).toPromise(); expect(fn).toBeCalledWith(searchSource, options); }); @@ -644,7 +677,7 @@ describe('SearchSource', () => { const parentFn = jest.fn(); parent.onRequestStart(parentFn); const options = {}; - await searchSource.fetch(options); + await searchSource.fetch$(options).toPromise(); expect(fn).toBeCalledWith(searchSource, options); expect(parentFn).not.toBeCalled(); @@ -664,69 +697,13 @@ describe('SearchSource', () => { const parentFn = jest.fn(); parent.onRequestStart(parentFn); const options = {}; - await searchSource.fetch(options); + await searchSource.fetch$(options).toPromise(); expect(fn).toBeCalledWith(searchSource, options); expect(parentFn).toBeCalledWith(searchSource, options); }); }); - describe('#legacy fetch()', () => { - beforeEach(() => { - searchSourceDependencies = { - ...searchSourceDependencies, - getConfig: jest.fn(() => { - return true; // batchSearches = true - }) as GetConfigFn, - }; - }); - - test('should call msearch', async () => { - searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); - const options = {}; - await searchSource.fetch(options); - expect(fetchSoon).toBeCalledTimes(1); - }); - }); - - describe('#search service fetch()', () => { - test('should call msearch', async () => { - searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); - const options = {}; - - await searchSource.fetch(options); - expect(mockSearchMethod).toBeCalledTimes(1); - }); - - test('should return partial results', (done) => { - searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); - const options = {}; - - const next = jest.fn(); - const complete = () => { - expect(next).toBeCalledTimes(2); - expect(next.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "isPartial": true, - "isRunning": true, - }, - ] - `); - expect(next.mock.calls[1]).toMatchInlineSnapshot(` - Array [ - Object { - "isPartial": false, - "isRunning": false, - }, - ] - `); - done(); - }; - searchSource.fetch$(options).subscribe({ next, complete }); - }); - }); - describe('#serialize', () => { test('should reference index patterns', () => { const indexPattern123 = { id: '123' } as IndexPattern; @@ -884,4 +861,373 @@ describe('SearchSource', () => { ); }); }); + + describe('fetch$', () => { + describe('#legacy fetch()', () => { + beforeEach(() => { + searchSourceDependencies = { + ...searchSourceDependencies, + getConfig: jest.fn(() => { + return true; // batchSearches = true + }) as GetConfigFn, + }; + }); + + test('should call msearch', async () => { + searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); + const options = {}; + await searchSource.fetch$(options).toPromise(); + expect(fetchSoon).toBeCalledTimes(1); + }); + }); + + describe('responses', () => { + test('should return partial results', async () => { + searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); + const options = {}; + + const next = jest.fn(); + const complete = jest.fn(); + const res$ = searchSource.fetch$(options); + res$.subscribe({ next, complete }); + await res$.toPromise(); + + expect(next).toBeCalledTimes(2); + expect(complete).toBeCalledTimes(1); + expect(next.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "test": 1, + }, + ] + `); + expect(next.mock.calls[1]).toMatchInlineSnapshot(` + Array [ + Object { + "test": 2, + }, + ] + `); + }); + + test('shareReplays result', async () => { + searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); + const options = {}; + + const next = jest.fn(); + const complete = jest.fn(); + const next2 = jest.fn(); + const complete2 = jest.fn(); + const res$ = searchSource.fetch$(options); + res$.subscribe({ next, complete }); + res$.subscribe({ next: next2, complete: complete2 }); + await res$.toPromise(); + + expect(next).toBeCalledTimes(2); + expect(next2).toBeCalledTimes(2); + expect(complete).toBeCalledTimes(1); + expect(complete2).toBeCalledTimes(1); + expect(searchSourceDependencies.search).toHaveBeenCalledTimes(1); + }); + + test('should emit error on empty response', async () => { + searchSourceDependencies.search = mockSearchMethod = jest + .fn() + .mockReturnValue( + of({ rawResponse: { test: 1 }, isPartial: true, isRunning: true }, undefined) + ); + + searchSource = new SearchSource({ index: indexPattern }, searchSourceDependencies); + const options = {}; + + const next = jest.fn(); + const error = jest.fn(); + const complete = jest.fn(); + const res$ = searchSource.fetch$(options); + res$.subscribe({ next, error, complete }); + await res$.toPromise().catch((e) => {}); + + expect(next).toBeCalledTimes(1); + expect(error).toBeCalledTimes(1); + expect(complete).toBeCalledTimes(0); + expect(next.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "test": 1, + }, + ] + `); + expect(error.mock.calls[0][0]).toBe(undefined); + }); + }); + + describe('inspector', () => { + let requestResponder: RequestResponder; + beforeEach(() => { + requestResponder = ({ + stats: jest.fn(), + ok: jest.fn(), + error: jest.fn(), + json: jest.fn(), + } as unknown) as RequestResponder; + }); + + test('calls inspector if provided', async () => { + const options = { + inspector: { + title: 'a', + adapter: { + start: jest.fn().mockReturnValue(requestResponder), + } as any, + }, + }; + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + await searchSource.fetch$(options).toPromise(); + + expect(options.inspector.adapter.start).toBeCalledTimes(1); + expect(requestResponder.error).not.toBeCalled(); + expect(requestResponder.json).toBeCalledTimes(1); + expect(requestResponder.ok).toBeCalledTimes(1); + // First and last + expect(requestResponder.stats).toBeCalledTimes(2); + }); + + test('calls inspector only once, with multiple subs (shareReplay)', async () => { + const options = { + inspector: { + title: 'a', + adapter: { + start: jest.fn().mockReturnValue(requestResponder), + } as any, + }, + }; + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + const res$ = searchSource.fetch$(options); + + const complete1 = jest.fn(); + const complete2 = jest.fn(); + + res$.subscribe({ + complete: complete1, + }); + res$.subscribe({ + complete: complete2, + }); + + await res$.toPromise(); + + expect(complete1).toBeCalledTimes(1); + expect(complete2).toBeCalledTimes(1); + expect(options.inspector.adapter.start).toBeCalledTimes(1); + }); + + test('calls error on inspector', async () => { + const options = { + inspector: { + title: 'a', + adapter: { + start: jest.fn().mockReturnValue(requestResponder), + } as any, + }, + }; + + searchSourceDependencies.search = jest.fn().mockReturnValue(of(Promise.reject('aaaaa'))); + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + await searchSource + .fetch$(options) + .toPromise() + .catch(() => {}); + + expect(options.inspector.adapter.start).toBeCalledTimes(1); + expect(requestResponder.json).toBeCalledTimes(1); + expect(requestResponder.error).toBeCalledTimes(1); + expect(requestResponder.ok).toBeCalledTimes(0); + expect(requestResponder.stats).toBeCalledTimes(0); + }); + }); + + describe('postFlightRequest', () => { + let fetchSub: any; + + function getAggConfigs(typesRegistry: AggTypesRegistryStart, enabled: boolean) { + return new AggConfigs( + indexPattern3, + [ + { + type: 'avg', + enabled, + params: { field: 'field1' }, + }, + ], + { + typesRegistry, + } + ); + } + + beforeEach(() => { + fetchSub = { + next: jest.fn(), + complete: jest.fn(), + error: jest.fn(), + }; + }); + + test('doesnt call any post flight requests if disabled', async () => { + const typesRegistry = mockAggTypesRegistry(); + typesRegistry.get('avg').postFlightRequest = jest.fn(); + const ac = getAggConfigs(typesRegistry, false); + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + searchSource.setField('aggs', ac); + const fetch$ = searchSource.fetch$({}); + fetch$.subscribe(fetchSub); + await fetch$.toPromise(); + + expect(fetchSub.next).toHaveBeenCalledTimes(2); + expect(fetchSub.complete).toHaveBeenCalledTimes(1); + expect(fetchSub.error).toHaveBeenCalledTimes(0); + + expect(typesRegistry.get('avg').postFlightRequest).toHaveBeenCalledTimes(0); + }); + + test('doesnt call any post flight if searchsource has error', async () => { + const typesRegistry = mockAggTypesRegistry(); + typesRegistry.get('avg').postFlightRequest = jest.fn(); + const ac = getAggConfigs(typesRegistry, true); + + searchSourceDependencies.search = jest.fn().mockImplementation(() => + of(1).pipe( + switchMap((r) => { + throw r; + }) + ) + ); + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + searchSource.setField('aggs', ac); + const fetch$ = searchSource.fetch$({}); + fetch$.subscribe(fetchSub); + await fetch$.toPromise().catch((e) => {}); + + expect(fetchSub.next).toHaveBeenCalledTimes(0); + expect(fetchSub.complete).toHaveBeenCalledTimes(0); + expect(fetchSub.error).toHaveBeenNthCalledWith(1, 1); + + expect(typesRegistry.get('avg').postFlightRequest).toHaveBeenCalledTimes(0); + }); + + test('calls post flight requests, fires 1 extra response, returns last response', async () => { + const typesRegistry = mockAggTypesRegistry(); + typesRegistry.get('avg').postFlightRequest = jest.fn().mockResolvedValue({ + other: 5, + }); + + const allac = new AggConfigs( + indexPattern3, + [ + { + type: 'avg', + enabled: true, + params: { field: 'field1' }, + }, + { + type: 'avg', + enabled: true, + params: { field: 'field2' }, + }, + { + type: 'avg', + enabled: true, + params: { field: 'foo-bar' }, + }, + ], + { + typesRegistry, + } + ); + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + searchSource.setField('aggs', allac); + const fetch$ = searchSource.fetch$({}); + fetch$.subscribe(fetchSub); + + const resp = await fetch$.toPromise(); + + expect(fetchSub.next).toHaveBeenCalledTimes(3); + expect(fetchSub.complete).toHaveBeenCalledTimes(1); + expect(fetchSub.error).toHaveBeenCalledTimes(0); + expect(resp).toStrictEqual({ other: 5 }); + expect(typesRegistry.get('avg').postFlightRequest).toHaveBeenCalledTimes(3); + }); + + test('calls post flight requests only once, with multiple subs (shareReplay)', async () => { + const typesRegistry = mockAggTypesRegistry(); + typesRegistry.get('avg').postFlightRequest = jest.fn().mockResolvedValue({ + other: 5, + }); + + const allac = new AggConfigs( + indexPattern3, + [ + { + type: 'avg', + enabled: true, + params: { field: 'field1' }, + }, + ], + { + typesRegistry, + } + ); + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + searchSource.setField('aggs', allac); + const fetch$ = searchSource.fetch$({}); + fetch$.subscribe(fetchSub); + + const fetchSub2 = { + next: jest.fn(), + complete: jest.fn(), + error: jest.fn(), + }; + fetch$.subscribe(fetchSub2); + + await fetch$.toPromise(); + + expect(fetchSub.next).toHaveBeenCalledTimes(3); + expect(fetchSub.complete).toHaveBeenCalledTimes(1); + expect(typesRegistry.get('avg').postFlightRequest).toHaveBeenCalledTimes(1); + }); + + test('calls post flight requests, handles error', async () => { + const typesRegistry = mockAggTypesRegistry(); + typesRegistry.get('avg').postFlightRequest = jest.fn().mockRejectedValue(undefined); + const ac = getAggConfigs(typesRegistry, true); + + searchSource = new SearchSource({}, searchSourceDependencies); + searchSource.setField('index', indexPattern); + searchSource.setField('aggs', ac); + const fetch$ = searchSource.fetch$({}); + fetch$.subscribe(fetchSub); + + await fetch$.toPromise().catch(() => {}); + + expect(fetchSub.next).toHaveBeenCalledTimes(2); + expect(fetchSub.complete).toHaveBeenCalledTimes(0); + expect(fetchSub.error).toHaveBeenCalledTimes(1); + expect(typesRegistry.get('avg').postFlightRequest).toHaveBeenCalledTimes(1); + }); + }); + }); }); diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index e1e7a8292d677..1c1c32228703f 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -60,12 +60,22 @@ import { setWith } from '@elastic/safer-lodash-set'; import { uniqueId, keyBy, pick, difference, isFunction, isEqual, uniqWith, isObject } from 'lodash'; -import { catchError, finalize, map, switchMap, tap } from 'rxjs/operators'; -import { defer, from } from 'rxjs'; +import { + catchError, + finalize, + first, + last, + map, + shareReplay, + switchMap, + tap, +} from 'rxjs/operators'; +import { defer, EMPTY, from, Observable } from 'rxjs'; +import { estypes } from '@elastic/elasticsearch'; import { normalizeSortRequest } from './normalize_sort_request'; import { fieldWildcardFilter } from '../../../../kibana_utils/common'; import { IIndexPattern, IndexPattern, IndexPatternField } from '../../index_patterns'; -import { ISearchGeneric, ISearchOptions } from '../..'; +import { AggConfigs, ISearchGeneric, ISearchOptions } from '../..'; import type { ISearchSource, SearchFieldValue, @@ -75,7 +85,15 @@ import type { import { FetchHandlers, RequestFailure, getSearchParamsFromRequest, SearchRequest } from './fetch'; import { getRequestInspectorStats, getResponseInspectorStats } from './inspect'; -import { getEsQueryConfig, buildEsQuery, Filter, UI_SETTINGS } from '../../../common'; +import { + getEsQueryConfig, + buildEsQuery, + Filter, + UI_SETTINGS, + isErrorResponse, + isPartialResponse, + IKibanaSearchResponse, +} from '../../../common'; import { getHighlightRequest } from '../../../common/field_formats'; import { fetchSoon } from './legacy'; import { extractReferences } from './extract_references'; @@ -256,10 +274,8 @@ export class SearchSource { */ fetch$(options: ISearchOptions = {}) { const { getConfig } = this.dependencies; - return defer(() => this.requestIsStarting(options)).pipe( - tap(() => { - options.requestResponder?.stats(getRequestInspectorStats(this)); - }), + + const s$ = defer(() => this.requestIsStarting(options)).pipe( switchMap(() => { const searchRequest = this.flatten(); this.history = [searchRequest]; @@ -273,21 +289,14 @@ export class SearchSource { }), tap((response) => { // TODO: Remove casting when https://github.com/elastic/elasticsearch-js/issues/1287 is resolved - if ((response as any).error) { + if (!response || (response as any).error) { throw new RequestFailure(null, response); - } else { - options.requestResponder?.stats(getResponseInspectorStats(response, this)); - options.requestResponder?.ok({ json: response }); } }), - catchError((e) => { - options.requestResponder?.error({ json: e }); - throw e; - }), - finalize(() => { - options.requestResponder?.json(this.getSearchRequestBody()); - }) + shareReplay() ); + + return this.inspectSearch(s$, options); } /** @@ -328,9 +337,96 @@ export class SearchSource { * PRIVATE APIS ******/ + private inspectSearch(s$: Observable>, options: ISearchOptions) { + const { id, title, description, adapter } = options.inspector || { title: '' }; + + const requestResponder = adapter?.start(title, { + id, + description, + searchSessionId: options.sessionId, + }); + + const trackRequestBody = () => { + try { + requestResponder?.json(this.getSearchRequestBody()); + } catch (e) {} // eslint-disable-line no-empty + }; + + // Track request stats on first emit, swallow errors + const first$ = s$ + .pipe( + first(undefined, null), + tap(() => { + requestResponder?.stats(getRequestInspectorStats(this)); + trackRequestBody(); + }), + catchError(() => { + trackRequestBody(); + return EMPTY; + }), + finalize(() => { + first$.unsubscribe(); + }) + ) + .subscribe(); + + // Track response stats on last emit, as well as errors + const last$ = s$ + .pipe( + catchError((e) => { + requestResponder?.error({ json: e }); + return EMPTY; + }), + last(undefined, null), + tap((finalResponse) => { + if (finalResponse) { + requestResponder?.stats(getResponseInspectorStats(finalResponse, this)); + requestResponder?.ok({ json: finalResponse }); + } + }), + finalize(() => { + last$.unsubscribe(); + }) + ) + .subscribe(); + + return s$; + } + + private hasPostFlightRequests() { + const aggs = this.getField('aggs'); + if (aggs instanceof AggConfigs) { + return aggs.aggs.some( + (agg) => agg.enabled && typeof agg.type.postFlightRequest === 'function' + ); + } else { + return false; + } + } + + private async fetchOthers(response: estypes.SearchResponse, options: ISearchOptions) { + const aggs = this.getField('aggs'); + if (aggs instanceof AggConfigs) { + for (const agg of aggs.aggs) { + if (agg.enabled && typeof agg.type.postFlightRequest === 'function') { + response = await agg.type.postFlightRequest( + response, + aggs, + agg, + this, + options.inspector?.adapter, + options.abortSignal, + options.sessionId + ); + } + } + return response; + } + } + /** * Run a search using the search service - * @return {Promise>} + * @return {Observable>} */ private fetchSearch$(searchRequest: SearchRequest, options: ISearchOptions) { const { search, getConfig, onResponse } = this.dependencies; @@ -340,6 +436,43 @@ export class SearchSource { }); return search({ params, indexType: searchRequest.indexType }, options).pipe( + switchMap((response) => { + return new Observable>((obs) => { + if (isErrorResponse(response)) { + obs.error(response); + } else if (isPartialResponse(response)) { + obs.next(response); + } else { + if (!this.hasPostFlightRequests()) { + obs.next(response); + obs.complete(); + } else { + // Treat the complete response as partial, then run the postFlightRequests. + obs.next({ + ...response, + isPartial: true, + isRunning: true, + }); + const sub = from(this.fetchOthers(response.rawResponse, options)).subscribe({ + next: (responseWithOther) => { + obs.next({ + ...response, + rawResponse: responseWithOther, + }); + }, + error: (e) => { + obs.error(e); + sub.unsubscribe(); + }, + complete: () => { + obs.complete(); + sub.unsubscribe(); + }, + }); + } + } + }); + }), map(({ rawResponse }) => onResponse(searchRequest, rawResponse)) ); } @@ -452,6 +585,12 @@ export class SearchSource { getConfig(UI_SETTINGS.SORT_OPTIONS) ); return addToBody(key, sort); + case 'aggs': + if ((val as any) instanceof AggConfigs) { + return addToBody('aggs', val.toDsl()); + } else { + return addToBody('aggs', val); + } default: return addToBody(key, val); } diff --git a/src/plugins/data/common/search/search_source/types.ts b/src/plugins/data/common/search/search_source/types.ts index a178b38693d92..99f3f67a5e257 100644 --- a/src/plugins/data/common/search/search_source/types.ts +++ b/src/plugins/data/common/search/search_source/types.ts @@ -7,6 +7,7 @@ */ import { NameList } from 'elasticsearch'; +import { IAggConfigs } from 'src/plugins/data/public'; import { Query } from '../..'; import { Filter } from '../../es_query'; import { IndexPattern } from '../../index_patterns'; @@ -78,7 +79,7 @@ export interface SearchSourceFields { /** * {@link AggConfigs} */ - aggs?: any; + aggs?: object | IAggConfigs | (() => object); from?: number; size?: number; source?: NameList; diff --git a/src/plugins/data/common/search/tabify/index.ts b/src/plugins/data/common/search/tabify/index.ts index 168d4cf9d4c37..74fbc7ba4cfa4 100644 --- a/src/plugins/data/common/search/tabify/index.ts +++ b/src/plugins/data/common/search/tabify/index.ts @@ -6,27 +6,6 @@ * Side Public License, v 1. */ -import { SearchResponse } from 'elasticsearch'; -import { SearchSource } from '../search_source'; -import { tabifyAggResponse } from './tabify'; -import { tabifyDocs, TabifyDocsOptions } from './tabify_docs'; -import { TabbedResponseWriterOptions } from './types'; - -export const tabify = ( - searchSource: SearchSource, - esResponse: SearchResponse, - opts: Partial | TabifyDocsOptions -) => { - return !esResponse.aggregations - ? tabifyDocs(esResponse, searchSource.getField('index'), opts as TabifyDocsOptions) - : tabifyAggResponse( - searchSource.getField('aggs'), - esResponse, - opts as Partial - ); -}; - -export { tabifyDocs }; - +export { tabifyDocs } from './tabify_docs'; export { tabifyAggResponse } from './tabify'; export { tabifyGetColumns } from './get_columns'; diff --git a/src/plugins/data/common/search/types.ts b/src/plugins/data/common/search/types.ts index 37de8dc49d3c6..e3ec499a0020d 100644 --- a/src/plugins/data/common/search/types.ts +++ b/src/plugins/data/common/search/types.ts @@ -9,7 +9,7 @@ import { Observable } from 'rxjs'; import { IEsSearchRequest, IEsSearchResponse } from './es_search'; import { IndexPattern } from '..'; -import type { RequestResponder } from '../../../inspector/common'; +import type { RequestAdapter } from '../../../inspector/common'; export type ISearchGeneric = < SearchStrategyRequest extends IKibanaSearchRequest = IEsSearchRequest, @@ -81,6 +81,13 @@ export interface IKibanaSearchRequest { params?: Params; } +export interface IInspectorInfo { + adapter?: RequestAdapter; + title: string; + id?: string; + description?: string; +} + export interface ISearchOptions { /** * An `AbortSignal` that allows the caller of `search` to abort a search request. @@ -117,10 +124,12 @@ export interface ISearchOptions { /** * Index pattern reference is used for better error messages */ - indexPattern?: IndexPattern; - requestResponder?: RequestResponder; + /** + * Inspector integration options + */ + inspector?: IInspectorInfo; } /** diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 35f13fc855e99..0dd06691d68bb 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -46,6 +46,7 @@ import { FormatFactory as FormatFactory_2 } from 'src/plugins/data/common/field_ import { History } from 'history'; import { Href } from 'history'; import { HttpSetup } from 'kibana/public'; +import { IAggConfigs as IAggConfigs_2 } from 'src/plugins/data/public'; import { IconType } from '@elastic/eui'; import { IncomingHttpHeaders } from 'http'; import { InjectedIntl } from '@kbn/i18n/react'; @@ -254,6 +255,8 @@ export class AggConfigs { getResponseAggById(id: string): AggConfig | undefined; getResponseAggs(): AggConfig[]; // (undocumented) + hierarchical?: boolean; + // (undocumented) indexPattern: IndexPattern; jsonDataEquals(aggConfigs: AggConfig[]): boolean; // (undocumented) @@ -267,7 +270,7 @@ export class AggConfigs { // (undocumented) timeRange?: TimeRange; // (undocumented) - toDsl(hierarchical?: boolean): Record; + toDsl(): Record; } // @internal (undocumented) @@ -1672,13 +1675,11 @@ export type ISearchGeneric = >; + fetch$(options?: ISearchOptions): Observable>; // @deprecated - fetch(options?: ISearchOptions): Promise>; + fetch(options?: ISearchOptions): Promise>; getField(field: K, recurse?: boolean): SearchSourceFields[K]; getFields(): SearchSourceFields; getId(): string; @@ -2462,7 +2463,7 @@ export class SearchSource { // @public export interface SearchSourceFields { // (undocumented) - aggs?: any; + aggs?: object | IAggConfigs_2 | (() => object); // Warning: (ae-forgotten-export) The symbol "SearchFieldValue" needs to be exported by the entry point index.d.ts fields?: SearchFieldValue[]; // @deprecated diff --git a/src/plugins/data/public/search/expressions/esaggs.test.ts b/src/plugins/data/public/search/expressions/esaggs.test.ts index d7a6446781c43..e75bd7be219de 100644 --- a/src/plugins/data/public/search/expressions/esaggs.test.ts +++ b/src/plugins/data/public/search/expressions/esaggs.test.ts @@ -100,17 +100,20 @@ describe('esaggs expression function - public', () => { expect(handleEsaggsRequest).toHaveBeenCalledWith({ abortSignal: mockHandlers.abortSignal, - aggs: { foo: 'bar' }, + aggs: { + foo: 'bar', + hierarchical: true, + }, filters: undefined, indexPattern: {}, inspectorAdapters: mockHandlers.inspectorAdapters, - metricsAtAllLevels: args.metricsAtAllLevels, partialRows: args.partialRows, query: undefined, searchSessionId: 'abc123', searchSourceService: startDependencies.searchSource, timeFields: args.timeFields, timeRange: undefined, + getNow: undefined, }); }); diff --git a/src/plugins/data/public/search/expressions/esaggs.ts b/src/plugins/data/public/search/expressions/esaggs.ts index 45d24af3a6ebb..1e3d56c71e423 100644 --- a/src/plugins/data/public/search/expressions/esaggs.ts +++ b/src/plugins/data/public/search/expressions/esaggs.ts @@ -8,7 +8,6 @@ import { get } from 'lodash'; import { StartServicesAccessor } from 'src/core/public'; -import { Adapters } from 'src/plugins/inspector/common'; import { EsaggsExpressionFunctionDefinition, EsaggsStartDependencies, @@ -44,14 +43,14 @@ export function getFunctionDefinition({ indexPattern, args.aggs!.map((agg) => agg.value) ); + aggConfigs.hierarchical = args.metricsAtAllLevels; return await handleEsaggsRequest({ - abortSignal: (abortSignal as unknown) as AbortSignal, + abortSignal, aggs: aggConfigs, filters: get(input, 'filters', undefined), indexPattern, - inspectorAdapters: inspectorAdapters as Adapters, - metricsAtAllLevels: args.metricsAtAllLevels, + inspectorAdapters, partialRows: args.partialRows, query: get(input, 'query', undefined) as any, searchSessionId: getSearchSessionId(), diff --git a/src/plugins/data/server/search/expressions/esaggs.test.ts b/src/plugins/data/server/search/expressions/esaggs.test.ts index 124a171de6378..15287e9d8cf5b 100644 --- a/src/plugins/data/server/search/expressions/esaggs.test.ts +++ b/src/plugins/data/server/search/expressions/esaggs.test.ts @@ -108,11 +108,13 @@ describe('esaggs expression function - server', () => { expect(handleEsaggsRequest).toHaveBeenCalledWith({ abortSignal: mockHandlers.abortSignal, - aggs: { foo: 'bar' }, + aggs: { + foo: 'bar', + hierarchical: args.metricsAtAllLevels, + }, filters: undefined, indexPattern: {}, inspectorAdapters: mockHandlers.inspectorAdapters, - metricsAtAllLevels: args.metricsAtAllLevels, partialRows: args.partialRows, query: undefined, searchSessionId: 'abc123', diff --git a/src/plugins/data/server/search/expressions/esaggs.ts b/src/plugins/data/server/search/expressions/esaggs.ts index 61fd320d89b95..bb22a491b157e 100644 --- a/src/plugins/data/server/search/expressions/esaggs.ts +++ b/src/plugins/data/server/search/expressions/esaggs.ts @@ -9,7 +9,6 @@ import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; import { KibanaRequest, StartServicesAccessor } from 'src/core/server'; -import { Adapters } from 'src/plugins/inspector/common'; import { EsaggsExpressionFunctionDefinition, EsaggsStartDependencies, @@ -61,13 +60,14 @@ export function getFunctionDefinition({ args.aggs!.map((agg) => agg.value) ); + aggConfigs.hierarchical = args.metricsAtAllLevels; + return await handleEsaggsRequest({ - abortSignal: (abortSignal as unknown) as AbortSignal, + abortSignal, aggs: aggConfigs, filters: get(input, 'filters', undefined), indexPattern, - inspectorAdapters: inspectorAdapters as Adapters, - metricsAtAllLevels: args.metricsAtAllLevels, + inspectorAdapters, partialRows: args.partialRows, query: get(input, 'query', undefined) as any, searchSessionId: getSearchSessionId(), diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 622356c4441ac..3316e8102e50a 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -26,12 +26,14 @@ import { Ensure } from '@kbn/utility-types'; import { EnvironmentMode } from '@kbn/config'; import { ErrorToastOptions } from 'src/core/public/notifications'; import { estypes } from '@elastic/elasticsearch'; +import { EventEmitter } from 'events'; import { ExecutionContext } from 'src/plugins/expressions/common'; import { ExpressionAstExpression } from 'src/plugins/expressions/common'; import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; import { ExpressionsServerSetup } from 'src/plugins/expressions/server'; import { ExpressionValueBoxed } from 'src/plugins/expressions/common'; import { FormatFactory as FormatFactory_2 } from 'src/plugins/data/common/field_formats/utils'; +import { IAggConfigs as IAggConfigs_2 } from 'src/plugins/data/public'; import { ISavedObjectsRepository } from 'src/core/server'; import { IScopedClusterClient } from 'src/core/server'; import { ISearchOptions as ISearchOptions_2 } from 'src/plugins/data/public'; @@ -999,13 +1001,11 @@ export interface IScopedSearchClient extends ISearchClient { export interface ISearchOptions { abortSignal?: AbortSignal; indexPattern?: IndexPattern; + // Warning: (ae-forgotten-export) The symbol "IInspectorInfo" needs to be exported by the entry point index.d.ts + inspector?: IInspectorInfo; isRestore?: boolean; isStored?: boolean; legacyHitsTotal?: boolean; - // Warning: (ae-forgotten-export) The symbol "RequestResponder" needs to be exported by the entry point index.d.ts - // - // (undocumented) - requestResponder?: RequestResponder; sessionId?: string; strategy?: string; } diff --git a/src/plugins/discover/public/application/angular/discover.js b/src/plugins/discover/public/application/angular/discover.js index 35a89eb45f35e..4099d5e8ef7e2 100644 --- a/src/plugins/discover/public/application/angular/discover.js +++ b/src/plugins/discover/public/application/angular/discover.js @@ -415,11 +415,20 @@ function discoverController($route, $scope) { $scope.fetchStatus = fetchStatuses.LOADING; $scope.resultState = getResultState($scope.fetchStatus, $scope.rows); + inspectorAdapters.requests.reset(); return $scope.volatileSearchSource .fetch$({ abortSignal: abortController.signal, sessionId: searchSessionId, - requestResponder: getRequestResponder({ searchSessionId }), + inspector: { + adapter: inspectorAdapters.requests, + title: i18n.translate('discover.inspectorRequestDataTitle', { + defaultMessage: 'data', + }), + description: i18n.translate('discover.inspectorRequestDescription', { + defaultMessage: 'This request queries Elasticsearch to fetch the data for the search.', + }), + }, }) .toPromise() .then(onResults) @@ -465,17 +474,6 @@ function discoverController($route, $scope) { await refetch$.next(); }; - function getRequestResponder({ searchSessionId = null } = { searchSessionId: null }) { - inspectorAdapters.requests.reset(); - const title = i18n.translate('discover.inspectorRequestDataTitle', { - defaultMessage: 'data', - }); - const description = i18n.translate('discover.inspectorRequestDescription', { - defaultMessage: 'This request queries Elasticsearch to fetch the data for the search.', - }); - return inspectorAdapters.requests.start(title, { description, searchSessionId }); - } - $scope.resetQuery = function () { history.push( $route.current.params.id ? `/view/${encodeURIComponent($route.current.params.id)}` : '/' diff --git a/src/plugins/discover/public/application/embeddable/search_embeddable.ts b/src/plugins/discover/public/application/embeddable/search_embeddable.ts index 237da72ae3a52..dbaf07fed18c2 100644 --- a/src/plugins/discover/public/application/embeddable/search_embeddable.ts +++ b/src/plugins/discover/public/application/embeddable/search_embeddable.ts @@ -317,17 +317,6 @@ export class SearchEmbeddable // Log request to inspector this.inspectorAdapters.requests!.reset(); - const title = i18n.translate('discover.embeddable.inspectorRequestDataTitle', { - defaultMessage: 'Data', - }); - const description = i18n.translate('discover.embeddable.inspectorRequestDescription', { - defaultMessage: 'This request queries Elasticsearch to fetch the data for the search.', - }); - - const requestResponder = this.inspectorAdapters.requests!.start(title, { - description, - searchSessionId, - }); this.searchScope.$apply(() => { this.searchScope!.isLoading = true; @@ -340,7 +329,16 @@ export class SearchEmbeddable .fetch$({ abortSignal: this.abortController.signal, sessionId: searchSessionId, - requestResponder, + inspector: { + adapter: this.inspectorAdapters.requests, + title: i18n.translate('discover.embeddable.inspectorRequestDataTitle', { + defaultMessage: 'Data', + }), + description: i18n.translate('discover.embeddable.inspectorRequestDescription', { + defaultMessage: + 'This request queries Elasticsearch to fetch the data for the search.', + }), + }, }) .toPromise(); this.updateOutput({ loading: false, error: undefined }); diff --git a/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts index 2915eaec8ac77..50043772af95b 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts @@ -167,12 +167,6 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource const abortController = new AbortController(); registerCancelCallback(() => abortController.abort()); - const requestResponder = this.getInspectorAdapters()?.requests?.start(requestName, { - id: requestId, - description: requestDescription, - searchSessionId, - }); - let resp; try { resp = await searchSource @@ -180,7 +174,12 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource abortSignal: abortController.signal, sessionId: searchSessionId, legacyHitsTotal: false, - requestResponder, + inspector: { + adapter: this.getInspectorAdapters()?.requests, + id: requestId, + title: requestName, + description: requestDescription, + }, }) .toPromise(); } catch (error) { diff --git a/x-pack/test/examples/search_examples/index.ts b/x-pack/test/examples/search_examples/index.ts index 13eac7566525e..65e214cda4cf8 100644 --- a/x-pack/test/examples/search_examples/index.ts +++ b/x-pack/test/examples/search_examples/index.ts @@ -23,7 +23,8 @@ export default function ({ getService, loadTestFile }: PluginFunctionalProviderC await esArchiver.unload('lens/basic'); }); - loadTestFile(require.resolve('./search_sessions_cache')); loadTestFile(require.resolve('./search_session_example')); + loadTestFile(require.resolve('./search_example')); + loadTestFile(require.resolve('./search_sessions_cache')); }); } diff --git a/x-pack/test/examples/search_examples/search_example.ts b/x-pack/test/examples/search_examples/search_example.ts new file mode 100644 index 0000000000000..19a9535ebb951 --- /dev/null +++ b/x-pack/test/examples/search_examples/search_example.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../functional/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common', 'timePicker']); + const retry = getService('retry'); + + describe.skip('Search session example', () => { + const appId = 'searchExamples'; + + before(async function () { + await PageObjects.common.navigateToApp(appId, { insertTimestamp: false }); + }); + + it('should have an other bucket', async () => { + await PageObjects.timePicker.setAbsoluteRange( + 'Jan 1, 2014 @ 00:00:00.000', + 'Jan 1, 2016 @ 00:00:00.000' + ); + await testSubjects.click('searchSourceWithOther'); + + await retry.waitFor('has other bucket', async () => { + await testSubjects.click('responseTab'); + const codeBlock = await testSubjects.find('responseCodeBlock'); + const visibleText = await codeBlock.getVisibleText(); + return visibleText.indexOf('__other__') > -1; + }); + }); + }); +} From fed17c2b6e71deefb4ff30a1eabff1cb485de283 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Sun, 18 Apr 2021 16:40:54 +0200 Subject: [PATCH 13/82] Rule registry bundle size (#97251) --- x-pack/plugins/apm/common/alert_types.ts | 6 +-- .../plugins/apm/common/anomaly_detection.ts | 2 +- x-pack/plugins/apm/common/ml_constants.ts | 24 ++++++++++++ x-pack/plugins/apm/common/rules.ts | 25 ------------ .../apm/common/rules/apm_rule_field_map.ts | 20 ++++++++++ .../rules/apm_rule_registry_settings.ts | 10 +++++ .../apm/common/service_health_status.ts | 2 +- .../alerting/register_apm_alerts.ts | 19 +++++++--- .../index.tsx | 2 +- .../select_anomaly_severity.test.tsx | 2 +- x-pack/plugins/apm/public/plugin.ts | 38 ++++++++++--------- ...action_duration_anomaly_alert_type.test.ts | 2 +- ...transaction_duration_anomaly_alert_type.ts | 2 +- .../transactions/get_anomaly_data/index.ts | 2 +- x-pack/plugins/apm/server/plugin.ts | 10 +++-- .../common/observability_rule_registry.ts | 22 ----------- .../rules/observability_rule_field_map.ts | 22 +++++++++++ .../observability_rule_registry_settings.ts | 10 +++++ .../public/pages/alerts/index.tsx | 3 +- x-pack/plugins/observability/public/plugin.ts | 24 ++++++------ .../public/rules/formatter_rule_registry.ts | 5 +++ x-pack/plugins/observability/server/plugin.ts | 10 +++-- x-pack/plugins/rule_registry/kibana.json | 5 +-- x-pack/plugins/rule_registry/public/index.ts | 4 +- x-pack/plugins/rule_registry/public/plugin.ts | 4 +- .../public/rule_registry/types.ts | 4 +- 26 files changed, 169 insertions(+), 110 deletions(-) create mode 100644 x-pack/plugins/apm/common/ml_constants.ts delete mode 100644 x-pack/plugins/apm/common/rules.ts create mode 100644 x-pack/plugins/apm/common/rules/apm_rule_field_map.ts create mode 100644 x-pack/plugins/apm/common/rules/apm_rule_registry_settings.ts delete mode 100644 x-pack/plugins/observability/common/observability_rule_registry.ts create mode 100644 x-pack/plugins/observability/common/rules/observability_rule_field_map.ts create mode 100644 x-pack/plugins/observability/common/rules/observability_rule_registry_settings.ts diff --git a/x-pack/plugins/apm/common/alert_types.ts b/x-pack/plugins/apm/common/alert_types.ts index 62bd07ce6f500..12df93d54b296 100644 --- a/x-pack/plugins/apm/common/alert_types.ts +++ b/x-pack/plugins/apm/common/alert_types.ts @@ -6,9 +6,9 @@ */ import { i18n } from '@kbn/i18n'; -import { ValuesType } from 'utility-types'; -import { ActionGroup } from '../../alerting/common'; -import { ANOMALY_SEVERITY, ANOMALY_THRESHOLD } from '../../ml/common'; +import type { ValuesType } from 'utility-types'; +import type { ActionGroup } from '../../alerting/common'; +import { ANOMALY_SEVERITY, ANOMALY_THRESHOLD } from './ml_constants'; export enum AlertType { ErrorCount = 'apm.error_rate', // ErrorRate was renamed to ErrorCount but the key is kept as `error_rate` for backwards-compat. diff --git a/x-pack/plugins/apm/common/anomaly_detection.ts b/x-pack/plugins/apm/common/anomaly_detection.ts index b9cc3de8bb5d0..43a779407d2a4 100644 --- a/x-pack/plugins/apm/common/anomaly_detection.ts +++ b/x-pack/plugins/apm/common/anomaly_detection.ts @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import { ANOMALY_SEVERITY } from '../../ml/common'; +import { ANOMALY_SEVERITY } from './ml_constants'; import { getSeverityType, getSeverityColor as mlGetSeverityColor, diff --git a/x-pack/plugins/apm/common/ml_constants.ts b/x-pack/plugins/apm/common/ml_constants.ts new file mode 100644 index 0000000000000..7818299d9d883 --- /dev/null +++ b/x-pack/plugins/apm/common/ml_constants.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// copied from ml/common, to keep the bundle size small +export enum ANOMALY_SEVERITY { + CRITICAL = 'critical', + MAJOR = 'major', + MINOR = 'minor', + WARNING = 'warning', + LOW = 'low', + UNKNOWN = 'unknown', +} + +export enum ANOMALY_THRESHOLD { + CRITICAL = 75, + MAJOR = 50, + MINOR = 25, + WARNING = 3, + LOW = 0, +} diff --git a/x-pack/plugins/apm/common/rules.ts b/x-pack/plugins/apm/common/rules.ts deleted file mode 100644 index a3b60a785f5c7..0000000000000 --- a/x-pack/plugins/apm/common/rules.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -const plainApmRuleRegistrySettings = { - name: 'apm', - fieldMap: { - 'service.environment': { - type: 'keyword', - }, - 'transaction.type': { - type: 'keyword', - }, - 'processor.event': { - type: 'keyword', - }, - }, -} as const; - -type APMRuleRegistrySettings = typeof plainApmRuleRegistrySettings; - -export const apmRuleRegistrySettings: APMRuleRegistrySettings = plainApmRuleRegistrySettings; diff --git a/x-pack/plugins/apm/common/rules/apm_rule_field_map.ts b/x-pack/plugins/apm/common/rules/apm_rule_field_map.ts new file mode 100644 index 0000000000000..9bbd9381c2319 --- /dev/null +++ b/x-pack/plugins/apm/common/rules/apm_rule_field_map.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const apmRuleFieldMap = { + 'service.environment': { + type: 'keyword', + }, + 'transaction.type': { + type: 'keyword', + }, + 'processor.event': { + type: 'keyword', + }, +} as const; + +export type APMRuleFieldMap = typeof apmRuleFieldMap; diff --git a/x-pack/plugins/apm/common/rules/apm_rule_registry_settings.ts b/x-pack/plugins/apm/common/rules/apm_rule_registry_settings.ts new file mode 100644 index 0000000000000..1257db4e6a4d3 --- /dev/null +++ b/x-pack/plugins/apm/common/rules/apm_rule_registry_settings.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const apmRuleRegistrySettings = { + name: 'apm', +}; diff --git a/x-pack/plugins/apm/common/service_health_status.ts b/x-pack/plugins/apm/common/service_health_status.ts index 71c373a48c9d5..b5318f9333e4f 100644 --- a/x-pack/plugins/apm/common/service_health_status.ts +++ b/x-pack/plugins/apm/common/service_health_status.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { EuiTheme } from '../../../../src/plugins/kibana_react/common'; -import { ANOMALY_SEVERITY } from '../../ml/common'; +import { ANOMALY_SEVERITY } from './ml_constants'; export enum ServiceHealthStatus { healthy = 'healthy', diff --git a/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts b/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts index 8834cbc70e0b1..583be94c30a34 100644 --- a/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts +++ b/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts @@ -7,11 +7,20 @@ import { i18n } from '@kbn/i18n'; import { lazy } from 'react'; -import { format } from 'url'; +import { stringify } from 'querystring'; import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; -import { asDuration, asPercent } from '../../../common/utils/formatters'; import { AlertType } from '../../../common/alert_types'; -import { ApmRuleRegistry } from '../../plugin'; +import type { ApmRuleRegistry } from '../../plugin'; + +const format = ({ + pathname, + query, +}: { + pathname: string; + query: Record; +}): string => { + return `${pathname}?${stringify(query)}`; +}; export function registerApmAlerts(apmRuleRegistry: ApmRuleRegistry) { apmRuleRegistry.registerType({ @@ -71,7 +80,7 @@ export function registerApmAlerts(apmRuleRegistry: ApmRuleRegistry) { 'Alert when the latency of a specific transaction type in a service exceeds a defined threshold.', } ), - format: ({ alert }) => ({ + format: ({ alert, formatters: { asDuration } }) => ({ reason: i18n.translate( 'xpack.apm.alertTypes.transactionDuration.reason', { @@ -131,7 +140,7 @@ export function registerApmAlerts(apmRuleRegistry: ApmRuleRegistry) { 'Alert when the rate of transaction errors in a service exceeds a defined threshold.', } ), - format: ({ alert }) => ({ + format: ({ alert, formatters: { asPercent } }) => ({ reason: i18n.translate( 'xpack.apm.alertTypes.transactionErrorRate.reason', { diff --git a/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/index.tsx b/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/index.tsx index 62926796cafb4..10d139f6ccea3 100644 --- a/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/index.tsx @@ -8,7 +8,7 @@ import { useParams } from 'react-router-dom'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { ANOMALY_SEVERITY } from '../../../../../ml/common'; +import { ANOMALY_SEVERITY } from '../../../../common/ml_constants'; import { useEnvironmentsFetcher } from '../../../hooks/use_environments_fetcher'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { ServiceAlertTrigger } from '../service_alert_trigger'; diff --git a/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/select_anomaly_severity.test.tsx b/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/select_anomaly_severity.test.tsx index 85f48ae151e10..7b56eaa4721de 100644 --- a/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/select_anomaly_severity.test.tsx +++ b/x-pack/plugins/apm/public/components/alerting/transaction_duration_anomaly_alert_trigger/select_anomaly_severity.test.tsx @@ -8,7 +8,7 @@ import { render } from '@testing-library/react'; import React, { ReactNode } from 'react'; import { IntlProvider } from 'react-intl'; -import { ANOMALY_SEVERITY } from '../../../../../ml/common'; +import { ANOMALY_SEVERITY } from '../../../../common/ml_constants'; import { SelectAnomalySeverity } from './select_anomaly_severity'; function Wrapper({ children }: { children?: ReactNode }) { diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts index 391c54c1e2497..143076e56c831 100644 --- a/x-pack/plugins/apm/public/plugin.ts +++ b/x-pack/plugins/apm/public/plugin.ts @@ -5,13 +5,7 @@ * 2.0. */ -import { ConfigSchema } from '.'; -import { - FetchDataParams, - FormatterRuleRegistry, - HasDataParams, - ObservabilityPublicSetup, -} from '../../observability/public'; +import type { ConfigSchema } from '.'; import { AppMountParameters, CoreSetup, @@ -20,28 +14,35 @@ import { Plugin, PluginInitializerContext, } from '../../../../src/core/public'; -import { +import type { DataPublicPluginSetup, DataPublicPluginStart, } from '../../../../src/plugins/data/public'; -import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; -import { +import type { EmbeddableStart } from '../../../../src/plugins/embeddable/public'; +import type { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; +import type { PluginSetupContract as AlertingPluginPublicSetup, PluginStartContract as AlertingPluginPublicStart, } from '../../alerting/public'; -import { FeaturesPluginSetup } from '../../features/public'; -import { LicensingPluginSetup } from '../../licensing/public'; -import { +import type { FeaturesPluginSetup } from '../../features/public'; +import type { LicensingPluginSetup } from '../../licensing/public'; +import type { MapsStartApi } from '../../maps/public'; +import type { MlPluginSetup, MlPluginStart } from '../../ml/public'; +import type { + FetchDataParams, + HasDataParams, + ObservabilityPublicSetup, +} from '../../observability/public'; +import { FormatterRuleRegistry } from '../../observability/public'; +import type { TriggersAndActionsUIPublicPluginSetup, TriggersAndActionsUIPublicPluginStart, } from '../../triggers_actions_ui/public'; +import { apmRuleRegistrySettings } from '../common/rules/apm_rule_registry_settings'; +import type { APMRuleFieldMap } from '../common/rules/apm_rule_field_map'; +import { registerApmAlerts } from './components/alerting/register_apm_alerts'; import { featureCatalogueEntry } from './featureCatalogueEntry'; import { toggleAppLinkInNav } from './toggleAppLinkInNav'; -import { EmbeddableStart } from '../../../../src/plugins/embeddable/public'; -import { registerApmAlerts } from './components/alerting/register_apm_alerts'; -import { MlPluginSetup, MlPluginStart } from '../../ml/public'; -import { MapsStartApi } from '../../maps/public'; -import { apmRuleRegistrySettings } from '../common/rules'; export type ApmPluginSetup = ReturnType; export type ApmRuleRegistry = ApmPluginSetup['ruleRegistry']; @@ -162,6 +163,7 @@ export class ApmPlugin implements Plugin { const apmRuleRegistry = plugins.observability.ruleRegistry.create({ ...apmRuleRegistrySettings, + fieldMap: {} as APMRuleFieldMap, ctor: FormatterRuleRegistry, }); diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts index b9346b2bf4649..ad1a8fcbf6e55 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts @@ -5,7 +5,7 @@ * 2.0. */ import { registerTransactionDurationAnomalyAlertType } from './register_transaction_duration_anomaly_alert_type'; -import { ANOMALY_SEVERITY } from '../../../../ml/common'; +import { ANOMALY_SEVERITY } from '../../../common/ml_constants'; import { Job, MlPluginSetup } from '../../../../ml/server'; import * as GetServiceAnomalies from '../service_map/get_service_anomalies'; import { createRuleTypeMocks } from './test_utils'; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts index 66eb7125b0370..67ff7cdb8e4e0 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts @@ -18,7 +18,7 @@ import { TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; import { asMutableArray } from '../../../common/utils/as_mutable_array'; -import { ANOMALY_SEVERITY } from '../../../../ml/common'; +import { ANOMALY_SEVERITY } from '../../../common/ml_constants'; import { KibanaRequest } from '../../../../../../src/core/server'; import { AlertType, diff --git a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts index a03b1ac82e90a..bcd279c57f4a5 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts @@ -14,7 +14,7 @@ import { getBucketSize } from '../../helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { anomalySeriesFetcher } from './fetcher'; import { getMLJobIds } from '../../service_map/get_service_anomalies'; -import { ANOMALY_THRESHOLD } from '../../../../../ml/common'; +import { ANOMALY_THRESHOLD } from '../../../../common/ml_constants'; import { withApmSpan } from '../../../utils/with_apm_span'; export async function getAnomalySeries({ diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index 714b887a4008b..d62a3e6a5d5d7 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -42,7 +42,8 @@ import { } from './types'; import { registerRoutes } from './routes/register_routes'; import { getGlobalApmServerRouteRepository } from './routes/get_global_apm_server_route_repository'; -import { apmRuleRegistrySettings } from '../common/rules'; +import { apmRuleRegistrySettings } from '../common/rules/apm_rule_registry_settings'; +import { apmRuleFieldMap } from '../common/rules/apm_rule_field_map'; export type APMRuleRegistry = ReturnType['ruleRegistry']; @@ -151,9 +152,10 @@ export class APMPlugin config: await mergedConfig$.pipe(take(1)).toPromise(), }); - const apmRuleRegistry = plugins.observability.ruleRegistry.create( - apmRuleRegistrySettings - ); + const apmRuleRegistry = plugins.observability.ruleRegistry.create({ + ...apmRuleRegistrySettings, + fieldMap: apmRuleFieldMap, + }); registerApmAlerts({ registry: apmRuleRegistry, diff --git a/x-pack/plugins/observability/common/observability_rule_registry.ts b/x-pack/plugins/observability/common/observability_rule_registry.ts deleted file mode 100644 index 9254401fc19c4..0000000000000 --- a/x-pack/plugins/observability/common/observability_rule_registry.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { ecsFieldMap, pickWithPatterns } from '../../rule_registry/common'; - -export const observabilityRuleRegistrySettings = { - name: 'observability', - fieldMap: { - ...pickWithPatterns(ecsFieldMap, 'host.name', 'service.name'), - 'kibana.observability.evaluation.value': { - type: 'scaled_float' as const, - scaling_factor: 1000, - }, - 'kibana.observability.evaluation.threshold': { - type: 'scaled_float' as const, - scaling_factor: 1000, - }, - }, -}; diff --git a/x-pack/plugins/observability/common/rules/observability_rule_field_map.ts b/x-pack/plugins/observability/common/rules/observability_rule_field_map.ts new file mode 100644 index 0000000000000..370f5d4ef79f2 --- /dev/null +++ b/x-pack/plugins/observability/common/rules/observability_rule_field_map.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ecsFieldMap, pickWithPatterns } from '../../../rule_registry/common'; + +export const observabilityRuleFieldMap = { + ...pickWithPatterns(ecsFieldMap, 'host.name', 'service.name'), + 'kibana.observability.evaluation.value': { + type: 'scaled_float' as const, + scaling_factor: 1000, + }, + 'kibana.observability.evaluation.threshold': { + type: 'scaled_float' as const, + scaling_factor: 1000, + }, +}; + +export type ObservabilityRuleFieldMap = typeof observabilityRuleFieldMap; diff --git a/x-pack/plugins/observability/common/rules/observability_rule_registry_settings.ts b/x-pack/plugins/observability/common/rules/observability_rule_registry_settings.ts new file mode 100644 index 0000000000000..c901d912eb70f --- /dev/null +++ b/x-pack/plugins/observability/common/rules/observability_rule_registry_settings.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const observabilityRuleRegistrySettings = { + name: 'observability', +}; diff --git a/x-pack/plugins/observability/public/pages/alerts/index.tsx b/x-pack/plugins/observability/public/pages/alerts/index.tsx index 0089465003393..aa5fb2c32ea11 100644 --- a/x-pack/plugins/observability/public/pages/alerts/index.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/index.tsx @@ -24,6 +24,7 @@ import { usePluginContext } from '../../hooks/use_plugin_context'; import { RouteParams } from '../../routes'; import { callObservabilityApi } from '../../services/call_observability_api'; import { getAbsoluteDateRange } from '../../utils/date'; +import { asDuration, asPercent } from '../../../common/utils/formatters'; import { AlertsSearchBar } from './alerts_search_bar'; import { AlertsTable } from './alerts_table'; @@ -68,7 +69,7 @@ export function AlertsPage({ routeParams }: AlertsPageProps) { const formatted = { link: undefined, reason: alert['rule.name'], - ...(ruleType?.format?.({ alert }) ?? {}), + ...(ruleType?.format?.({ alert, formatters: { asDuration, asPercent } }) ?? {}), }; const parsedLink = formatted.link ? parse(formatted.link, true) : undefined; diff --git a/x-pack/plugins/observability/public/plugin.ts b/x-pack/plugins/observability/public/plugin.ts index 491eb36d01ac0..1f56bdebbbb9b 100644 --- a/x-pack/plugins/observability/public/plugin.ts +++ b/x-pack/plugins/observability/public/plugin.ts @@ -5,32 +5,33 @@ * 2.0. */ -import { BehaviorSubject } from 'rxjs'; import { i18n } from '@kbn/i18n'; -import type { RuleRegistryPublicPluginSetupContract } from '../../rule_registry/public'; -import type { - DataPublicPluginSetup, - DataPublicPluginStart, -} from '../../../../src/plugins/data/public'; +import { BehaviorSubject } from 'rxjs'; import { AppMountParameters, AppUpdater, CoreSetup, + CoreStart, DEFAULT_APP_CATEGORIES, Plugin as PluginClass, PluginInitializerContext, - CoreStart, } from '../../../../src/core/public'; +import type { + DataPublicPluginSetup, + DataPublicPluginStart, +} from '../../../../src/plugins/data/public'; import type { HomePublicPluginSetup, HomePublicPluginStart, } from '../../../../src/plugins/home/public'; -import { registerDataHandler } from './data_handler'; -import { toggleOverviewLinkInNav } from './toggle_overview_link_in_nav'; import type { LensPublicStart } from '../../lens/public'; -import { createCallObservabilityApi } from './services/call_observability_api'; -import { observabilityRuleRegistrySettings } from '../common/observability_rule_registry'; +import type { RuleRegistryPublicPluginSetupContract } from '../../rule_registry/public'; +import type { ObservabilityRuleFieldMap } from '../common/rules/observability_rule_field_map'; +import { observabilityRuleRegistrySettings } from '../common/rules/observability_rule_registry_settings'; +import { registerDataHandler } from './data_handler'; import { FormatterRuleRegistry } from './rules/formatter_rule_registry'; +import { createCallObservabilityApi } from './services/call_observability_api'; +import { toggleOverviewLinkInNav } from './toggle_overview_link_in_nav'; export type ObservabilityPublicSetup = ReturnType; export type ObservabilityRuleRegistry = ObservabilityPublicSetup['ruleRegistry']; @@ -72,6 +73,7 @@ export class Plugin const observabilityRuleRegistry = pluginsSetup.ruleRegistry.registry.create({ ...observabilityRuleRegistrySettings, + fieldMap: {} as ObservabilityRuleFieldMap, ctor: FormatterRuleRegistry, }); diff --git a/x-pack/plugins/observability/public/rules/formatter_rule_registry.ts b/x-pack/plugins/observability/public/rules/formatter_rule_registry.ts index 87e6b3c324634..0d0d22cf750fb 100644 --- a/x-pack/plugins/observability/public/rules/formatter_rule_registry.ts +++ b/x-pack/plugins/observability/public/rules/formatter_rule_registry.ts @@ -7,12 +7,17 @@ import type { RuleType } from '../../../rule_registry/public'; import type { BaseRuleFieldMap, OutputOfFieldMap } from '../../../rule_registry/common'; import { RuleRegistry } from '../../../rule_registry/public'; +import type { asDuration, asPercent } from '../../common/utils/formatters'; type AlertTypeOf = OutputOfFieldMap; type FormattableRuleType = RuleType & { format?: (options: { alert: AlertTypeOf; + formatters: { + asDuration: typeof asDuration; + asPercent: typeof asPercent; + }; }) => { reason?: string; link?: string; diff --git a/x-pack/plugins/observability/server/plugin.ts b/x-pack/plugins/observability/server/plugin.ts index b167600e788a4..b5208260297d0 100644 --- a/x-pack/plugins/observability/server/plugin.ts +++ b/x-pack/plugins/observability/server/plugin.ts @@ -16,7 +16,8 @@ import type { RuleRegistryPluginSetupContract } from '../../rule_registry/server import { uiSettings } from './ui_settings'; import { registerRoutes } from './routes/register_routes'; import { getGlobalObservabilityServerRouteRepository } from './routes/get_global_observability_server_route_repository'; -import { observabilityRuleRegistrySettings } from '../common/observability_rule_registry'; +import { observabilityRuleRegistrySettings } from '../common/rules/observability_rule_registry_settings'; +import { observabilityRuleFieldMap } from '../common/rules/observability_rule_field_map'; export type ObservabilityPluginSetup = ReturnType; export type ObservabilityRuleRegistry = ObservabilityPluginSetup['ruleRegistry']; @@ -50,9 +51,10 @@ export class ObservabilityPlugin implements Plugin { }); } - const observabilityRuleRegistry = plugins.ruleRegistry.create( - observabilityRuleRegistrySettings - ); + const observabilityRuleRegistry = plugins.ruleRegistry.create({ + ...observabilityRuleRegistrySettings, + fieldMap: observabilityRuleFieldMap, + }); registerRoutes({ core: { diff --git a/x-pack/plugins/rule_registry/kibana.json b/x-pack/plugins/rule_registry/kibana.json index 1636f88a21a61..ec2b366f739e6 100644 --- a/x-pack/plugins/rule_registry/kibana.json +++ b/x-pack/plugins/rule_registry/kibana.json @@ -11,8 +11,5 @@ "triggersActionsUi" ], "server": true, - "ui": true, - "extraPublicDirs": [ - "common" - ] + "ui": true } diff --git a/x-pack/plugins/rule_registry/public/index.ts b/x-pack/plugins/rule_registry/public/index.ts index 55662dbcc8bfc..59697261ff20b 100644 --- a/x-pack/plugins/rule_registry/public/index.ts +++ b/x-pack/plugins/rule_registry/public/index.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { PluginInitializerContext } from 'kibana/public'; +import type { PluginInitializerContext } from 'kibana/public'; import { Plugin } from './plugin'; -export { RuleRegistryPublicPluginSetupContract } from './plugin'; +export type { RuleRegistryPublicPluginSetupContract } from './plugin'; export { RuleRegistry } from './rule_registry'; export type { IRuleRegistry, RuleType } from './rule_registry/types'; diff --git a/x-pack/plugins/rule_registry/public/plugin.ts b/x-pack/plugins/rule_registry/public/plugin.ts index 66c9a4fa224a5..7f0bceefb6797 100644 --- a/x-pack/plugins/rule_registry/public/plugin.ts +++ b/x-pack/plugins/rule_registry/public/plugin.ts @@ -19,7 +19,7 @@ import type { TriggersAndActionsUIPublicPluginSetup, TriggersAndActionsUIPublicPluginStart, } from '../../triggers_actions_ui/public'; -import { baseRuleFieldMap } from '../common'; +import type { BaseRuleFieldMap } from '../common'; import { RuleRegistry } from './rule_registry'; interface RuleRegistrySetupPlugins { @@ -40,7 +40,7 @@ export class Plugin public setup(core: CoreSetup, plugins: RuleRegistrySetupPlugins) { const rootRegistry = new RuleRegistry({ - fieldMap: baseRuleFieldMap, + fieldMap: {} as BaseRuleFieldMap, alertTypeRegistry: plugins.triggersActionsUi.alertTypeRegistry, }); return { diff --git a/x-pack/plugins/rule_registry/public/rule_registry/types.ts b/x-pack/plugins/rule_registry/public/rule_registry/types.ts index bb16227cbab5f..7c186385ebd35 100644 --- a/x-pack/plugins/rule_registry/public/rule_registry/types.ts +++ b/x-pack/plugins/rule_registry/public/rule_registry/types.ts @@ -4,8 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { AlertTypeRegistryContract } from '../../../triggers_actions_ui/public'; -import { BaseRuleFieldMap, FieldMap } from '../../common'; +import type { AlertTypeRegistryContract } from '../../../triggers_actions_ui/public'; +import type { BaseRuleFieldMap, FieldMap } from '../../common'; export interface RuleRegistryConstructorOptions { fieldMap: TFieldMap; From 05bd1c0cdbed2f2b5586af517a5c2d42ae5a366b Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Sun, 18 Apr 2021 16:47:24 +0200 Subject: [PATCH 14/82] [Fleet] Finer-grained error information from install/upgrade API (#95649) * Intercept installation errors and add meta info. * Adjust mock. * Catch errors in all steps of install/upgrade. * Adjust handler for direct package upload. * Don't throw not-found errors on assets during rollback. * Correctly catch errors from _installPackage() * Propagate error from installResult in bulk install case. * Add tests for rollback. * Remove unused code. * Skipping test that doesn't test what it says. * Fix and reenable test. --- .../plugins/fleet/common/types/models/epm.ts | 2 +- .../fleet/common/types/rest_spec/epm.ts | 7 +- .../fleet/server/routes/epm/handlers.ts | 46 ++-- .../epm/packages/bulk_install_packages.ts | 50 +++-- .../ensure_installed_default_packages.test.ts | 10 +- .../server/services/epm/packages/install.ts | 208 ++++++++++-------- .../server/services/epm/packages/remove.ts | 7 +- .../fleet_api_integration/apis/epm/index.js | 1 + .../apis/epm/install_error_rollback.ts | 61 +++++ .../error_handling/0.1.0/docs/README.md | 3 + .../visualization/sample_visualization.json | 14 ++ .../error_handling/0.1.0/manifest.yml | 20 ++ .../error_handling/0.2.0/docs/README.md | 5 + .../visualization/sample_visualization.json | 14 ++ .../error_handling/0.2.0/manifest.yml | 19 ++ 15 files changed, 327 insertions(+), 140 deletions(-) create mode 100644 x-pack/test/fleet_api_integration/apis/epm/install_error_rollback.ts create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/docs/README.md create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/kibana/visualization/sample_visualization.json create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/manifest.yml create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/docs/README.md create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/kibana/visualization/sample_visualization.json create mode 100644 x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/manifest.yml diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 3bc0d97d64646..1a594e77f4857 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -30,7 +30,7 @@ export enum InstallStatus { uninstalling = 'uninstalling', } -export type InstallType = 'reinstall' | 'reupdate' | 'rollback' | 'update' | 'install'; +export type InstallType = 'reinstall' | 'reupdate' | 'rollback' | 'update' | 'install' | 'unknown'; export type InstallSource = 'registry' | 'upload'; export type EpmPackageInstallStatus = 'installed' | 'installing'; diff --git a/x-pack/plugins/fleet/common/types/rest_spec/epm.ts b/x-pack/plugins/fleet/common/types/rest_spec/epm.ts index 3c7a32265d20a..e5c7ace420c73 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/epm.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/epm.ts @@ -12,6 +12,7 @@ import type { RegistrySearchResult, PackageInfo, PackageUsageStats, + InstallType, } from '../models/epm'; export interface GetCategoriesRequest { @@ -83,8 +84,10 @@ export interface IBulkInstallPackageHTTPError { } export interface InstallResult { - assets: AssetReference[]; - status: 'installed' | 'already_installed'; + assets?: AssetReference[]; + status?: 'installed' | 'already_installed'; + error?: Error; + installType: InstallType; } export interface BulkInstallPackageInfo { diff --git a/x-pack/plugins/fleet/server/routes/epm/handlers.ts b/x-pack/plugins/fleet/server/routes/epm/handlers.ts index f0d6e68427361..16d583f8a8d1f 100644 --- a/x-pack/plugins/fleet/server/routes/epm/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/epm/handlers.ts @@ -226,20 +226,21 @@ export const installPackageFromRegistryHandler: RequestHandler< const savedObjectsClient = context.core.savedObjects.client; const esClient = context.core.elasticsearch.client.asCurrentUser; const { pkgkey } = request.params; - try { - const res = await installPackage({ - installSource: 'registry', - savedObjectsClient, - pkgkey, - esClient, - force: request.body?.force, - }); + + const res = await installPackage({ + installSource: 'registry', + savedObjectsClient, + pkgkey, + esClient, + force: request.body?.force, + }); + if (!res.error) { const body: InstallPackageResponse = { - response: res.assets, + response: res.assets || [], }; return response.ok({ body }); - } catch (e) { - return await defaultIngestErrorHandler({ error: e, response }); + } else { + return await defaultIngestErrorHandler({ error: res.error, response }); } }; @@ -292,20 +293,21 @@ export const installPackageByUploadHandler: RequestHandler< const esClient = context.core.elasticsearch.client.asCurrentUser; const contentType = request.headers['content-type'] as string; // from types it could also be string[] or undefined but this is checked later const archiveBuffer = Buffer.from(request.body); - try { - const res = await installPackage({ - installSource: 'upload', - savedObjectsClient, - esClient, - archiveBuffer, - contentType, - }); + + const res = await installPackage({ + installSource: 'upload', + savedObjectsClient, + esClient, + archiveBuffer, + contentType, + }); + if (!res.error) { const body: InstallPackageResponse = { - response: res.assets, + response: res.assets || [], }; return response.ok({ body }); - } catch (error) { - return defaultIngestErrorHandler({ error, response }); + } else { + return defaultIngestErrorHandler({ error: res.error, response }); } }; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts index 7323263d4a70f..baaaaf6c6b0cf 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts @@ -32,22 +32,27 @@ export async function bulkInstallPackages({ ); logger.debug(`kicking off bulk install of ${packagesToInstall.join(', ')} from registry`); - const installResults = await Promise.allSettled( + const bulkInstallResults = await Promise.allSettled( latestPackagesResults.map(async (result, index) => { const packageName = packagesToInstall[index]; if (result.status === 'fulfilled') { const latestPackage = result.value; - return { - name: packageName, - version: latestPackage.version, - result: await installPackage({ - savedObjectsClient, - esClient, - pkgkey: Registry.pkgToPkgKey(latestPackage), - installSource, - skipPostInstall: true, - }), - }; + const installResult = await installPackage({ + savedObjectsClient, + esClient, + pkgkey: Registry.pkgToPkgKey(latestPackage), + installSource, + skipPostInstall: true, + }); + if (installResult.error) { + return { name: packageName, error: installResult.error }; + } else { + return { + name: packageName, + version: latestPackage.version, + result: installResult, + }; + } } return { name: packageName, error: result.reason }; }) @@ -56,18 +61,27 @@ export async function bulkInstallPackages({ // only install index patterns if we completed install for any package-version for the // first time, aka fresh installs or upgrades if ( - installResults.find( - (result) => result.status === 'fulfilled' && result.value.result?.status === 'installed' + bulkInstallResults.find( + (result) => + result.status === 'fulfilled' && + !result.value.result?.error && + result.value.result?.status === 'installed' ) ) { await installIndexPatterns({ savedObjectsClient, esClient, installSource }); } - return installResults.map((result, index) => { + return bulkInstallResults.map((result, index) => { const packageName = packagesToInstall[index]; - return result.status === 'fulfilled' - ? result.value - : { name: packageName, error: result.reason }; + if (result.status === 'fulfilled') { + if (result.value && result.value.error) { + return { name: packageName, error: result.value.error }; + } else { + return result.value; + } + } else { + return { name: packageName, error: result.reason }; + } }); } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts index fa2ea9e2209ed..f8c91e55fbbb6 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts @@ -77,7 +77,7 @@ describe('ensureInstalledDefaultPackages', () => { return [ { name: mockInstallation.attributes.name, - result: { assets: [], status: 'installed' }, + result: { assets: [], status: 'installed', installType: 'install' }, version: '', statusCode: 200, }, @@ -95,13 +95,13 @@ describe('ensureInstalledDefaultPackages', () => { return [ { name: 'success one', - result: { assets: [], status: 'installed' }, + result: { assets: [], status: 'installed', installType: 'install' }, version: '', statusCode: 200, }, { name: 'success two', - result: { assets: [], status: 'installed' }, + result: { assets: [], status: 'installed', installType: 'install' }, version: '', statusCode: 200, }, @@ -111,7 +111,7 @@ describe('ensureInstalledDefaultPackages', () => { }, { name: 'success three', - result: { assets: [], status: 'installed' }, + result: { assets: [], status: 'installed', installType: 'install' }, version: '', statusCode: 200, }, @@ -134,7 +134,7 @@ describe('ensureInstalledDefaultPackages', () => { return [ { name: 'undefined package', - result: { assets: [], status: 'installed' }, + result: { assets: [], status: 'installed', installType: 'install' }, version: '', statusCode: 200, }, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 4373251a969bc..31d0732096790 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -201,54 +201,62 @@ async function installPackageFromRegistry({ // TODO: change epm API to /packageName/version so we don't need to do this const { pkgName, pkgVersion } = Registry.splitPkgKey(pkgkey); - // get the currently installed package - const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); - const installType = getInstallType({ pkgVersion, installedPkg }); - - // get latest package version - const latestPackage = await Registry.fetchFindLatestPackage(pkgName); - - // let the user install if using the force flag or needing to reinstall or install a previous version due to failed update - const installOutOfDateVersionOk = - force || ['reinstall', 'reupdate', 'rollback'].includes(installType); + // if an error happens during getInstallType, report that we don't know + let installType: InstallType = 'unknown'; - // if the requested version is the same as installed version, check if we allow it based on - // current installed package status and force flag, if we don't allow it, - // just return the asset references from the existing installation - if ( - installedPkg?.attributes.version === pkgVersion && - installedPkg?.attributes.install_status === 'installed' - ) { - if (!force) { - logger.debug(`${pkgkey} is already installed, skipping installation`); - return { - assets: [ - ...installedPkg.attributes.installed_es, - ...installedPkg.attributes.installed_kibana, - ], - status: 'already_installed', - }; + try { + // get the currently installed package + const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); + installType = getInstallType({ pkgVersion, installedPkg }); + + // get latest package version + const latestPackage = await Registry.fetchFindLatestPackage(pkgName); + + // let the user install if using the force flag or needing to reinstall or install a previous version due to failed update + const installOutOfDateVersionOk = + force || ['reinstall', 'reupdate', 'rollback'].includes(installType); + + // if the requested version is the same as installed version, check if we allow it based on + // current installed package status and force flag, if we don't allow it, + // just return the asset references from the existing installation + if ( + installedPkg?.attributes.version === pkgVersion && + installedPkg?.attributes.install_status === 'installed' + ) { + if (!force) { + logger.debug(`${pkgkey} is already installed, skipping installation`); + return { + assets: [ + ...installedPkg.attributes.installed_es, + ...installedPkg.attributes.installed_kibana, + ], + status: 'already_installed', + installType, + }; + } } - } - // if the requested version is out-of-date of the latest package version, check if we allow it - // if we don't allow it, return an error - if (semverLt(pkgVersion, latestPackage.version)) { - if (!installOutOfDateVersionOk) { - throw new PackageOutdatedError(`${pkgkey} is out-of-date and cannot be installed or updated`); + // if the requested version is out-of-date of the latest package version, check if we allow it + // if we don't allow it, return an error + if (semverLt(pkgVersion, latestPackage.version)) { + if (!installOutOfDateVersionOk) { + throw new PackageOutdatedError( + `${pkgkey} is out-of-date and cannot be installed or updated` + ); + } + logger.debug( + `${pkgkey} is out-of-date, installing anyway due to ${ + force ? 'force flag' : `install type ${installType}` + }` + ); } - logger.debug( - `${pkgkey} is out-of-date, installing anyway due to ${ - force ? 'force flag' : `install type ${installType}` - }` - ); - } - // get package info - const { paths, packageInfo } = await Registry.getRegistryPackage(pkgName, pkgVersion); + // get package info + const { paths, packageInfo } = await Registry.getRegistryPackage(pkgName, pkgVersion); - // try installing the package, if there was an error, call error handler and rethrow - try { + // try installing the package, if there was an error, call error handler and rethrow + // TODO: without the ts-ignore, TS complains about the type of the value of the returned InstallResult.status + // @ts-ignore return _installPackage({ savedObjectsClient, esClient, @@ -257,19 +265,26 @@ async function installPackageFromRegistry({ packageInfo, installType, installSource: 'registry', - }).then((assets) => { - return { assets, status: 'installed' }; - }); + }) + .then((assets) => { + return { assets, status: 'installed', installType }; + }) + .catch(async (err: Error) => { + await handleInstallPackageFailure({ + savedObjectsClient, + error: err, + pkgName, + pkgVersion, + installedPkg, + esClient, + }); + return { error: err, installType }; + }); } catch (e) { - await handleInstallPackageFailure({ - savedObjectsClient, + return { error: e, - pkgName, - pkgVersion, - installedPkg, - esClient, - }); - throw e; + installType, + }; } } @@ -286,46 +301,57 @@ async function installPackageByUpload({ archiveBuffer, contentType, }: InstallUploadedArchiveParams): Promise { - const { packageInfo } = await parseAndVerifyArchiveEntries(archiveBuffer, contentType); - - const installedPkg = await getInstallationObject({ - savedObjectsClient, - pkgName: packageInfo.name, - }); + // if an error happens during getInstallType, report that we don't know + let installType: InstallType = 'unknown'; + try { + const { packageInfo } = await parseAndVerifyArchiveEntries(archiveBuffer, contentType); - const installType = getInstallType({ pkgVersion: packageInfo.version, installedPkg }); - if (installType !== 'install') { - throw new PackageOperationNotSupportedError( - `Package upload only supports fresh installations. Package ${packageInfo.name} is already installed, please uninstall first.` - ); - } + const installedPkg = await getInstallationObject({ + savedObjectsClient, + pkgName: packageInfo.name, + }); - const installSource = 'upload'; - const paths = await unpackBufferToCache({ - name: packageInfo.name, - version: packageInfo.version, - installSource, - archiveBuffer, - contentType, - }); + installType = getInstallType({ pkgVersion: packageInfo.version, installedPkg }); + if (installType !== 'install') { + throw new PackageOperationNotSupportedError( + `Package upload only supports fresh installations. Package ${packageInfo.name} is already installed, please uninstall first.` + ); + } - setPackageInfo({ - name: packageInfo.name, - version: packageInfo.version, - packageInfo, - }); + const installSource = 'upload'; + const paths = await unpackBufferToCache({ + name: packageInfo.name, + version: packageInfo.version, + installSource, + archiveBuffer, + contentType, + }); - return _installPackage({ - savedObjectsClient, - esClient, - installedPkg, - paths, - packageInfo, - installType, - installSource, - }).then((assets) => { - return { assets, status: 'installed' }; - }); + setPackageInfo({ + name: packageInfo.name, + version: packageInfo.version, + packageInfo, + }); + // TODO: without the ts-ignore, TS complains about the type of the value of the returned InstallResult.status + // @ts-ignore + return _installPackage({ + savedObjectsClient, + esClient, + installedPkg, + paths, + packageInfo, + installType, + installSource, + }) + .then((assets) => { + return { assets, status: 'installed', installType }; + }) + .catch(async (err: Error) => { + return { error: err, installType }; + }); + } catch (e) { + return { error: e, installType }; + } } export type InstallPackageParams = { @@ -352,7 +378,7 @@ export async function installPackage(args: InstallPackageParams) { esClient, force, }).then(async (installResult) => { - if (skipPostInstall) { + if (skipPostInstall || installResult.error) { return installResult; } logger.debug(`install of ${pkgkey} finished, running post-install`); @@ -374,7 +400,7 @@ export async function installPackage(args: InstallPackageParams) { archiveBuffer, contentType, }).then(async (installResult) => { - if (skipPostInstall) { + if (skipPostInstall || installResult.error) { return installResult; } logger.debug(`install of uploaded package finished, running post-install`); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts index de798e822b029..706f1bbbaaf35 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts @@ -79,6 +79,7 @@ export async function removeInstallation(options: { return installedAssets; } +// TODO: this is very much like deleteKibanaSavedObjectsAssets below function deleteKibanaAssets( installedObjects: KibanaAssetReference[], savedObjectsClient: SavedObjectsClientContract @@ -136,6 +137,7 @@ async function deleteTemplate(esClient: ElasticsearchClient, name: string): Prom } } +// TODO: this is very much like deleteKibanaAssets above export async function deleteKibanaSavedObjectsAssets( savedObjectsClient: SavedObjectsClientContract, installedRefs: AssetReference[] @@ -153,6 +155,9 @@ export async function deleteKibanaSavedObjectsAssets( try { await Promise.all(deletePromises); } catch (err) { - logger.warn(err); + // in the rollback case, partial installs are likely, so missing assets are not an error + if (!savedObjectsClient.errors.isNotFoundError(err)) { + logger.error(err); + } } } diff --git a/x-pack/test/fleet_api_integration/apis/epm/index.js b/x-pack/test/fleet_api_integration/apis/epm/index.js index 009e1a2dad5f1..445d9706bb9a9 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/index.js +++ b/x-pack/test/fleet_api_integration/apis/epm/index.js @@ -24,5 +24,6 @@ export default function loadTests({ loadTestFile }) { loadTestFile(require.resolve('./update_assets')); loadTestFile(require.resolve('./data_stream')); loadTestFile(require.resolve('./package_install_complete')); + loadTestFile(require.resolve('./install_error_rollback')); }); } diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_error_rollback.ts b/x-pack/test/fleet_api_integration/apis/epm/install_error_rollback.ts new file mode 100644 index 0000000000000..6e2ea3b96aa58 --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/epm/install_error_rollback.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { skipIfNoDockerRegistry } from '../../helpers'; + +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + const goodPackage = 'error_handling-0.1.0'; + const badPackage = 'error_handling-0.2.0'; + + const installPackage = async (pkgkey: string) => { + await supertest + .post(`/api/fleet/epm/packages/${pkgkey}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }); + }; + + const getPackageInfo = async (pkgkey: string) => { + return await supertest.get(`/api/fleet/epm/packages/${pkgkey}`).set('kbn-xsrf', 'xxxx'); + }; + + describe('package installation error handling and rollback', async () => { + skipIfNoDockerRegistry(providerContext); + beforeEach(async () => { + await esArchiver.load('empty_kibana'); + }); + afterEach(async () => { + await esArchiver.unload('empty_kibana'); + }); + + it('on a fresh install, it should uninstall a broken package during rollback', async function () { + await supertest + .post(`/api/fleet/epm/packages/${badPackage}`) + .set('kbn-xsrf', 'xxxx') + .expect(422); // the broken package contains a broken visualization triggering a 422 from Kibana + + const pkgInfoResponse = await getPackageInfo(badPackage); + expect(JSON.parse(pkgInfoResponse.text).response.status).to.be('not_installed'); + }); + + it('on an upgrade, it should fall back to the previous good version during rollback', async function () { + await installPackage(goodPackage); + await supertest + .post(`/api/fleet/epm/packages/${badPackage}`) + .set('kbn-xsrf', 'xxxx') + .expect(422); // the broken package contains a broken visualization triggering a 422 from Kibana + + const goodPkgInfoResponse = await getPackageInfo(goodPackage); + expect(JSON.parse(goodPkgInfoResponse.text).response.status).to.be('installed'); + expect(JSON.parse(goodPkgInfoResponse.text).response.version).to.be('0.1.0'); + }); + }); +} diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/docs/README.md b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/docs/README.md new file mode 100644 index 0000000000000..260499f4b0078 --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/docs/README.md @@ -0,0 +1,3 @@ +This package should install without errors. + +Version 0.2.0 of this package should fail during installation. We need this good version to test rollback. \ No newline at end of file diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/kibana/visualization/sample_visualization.json b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/kibana/visualization/sample_visualization.json new file mode 100644 index 0000000000000..01afe600853ef --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/kibana/visualization/sample_visualization.json @@ -0,0 +1,14 @@ +{ + "attributes": { + "description": "sample visualization", + "title": "sample vis title", + "uiStateJSON": "{}", + "version": 1, + "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"extended_bounds\":{},\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1},\"schema\":\"segment\",\"type\":\"date_histogram\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"customLabel\":\"Log Level\",\"field\":\"log.level\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":5},\"schema\":\"group\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"@timestamp per day\"},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"mode\":\"stacked\",\"show\":\"true\",\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Log levels over time [Logs Kafka] ECS\",\"type\":\"histogram\"}" + }, + "id": "sample_visualization", + "type": "visualization", + "migrationVersion": { + "visualization": "7.7.0" + } +} diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/manifest.yml b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/manifest.yml new file mode 100644 index 0000000000000..bba1a6a4c347d --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.1.0/manifest.yml @@ -0,0 +1,20 @@ +format_version: 1.0.0 +name: error_handling +title: Error handling +description: tests error handling and rollback +version: 0.1.0 +categories: [] +release: beta +type: integration +license: basic + +requirement: + elasticsearch: + versions: '>7.7.0' + kibana: + versions: '>7.7.0' + +icons: + - src: '/img/logo_overrides_64_color.svg' + size: '16x16' + type: 'image/svg+xml' \ No newline at end of file diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/docs/README.md b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/docs/README.md new file mode 100644 index 0000000000000..c348f801b1780 --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/docs/README.md @@ -0,0 +1,5 @@ +This package should fail during installation. + +Version 0.1.0 of this package should install without errors, and be rolled back to without errors. + +This package contains one Kibana visualization that requires a non-existent version of Kibana in order to trigger an error during installation. \ No newline at end of file diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/kibana/visualization/sample_visualization.json b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/kibana/visualization/sample_visualization.json new file mode 100644 index 0000000000000..0a4867cfe1c11 --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/kibana/visualization/sample_visualization.json @@ -0,0 +1,14 @@ +{ + "attributes": { + "description": "sample visualization", + "title": "sample vis title", + "uiStateJSON": "{}", + "version": 1, + "visState": "{\"aggs\":[{\"enabled\":true,\"id\":\"1\",\"params\":{},\"schema\":\"metric\",\"type\":\"count\"},{\"enabled\":true,\"id\":\"2\",\"params\":{\"extended_bounds\":{},\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1},\"schema\":\"segment\",\"type\":\"date_histogram\"},{\"enabled\":true,\"id\":\"3\",\"params\":{\"customLabel\":\"Log Level\",\"field\":\"log.level\",\"order\":\"desc\",\"orderBy\":\"1\",\"size\":5},\"schema\":\"group\",\"type\":\"terms\"}],\"params\":{\"addLegend\":true,\"addTimeMarker\":false,\"addTooltip\":true,\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"labels\":{\"show\":true,\"truncate\":100},\"position\":\"bottom\",\"scale\":{\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"@timestamp per day\"},\"type\":\"category\"}],\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"legendPosition\":\"right\",\"seriesParams\":[{\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"drawLinesBetweenPoints\":true,\"mode\":\"stacked\",\"show\":\"true\",\"showCircles\":true,\"type\":\"histogram\",\"valueAxis\":\"ValueAxis-1\"}],\"times\":[],\"type\":\"histogram\",\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"labels\":{\"filter\":false,\"rotate\":0,\"show\":true,\"truncate\":100},\"name\":\"LeftAxis-1\",\"position\":\"left\",\"scale\":{\"mode\":\"normal\",\"type\":\"linear\"},\"show\":true,\"style\":{},\"title\":{\"text\":\"Count\"},\"type\":\"value\"}]},\"title\":\"Log levels over time [Logs Kafka] ECS\",\"type\":\"histogram\"}" + }, + "id": "sample_visualization", + "type": "visualization", + "migrationVersion": { + "visualization": "12.7.0" + } +} \ No newline at end of file diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/manifest.yml b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/manifest.yml new file mode 100644 index 0000000000000..2eb6a41a77ede --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/error_handling/0.2.0/manifest.yml @@ -0,0 +1,19 @@ +format_version: 1.0.0 +name: error_handling +title: Error handling +description: tests error handling and rollback +version: 0.2.0 +categories: [] +release: beta +type: integration +license: basic + +requirement: + elasticsearch: + versions: '>7.7.0' + kibana: + versions: '>7.7.0' + +icons: + - src: '/img/logo_overrides_64_color.svg' + size: '16x16' \ No newline at end of file From f8838e3b89abbcf155c9a2381ad631af69cc4864 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Sun, 18 Apr 2021 20:42:07 +0200 Subject: [PATCH 15/82] Remove legacy ES client usages in `home` and `xpack_legacy` (#97359) * Home plugin: remove usages of the legacy ES client * remove legacy es client usage in xpack_legacy --- .../services/sample_data/routes/install.ts | 20 +++++++++---------- .../services/sample_data/routes/list.ts | 20 +++++++++---------- .../services/sample_data/routes/uninstall.ts | 10 ++++------ .../services/sample_data/usage/collector.ts | 17 ++++++---------- .../server/routes/settings.test.ts | 14 ++----------- .../xpack_legacy/server/routes/settings.ts | 2 -- 6 files changed, 30 insertions(+), 53 deletions(-) diff --git a/src/plugins/home/server/services/sample_data/routes/install.ts b/src/plugins/home/server/services/sample_data/routes/install.ts index a20c3e350222f..e5ff33d5c199d 100644 --- a/src/plugins/home/server/services/sample_data/routes/install.ts +++ b/src/plugins/home/server/services/sample_data/routes/install.ts @@ -7,7 +7,7 @@ */ import { schema } from '@kbn/config-schema'; -import { IRouter, Logger, RequestHandlerContext } from 'src/core/server'; +import { IRouter, Logger, IScopedClusterClient } from 'src/core/server'; import { SampleDatasetSchema } from '../lib/sample_dataset_registry_types'; import { createIndexName } from '../lib/create_index_name'; import { @@ -22,7 +22,7 @@ const insertDataIntoIndex = ( dataIndexConfig: any, index: string, nowReference: string, - context: RequestHandlerContext, + esClient: IScopedClusterClient, logger: Logger ) => { function updateTimestamps(doc: any) { @@ -51,9 +51,11 @@ const insertDataIntoIndex = ( bulk.push(insertCmd); bulk.push(updateTimestamps(doc)); }); - const resp = await context.core.elasticsearch.legacy.client.callAsCurrentUser('bulk', { + + const { body: resp } = await esClient.asCurrentUser.bulk({ body: bulk, }); + if (resp.errors) { const errMsg = `sample_data install errors while bulk inserting. Elasticsearch response: ${JSON.stringify( resp, @@ -100,7 +102,7 @@ export function createInstallRoute( // clean up any old installation of dataset try { - await context.core.elasticsearch.legacy.client.callAsCurrentUser('indices.delete', { + await context.core.elasticsearch.client.asCurrentUser.indices.delete({ index, }); } catch (err) { @@ -108,17 +110,13 @@ export function createInstallRoute( } try { - const createIndexParams = { + await context.core.elasticsearch.client.asCurrentUser.indices.create({ index, body: { settings: { index: { number_of_shards: 1, auto_expand_replicas: '0-1' } }, mappings: { properties: dataIndexConfig.fields }, }, - }; - await context.core.elasticsearch.legacy.client.callAsCurrentUser( - 'indices.create', - createIndexParams - ); + }); } catch (err) { const errMsg = `Unable to create sample data index "${index}", error: ${err.message}`; logger.warn(errMsg); @@ -130,7 +128,7 @@ export function createInstallRoute( dataIndexConfig, index, nowReference, - context, + context.core.elasticsearch.client, logger ); (counts as any)[index] = count; diff --git a/src/plugins/home/server/services/sample_data/routes/list.ts b/src/plugins/home/server/services/sample_data/routes/list.ts index 86e286644f936..72d8c31cbafd7 100644 --- a/src/plugins/home/server/services/sample_data/routes/list.ts +++ b/src/plugins/home/server/services/sample_data/routes/list.ts @@ -36,22 +36,20 @@ export const createListRoute = (router: IRouter, sampleDatasets: SampleDatasetSc const dataIndexConfig = sampleDataset.dataIndices[i]; const index = createIndexName(sampleDataset.id, dataIndexConfig.id); try { - const indexExists = await context.core.elasticsearch.legacy.client.callAsCurrentUser( - 'indices.exists', - { index } - ); + const { + body: indexExists, + } = await context.core.elasticsearch.client.asCurrentUser.indices.exists({ + index, + }); if (!indexExists) { sampleDataset.status = NOT_INSTALLED; return; } - const { count } = await context.core.elasticsearch.legacy.client.callAsCurrentUser( - 'count', - { - index, - } - ); - if (count === 0) { + const { body: count } = await context.core.elasticsearch.client.asCurrentUser.count({ + index, + }); + if (count.count === 0) { sampleDataset.status = NOT_INSTALLED; return; } diff --git a/src/plugins/home/server/services/sample_data/routes/uninstall.ts b/src/plugins/home/server/services/sample_data/routes/uninstall.ts index aa8ed67cf840a..3108c06492dd8 100644 --- a/src/plugins/home/server/services/sample_data/routes/uninstall.ts +++ b/src/plugins/home/server/services/sample_data/routes/uninstall.ts @@ -28,11 +28,7 @@ export function createUninstallRoute( async ( { core: { - elasticsearch: { - legacy: { - client: { callAsCurrentUser }, - }, - }, + elasticsearch: { client: esClient }, savedObjects: { getClient: getSavedObjectsClient, typeRegistry }, }, }, @@ -50,7 +46,9 @@ export function createUninstallRoute( const index = createIndexName(sampleDataset.id, dataIndexConfig.id); try { - await callAsCurrentUser('indices.delete', { index }); + await esClient.asCurrentUser.indices.delete({ + index, + }); } catch (err) { return response.customError({ statusCode: err.status, diff --git a/src/plugins/home/server/services/sample_data/usage/collector.ts b/src/plugins/home/server/services/sample_data/usage/collector.ts index 81958a2e3c878..df7d485c1f6fa 100644 --- a/src/plugins/home/server/services/sample_data/usage/collector.ts +++ b/src/plugins/home/server/services/sample_data/usage/collector.ts @@ -6,22 +6,17 @@ * Side Public License, v 1. */ -import { PluginInitializerContext } from 'kibana/server'; -import { first } from 'rxjs/operators'; +import type { PluginInitializerContext } from 'kibana/server'; +import type { UsageCollectionSetup } from '../../../../../usage_collection/server'; import { fetchProvider, TelemetryResponse } from './collector_fetch'; -import { UsageCollectionSetup } from '../../../../../usage_collection/server'; -export async function makeSampleDataUsageCollector( +export function makeSampleDataUsageCollector( usageCollection: UsageCollectionSetup, context: PluginInitializerContext ) { - let index: string; - try { - const config = await context.config.legacy.globalConfig$.pipe(first()).toPromise(); - index = config.kibana.index; - } catch (err) { - return; // kibana plugin is not enabled (test environment) - } + const config = context.config.legacy.get(); + const index = config.kibana.index; + const collector = usageCollection.makeUsageCollector({ type: 'sample-data', fetch: fetchProvider(index), diff --git a/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts b/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts index 08b5a0f60521c..2034a4e5b74ba 100644 --- a/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts +++ b/x-pack/plugins/xpack_legacy/server/routes/settings.test.ts @@ -9,11 +9,7 @@ import { BehaviorSubject } from 'rxjs'; import { UnwrapPromise } from '@kbn/utility-types'; import supertest from 'supertest'; -import { - LegacyAPICaller, - ServiceStatus, - ServiceStatusLevels, -} from '../../../../../src/core/server'; +import { ServiceStatus, ServiceStatusLevels } from '../../../../../src/core/server'; import { contextServiceMock, elasticsearchServiceMock, @@ -31,24 +27,18 @@ export function mockGetClusterInfo(clusterInfo: any) { esClient.info.mockResolvedValue({ body: { ...clusterInfo } }); return esClient; } + describe('/api/settings', () => { let server: HttpService; let httpSetup: HttpSetup; let overallStatus$: BehaviorSubject; - let mockApiCaller: jest.Mocked; beforeEach(async () => { - mockApiCaller = jest.fn(); server = createHttpServer(); httpSetup = await server.setup({ context: contextServiceMock.createSetupContract({ core: { elasticsearch: { - legacy: { - client: { - callAsCurrentUser: mockApiCaller, - }, - }, client: { asCurrentUser: mockGetClusterInfo({ cluster_uuid: 'yyy-yyyyy' }), }, diff --git a/x-pack/plugins/xpack_legacy/server/routes/settings.ts b/x-pack/plugins/xpack_legacy/server/routes/settings.ts index 9117637b70bee..b9052ca0c84e3 100644 --- a/x-pack/plugins/xpack_legacy/server/routes/settings.ts +++ b/x-pack/plugins/xpack_legacy/server/routes/settings.ts @@ -42,9 +42,7 @@ export function registerSettingsRoute({ validate: false, }, async (context, req, res) => { - const { callAsCurrentUser } = context.core.elasticsearch.legacy.client; const collectorFetchContext = { - callCluster: callAsCurrentUser, esClient: context.core.elasticsearch.client.asCurrentUser, soClient: context.core.savedObjects.client, }; From cb2cf67609f54a6e43a08b24f11694217255cdc3 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Sun, 18 Apr 2021 20:49:35 +0200 Subject: [PATCH 16/82] Add description as title on tag badge (#97109) --- .../public/components/base/tag_badge.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx index 6bc9e659d9346..e8af661d6921d 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx @@ -17,5 +17,9 @@ export interface TagBadgeProps { * The badge representation of a Tag, which is the default display to be used for them. */ export const TagBadge: FC = ({ tag }) => { - return {tag.name}; + return ( + + {tag.name} + + ); }; From 787b4934032b6989195aedf3aac4c871bf7ca11f Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Sun, 18 Apr 2021 23:07:36 +0200 Subject: [PATCH 17/82] Avoid mutating KQL query when validating it (#97081) --- .../service/lib/filter_utils.test.ts | 17 +++++++++++++++++ .../saved_objects/service/lib/filter_utils.ts | 5 +++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/core/server/saved_objects/service/lib/filter_utils.test.ts b/src/core/server/saved_objects/service/lib/filter_utils.test.ts index 956a60b23809d..2ef5219ccfff1 100644 --- a/src/core/server/saved_objects/service/lib/filter_utils.test.ts +++ b/src/core/server/saved_objects/service/lib/filter_utils.test.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { cloneDeep } from 'lodash'; // @ts-expect-error no ts import { esKuery } from '../../es_query'; @@ -105,6 +106,22 @@ describe('Filter Utils', () => { ) ).toEqual(esKuery.fromKueryExpression('foo.title: "best"')); }); + + test('does not mutate the input KueryNode', () => { + const input = esKuery.nodeTypes.function.buildNode( + 'is', + `foo.attributes.title`, + 'best', + true + ); + + const inputCopy = cloneDeep(input); + + validateConvertFilterToKueryNode(['foo'], input, mockMappings); + + expect(input).toEqual(inputCopy); + }); + test('Validate a simple KQL expression filter', () => { expect( validateConvertFilterToKueryNode(['foo'], 'foo.attributes.title: "best"', mockMappings) diff --git a/src/core/server/saved_objects/service/lib/filter_utils.ts b/src/core/server/saved_objects/service/lib/filter_utils.ts index b3bcef9a62e13..a41a25a27b70d 100644 --- a/src/core/server/saved_objects/service/lib/filter_utils.ts +++ b/src/core/server/saved_objects/service/lib/filter_utils.ts @@ -7,11 +7,12 @@ */ import { set } from '@elastic/safer-lodash-set'; -import { get } from 'lodash'; +import { get, cloneDeep } from 'lodash'; import { SavedObjectsErrorHelpers } from './errors'; import { IndexMapping } from '../../mappings'; // @ts-expect-error no ts import { esKuery } from '../../es_query'; + type KueryNode = any; const astFunctionType = ['is', 'range', 'nested']; @@ -23,7 +24,7 @@ export const validateConvertFilterToKueryNode = ( ): KueryNode | undefined => { if (filter && indexMapping) { const filterKueryNode = - typeof filter === 'string' ? esKuery.fromKueryExpression(filter) : filter; + typeof filter === 'string' ? esKuery.fromKueryExpression(filter) : cloneDeep(filter); const validationFilterKuery = validateFilterKueryNode({ astFilter: filterKueryNode, From 681bd642fb54396b2ee27c982b8dc128e98bfb02 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Sun, 18 Apr 2021 20:28:13 -0700 Subject: [PATCH 18/82] Fix typo in license_api_guard README name and import http server mocks from public interface (#97334) * Reject basic minimum licenses. --- docs/developer/plugin-list.asciidoc | 4 +- x-pack/plugins/license_api_guard/READM.md | 3 - x-pack/plugins/license_api_guard/README.md | 3 + .../license_api_guard/server/license.test.ts | 135 +++++++++++------- .../license_api_guard/server/license.ts | 6 + 5 files changed, 96 insertions(+), 55 deletions(-) delete mode 100644 x-pack/plugins/license_api_guard/READM.md create mode 100644 x-pack/plugins/license_api_guard/README.md diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index de7253e34d103..c7fffb09248e9 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -444,8 +444,8 @@ the infrastructure monitoring use-case within Kibana. |Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. -|{kib-repo}blob/{branch}/x-pack/plugins/license_api_guard[licenseApiGuard] -|WARNING: Missing README. +|{kib-repo}blob/{branch}/x-pack/plugins/license_api_guard/README.md[licenseApiGuard] +|This plugin is used by ES UI plugins to reject API requests when the plugin is unsupported by the user's license. |{kib-repo}blob/{branch}/x-pack/plugins/license_management/README.md[licenseManagement] diff --git a/x-pack/plugins/license_api_guard/READM.md b/x-pack/plugins/license_api_guard/READM.md deleted file mode 100644 index 767223125b12c..0000000000000 --- a/x-pack/plugins/license_api_guard/READM.md +++ /dev/null @@ -1,3 +0,0 @@ -# License API guard plugin - -This plugin is used by ES UI plugins to reject API requests to plugins that are unsupported by the user's license. \ No newline at end of file diff --git a/x-pack/plugins/license_api_guard/README.md b/x-pack/plugins/license_api_guard/README.md new file mode 100644 index 0000000000000..bf2a9fdff7122 --- /dev/null +++ b/x-pack/plugins/license_api_guard/README.md @@ -0,0 +1,3 @@ +# License API guard plugin + +This plugin is used by ES UI plugins to reject API requests when the plugin is unsupported by the user's license. \ No newline at end of file diff --git a/x-pack/plugins/license_api_guard/server/license.test.ts b/x-pack/plugins/license_api_guard/server/license.test.ts index e9da393f53478..400af7261ff87 100644 --- a/x-pack/plugins/license_api_guard/server/license.test.ts +++ b/x-pack/plugins/license_api_guard/server/license.test.ts @@ -6,18 +6,38 @@ */ import { of } from 'rxjs'; -import type { KibanaRequest, RequestHandlerContext } from 'src/core/server'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { httpServerMock } from 'src/core/server/http/http_server.mocks'; - +import type { Logger, KibanaRequest, RequestHandlerContext } from 'src/core/server'; +import { httpServerMock } from 'src/core/server/mocks'; import { License } from './license'; -import { LicenseCheckState, licensingMock } from './shared_imports'; +import { LicenseCheckState, licensingMock, LicenseType } from './shared_imports'; describe('License API guard', () => { const pluginName = 'testPlugin'; - const currentLicenseType = 'basic'; - const testRoute = ({ licenseState }: { licenseState: string }) => { + const mockLicensingService = ({ + licenseType, + licenseState, + }: { + licenseType: LicenseType; + licenseState: LicenseCheckState; + }) => { + const licenseMock = licensingMock.createLicenseMock(); + licenseMock.type = licenseType; + licenseMock.check('test', 'gold'); // Flush default mocked state + licenseMock.check.mockReturnValue({ state: licenseState }); // Replace with new mocked state + + return { + license$: of(licenseMock), + }; + }; + + const testRoute = ({ + licenseType, + licenseState, + }: { + licenseType: LicenseType; + licenseState: LicenseCheckState; + }) => { const license = new License(); const logger = { @@ -25,19 +45,11 @@ describe('License API guard', () => { }; license.setup({ pluginName, logger }); - - const licenseMock = licensingMock.createLicenseMock(); - licenseMock.type = currentLicenseType; - licenseMock.check('test', 'basic'); // Flush default mocked state - licenseMock.check.mockReturnValue({ state: licenseState as LicenseCheckState }); // Replace with new mocked state - - const licensing = { - license$: of(licenseMock), - }; + const licensing = mockLicensingService({ licenseType, licenseState }); license.start({ pluginId: 'id', - minimumLicenseType: 'basic', + minimumLicenseType: 'gold', licensing, }); @@ -61,44 +73,67 @@ describe('License API guard', () => { }; }; - describe('valid license', () => { - it('the original route is called and nothing is logged', () => { - const { errorResponse, logMesssage, route } = testRoute({ licenseState: 'valid' }); - - expect(errorResponse).toBeUndefined(); - expect(logMesssage).toBeUndefined(); - expect(route).toHaveBeenCalled(); + describe('basic minimum license', () => { + it('is rejected', () => { + const license = new License(); + license.setup({ pluginName, logger: {} as Logger }); + expect(() => { + license.start({ + pluginId: pluginName, + minimumLicenseType: 'basic', + licensing: mockLicensingService({ licenseType: 'gold', licenseState: 'valid' }), + }); + }).toThrowError( + `Basic licenses don't restrict the use of plugins. Please don't use license_api_guard in the ${pluginName} plugin, or provide a more restrictive minimumLicenseType.` + ); }); }); - [ - { - licenseState: 'invalid', - expectedMessage: `Your ${currentLicenseType} license does not support ${pluginName}. Please upgrade your license.`, - }, - { - licenseState: 'expired', - expectedMessage: `You cannot use ${pluginName} because your ${currentLicenseType} license has expired.`, - }, - { - licenseState: 'unavailable', - expectedMessage: `You cannot use ${pluginName} because license information is not available at this time.`, - }, - ].forEach(({ licenseState, expectedMessage }) => { - describe(`${licenseState} license`, () => { - it('replies with and logs the error message', () => { - const { errorResponse, logMesssage, route } = testRoute({ licenseState }); - - // We depend on the call to `response.forbidden()` to generate the 403 status code, - // so we can't assert for it here. - expect(errorResponse).toEqual({ - body: { - message: expectedMessage, - }, + describe('non-basic minimum license', () => { + const licenseType = 'gold'; + + describe('when valid', () => { + it('the original route is called and nothing is logged', () => { + const { errorResponse, logMesssage, route } = testRoute({ + licenseType, + licenseState: 'valid', }); - expect(logMesssage).toBe(expectedMessage); - expect(route).not.toHaveBeenCalled(); + expect(errorResponse).toBeUndefined(); + expect(logMesssage).toBeUndefined(); + expect(route).toHaveBeenCalled(); + }); + }); + + [ + { + licenseState: 'invalid' as LicenseCheckState, + expectedMessage: `Your ${licenseType} license does not support ${pluginName}. Please upgrade your license.`, + }, + { + licenseState: 'expired' as LicenseCheckState, + expectedMessage: `You cannot use ${pluginName} because your ${licenseType} license has expired.`, + }, + { + licenseState: 'unavailable' as LicenseCheckState, + expectedMessage: `You cannot use ${pluginName} because license information is not available at this time.`, + }, + ].forEach(({ licenseState, expectedMessage }) => { + describe(`when ${licenseState}`, () => { + it('replies with and logs the error message', () => { + const { errorResponse, logMesssage, route } = testRoute({ licenseType, licenseState }); + + // We depend on the call to `response.forbidden()` to generate the 403 status code, + // so we can't assert for it here. + expect(errorResponse).toEqual({ + body: { + message: expectedMessage, + }, + }); + + expect(logMesssage).toBe(expectedMessage); + expect(route).not.toHaveBeenCalled(); + }); }); }); }); diff --git a/x-pack/plugins/license_api_guard/server/license.ts b/x-pack/plugins/license_api_guard/server/license.ts index 3b0fbc8422d63..66e47f02b6e28 100644 --- a/x-pack/plugins/license_api_guard/server/license.ts +++ b/x-pack/plugins/license_api_guard/server/license.ts @@ -44,6 +44,12 @@ export class License { } start({ pluginId, minimumLicenseType, licensing }: StartSettings) { + if (minimumLicenseType === 'basic') { + throw Error( + `Basic licenses don't restrict the use of plugins. Please don't use license_api_guard in the ${pluginId} plugin, or provide a more restrictive minimumLicenseType.` + ); + } + licensing.license$.subscribe((license: ILicense) => { this.licenseType = license.type; this.licenseCheckState = license.check(pluginId, minimumLicenseType!).state; From 1bc7e5462f821feff24f0470d5921d456670f646 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 19 Apr 2021 09:28:44 +0200 Subject: [PATCH 19/82] [Exploratory view] integerate page views to exploratory view (#97258) --- .../app/RumDashboard/PageViewsTrend/index.tsx | 48 +++++++++++++++++-- .../components/empty_view.tsx | 25 ++++++++-- .../exploratory_view/exploratory_view.tsx | 4 +- .../series_builder/series_builder.tsx | 9 ++-- 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx index 85df933bcb9e2..52668cf712b8c 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx @@ -6,25 +6,37 @@ */ import React, { useState } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { useUrlParams } from '../../../../context/url_params_context/use_url_params'; import { useFetcher } from '../../../../hooks/use_fetcher'; import { I18LABELS } from '../translations'; import { BreakdownFilter } from '../Breakdowns/BreakdownFilter'; import { PageViewsChart } from '../Charts/PageViewsChart'; import { BreakdownItem } from '../../../../../typings/ui_filters'; +import { createExploratoryViewUrl } from '../../../../../../observability/public'; +import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; export function PageViewsTrend() { + const { + services: { http }, + } = useKibana(); + const { urlParams, uiFilters } = useUrlParams(); + const { serviceName } = uiFilters; - const { start, end, searchTerm } = urlParams; + const { start, end, searchTerm, rangeTo, rangeFrom } = urlParams; const [breakdown, setBreakdown] = useState(null); const { data, status } = useFetcher( (callApmApi) => { - const { serviceName } = uiFilters; - if (start && end && serviceName) { return callApmApi({ endpoint: 'GET /api/apm/rum-client/page-view-trends', @@ -45,7 +57,21 @@ export function PageViewsTrend() { } return Promise.resolve(undefined); }, - [end, start, uiFilters, breakdown, searchTerm] + [start, end, serviceName, uiFilters, searchTerm, breakdown] + ); + + const exploratoryViewLink = createExploratoryViewUrl( + { + [`${serviceName}-page-views`]: { + reportType: 'kpi', + time: { from: rangeFrom!, to: rangeTo! }, + reportDefinitions: { + 'service.name': serviceName?.[0] as string, + }, + ...(breakdown ? { breakdown: breakdown.fieldName } : {}), + }, + }, + http?.basePath.get() ); return ( @@ -63,6 +89,18 @@ export function PageViewsTrend() { dataTestSubj={'pvBreakdownFilter'} />
+ + + + + diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/components/empty_view.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/components/empty_view.tsx index 17f1b039667d0..69b8b6eb89e46 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/components/empty_view.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/components/empty_view.tsx @@ -6,27 +6,44 @@ */ import React from 'react'; -import { EuiImage } from '@elastic/eui'; +import { EuiImage, EuiProgress, EuiSpacer, EuiText } from '@elastic/eui'; import styled from 'styled-components'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; +import { INITIATING_VIEW } from '../series_builder/series_builder'; -export function EmptyView() { +export function EmptyView({ loading }: { loading: boolean }) { const { services: { http }, } = useKibana(); return ( - + )} + + + {INITIATING_VIEW} ); } +const ImageWrap = styled(EuiImage)` + opacity: 0.4; +`; + const Wrapper = styled.div` text-align: center; - opacity: 0.4; height: 550px; + position: relative; `; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/exploratory_view.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/exploratory_view.tsx index 7b5dde852cf90..6bc91be876cf7 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/exploratory_view.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/exploratory_view.tsx @@ -27,7 +27,7 @@ export function ExploratoryView() { null ); - const { loadIndexPattern } = useAppIndexPatternContext(); + const { loadIndexPattern, loading } = useAppIndexPatternContext(); const LensComponent = lens?.EmbeddableComponent; @@ -61,7 +61,7 @@ export function ExploratoryView() { attributes={lensAttributes} /> ) : ( - + )} diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx index 5831b8be04c38..db6e075cc90fb 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx @@ -228,9 +228,12 @@ export function SeriesBuilder() { ); } -const INITIATING_VIEW = i18n.translate('xpack.observability.expView.seriesBuilder.initView', { - defaultMessage: 'Initiating view ...', -}); +export const INITIATING_VIEW = i18n.translate( + 'xpack.observability.expView.seriesBuilder.initView', + { + defaultMessage: 'Initiating view ...', + } +); const SELECT_REPORT_TYPE = i18n.translate( 'xpack.observability.expView.seriesBuilder.selectReportType', From 4c45ae0645fa1f0f00a38b5334f97e37dfed65e3 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Mon, 19 Apr 2021 12:21:50 +0300 Subject: [PATCH 20/82] [Search] enable fun-ctional tests (#97398) * only fun-ctional * fix functional tests * tests * Type --- .../search_examples/public/search/app.tsx | 28 +++++++++++--- .../search_examples/search_example.ts | 37 ++++++++++++++----- .../search_examples/search_sessions_cache.ts | 6 ++- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/examples/search_examples/public/search/app.tsx b/examples/search_examples/public/search/app.tsx index b2a4991d0717b..65d939088515a 100644 --- a/examples/search_examples/public/search/app.tsx +++ b/examples/search_examples/public/search/app.tsx @@ -195,7 +195,7 @@ export const SearchExamplesApp = ({ }); }; - const doSearchSourceSearch = async () => { + const doSearchSourceSearch = async (otherBucket: boolean) => { if (!indexPattern) return; const query = data.query.queryString.getQuery(); @@ -221,7 +221,7 @@ export const SearchExamplesApp = ({ aggDef.push({ type: 'terms', schema: 'split', - params: { field: selectedBucketField.name, size: 2, otherBucket: true }, + params: { field: selectedBucketField.name, size: 2, otherBucket }, }); } if (selectedNumericField) { @@ -280,8 +280,8 @@ export const SearchExamplesApp = ({ } }; - const onSearchSourceClickHandler = () => { - doSearchSourceSearch(); + const onSearchSourceClickHandler = (withOtherBucket: boolean) => { + doSearchSourceSearch(withOtherBucket); }; const reqTabs = [ @@ -367,6 +367,7 @@ export const SearchExamplesApp = ({ setIndexPattern(newIndexPattern); }} isClearable={false} + data-test-subj="indexPatternSelector" /> @@ -449,7 +450,7 @@ export const SearchExamplesApp = ({ onSearchSourceClickHandler(true)} iconType="play" data-test-subj="searchSourceWithOther" > @@ -464,6 +465,23 @@ export const SearchExamplesApp = ({ defaultMessage="Bucket and metrics aggregations with other bucket." /> + onSearchSourceClickHandler(false)} + iconType="play" + data-test-subj="searchSourceWithoutOther" + > + + + + + diff --git a/x-pack/test/examples/search_examples/search_example.ts b/x-pack/test/examples/search_examples/search_example.ts index 19a9535ebb951..c841b595ed119 100644 --- a/x-pack/test/examples/search_examples/search_example.ts +++ b/x-pack/test/examples/search_examples/search_example.ts @@ -12,26 +12,45 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects(['common', 'timePicker']); const retry = getService('retry'); + const comboBox = getService('comboBox'); - describe.skip('Search session example', () => { + describe('Search session example', () => { const appId = 'searchExamples'; before(async function () { await PageObjects.common.navigateToApp(appId, { insertTimestamp: false }); + await comboBox.set('indexPatternSelector', 'logstash-*'); + await comboBox.set('searchBucketField', 'geo.src'); + await comboBox.set('searchMetricField', 'memory'); + await PageObjects.timePicker.setAbsoluteRange( + 'Mar 1, 2015 @ 00:00:00.000', + 'Nov 1, 2015 @ 00:00:00.000' + ); }); it('should have an other bucket', async () => { - await PageObjects.timePicker.setAbsoluteRange( - 'Jan 1, 2014 @ 00:00:00.000', - 'Jan 1, 2016 @ 00:00:00.000' - ); await testSubjects.click('searchSourceWithOther'); + await testSubjects.click('responseTab'); + const codeBlock = await testSubjects.find('responseCodeBlock'); + await retry.waitFor('get code block', async () => { + const visibleText = await codeBlock.getVisibleText(); + const parsedResponse = JSON.parse(visibleText); + const buckets = parsedResponse.aggregations[1].buckets; + return ( + buckets.length === 3 && buckets[2].key === '__other__' && buckets[2].doc_count === 9039 + ); + }); + }); - await retry.waitFor('has other bucket', async () => { - await testSubjects.click('responseTab'); - const codeBlock = await testSubjects.find('responseCodeBlock'); + it('should not have an other bucket', async () => { + await testSubjects.click('searchSourceWithoutOther'); + await testSubjects.click('responseTab'); + const codeBlock = await testSubjects.find('responseCodeBlock'); + await retry.waitFor('get code block', async () => { const visibleText = await codeBlock.getVisibleText(); - return visibleText.indexOf('__other__') > -1; + const parsedResponse = JSON.parse(visibleText); + const buckets = parsedResponse.aggregations[1].buckets; + return buckets.length === 2; }); }); }); diff --git a/x-pack/test/examples/search_examples/search_sessions_cache.ts b/x-pack/test/examples/search_examples/search_sessions_cache.ts index 57b2d1665d901..7e52849ed2a7e 100644 --- a/x-pack/test/examples/search_examples/search_sessions_cache.ts +++ b/x-pack/test/examples/search_examples/search_sessions_cache.ts @@ -14,6 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common']); const toasts = getService('toasts'); const retry = getService('retry'); + const comboBox = getService('comboBox'); async function getExecutedAt() { const toast = await toasts.getToastElement(1); @@ -26,11 +27,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return text; } - describe.skip('Search session client side cache', () => { + describe('Search session client side cache', () => { const appId = 'searchExamples'; before(async function () { await PageObjects.common.navigateToApp(appId, { insertTimestamp: false }); + await comboBox.set('indexPatternSelector', 'logstash-*'); + await comboBox.set('searchBucketField', 'extension.raw'); + await comboBox.set('searchMetricField', 'phpmemory'); }); it('should cache responses by search session id', async () => { From 249f9aca15c619931b2e96bb0f9f40124539a446 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Mon, 19 Apr 2021 11:57:01 +0200 Subject: [PATCH 21/82] RFC: URL Service (TTL: expired) (#95416) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: ✏️ start URL Service RFC * docs: ✏️ improe short URL example * docs: ✏️ add summary, basic examples and motivation sections * docs: ✏️ fill end sections of rfc * feat: 🎸 start "Detailed design" section * docs: ✏️ add HTTP endpoints section * docs: ✏️ use table layout * docs: ✏️ cleanup various text parts * feat: 🎸 add redirect route GET endpoints * docs: ✏️ add alternatives * docs: ✏️ update examples * docs: ✏️ update client interfaces * docs: ✏️ update HTTP endpoints * docs: ✏️ update url generator references * docs: ✏️ add note about short URL migration * docs: ✏️ add Peter's clarifications * docs: ✏️ fix typos * docs: ✏️ remove short url create() method * docs: ✏️ update redirect endpoints * docs: ✏️ add note about locator usage * docs: ✏️ make paramsVersion required * docs: ✏️ add goals section * docs: ✏️ add suggested bullet points --- rfcs/images/url_service/new_architecture.png | Bin 0 -> 198480 bytes rfcs/images/url_service/old_architecture.png | Bin 0 -> 166166 bytes rfcs/text/0017_url_service.md | 600 +++++++++++++++++++ 3 files changed, 600 insertions(+) create mode 100644 rfcs/images/url_service/new_architecture.png create mode 100644 rfcs/images/url_service/old_architecture.png create mode 100644 rfcs/text/0017_url_service.md diff --git a/rfcs/images/url_service/new_architecture.png b/rfcs/images/url_service/new_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..9faa025d429bf8465d14de64b31a4a05ceb4a2d5 GIT binary patch literal 198480 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%0AG0;{S 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
$%Qg~=}!uz48JkE+dC&$hV`XJmdWtp7(DgE8& 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 Qf&b1bs+~^#&E(Gi1Etq+yZ`_I literal 0 HcmV?d00001 diff --git a/rfcs/images/url_service/old_architecture.png b/rfcs/images/url_service/old_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb1c13fabf34959e00f744a69ebcf9b1f07b7ea GIT binary patch literal 166166 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 literal 0 HcmV?d00001 diff --git a/rfcs/text/0017_url_service.md b/rfcs/text/0017_url_service.md new file mode 100644 index 0000000000000..87a8a92c090d6 --- /dev/null +++ b/rfcs/text/0017_url_service.md @@ -0,0 +1,600 @@ +- Start Date: 2021-03-26 +- RFC PR: (leave this empty) +- Kibana Issue: (leave this empty) + + +# Summary + +Currently in the Kibana `share` plugin we have two services that deal with URLs. + +One is *Short URL Service*: given a long internal Kibana URL it returns an ID. +That ID can be used to "resolve" back to the long URL and redirect the user to +that long URL page. (The Short URL Service is now used in Dashboard, Discover, +Visualize apps, and have a few upcoming users, for example, when sharing panels +by Slack or e-mail we will want to use short URLs.) + +```ts +// It does not have a plugin API, you can only use it through an HTTP request. +const shortUrl = await http.post('/api/shorten_url', { + url: '/some/long/kibana/url/.../very?long=true#q=(rison:approved)' +}); +``` + +The other is the *URL Generator Service*: it simply receives an object of +parameters and returns back a deep link within Kibana. (You can use it, for +example, to navigate to some specific query with specific filters for a +specific index pattern in the Discover app. As of this writing, there are +eight registered URL generators, which are used by ten plugins.) + +```ts +// You first register a URL generator. +const myGenerator = plugins.share.registerUrlGenerator(/* ... */); + +// You can fetch it from the registry (if you don't already have it). +const myGenerator = plugins.share.getUrlGenerator(/* ... */); + +// Now you can use it to generate a deep link into Kibana. +const deepLink: string = myGenerator.createUrl({ /* ... */ }); +``` + + +## Goals of the project + +The proposal is to unify both of these services (Short URL Service and URL +Generator Service) into a single new *URL Service*. The new unified service +will still provide all the functionality the above mentioned services provide +and in addition will implement the following improvements: + +1. Standardize a way for apps to deep link and navigate into other Kibana apps, + with ability to use *location state* to specify the state of the app which is + not part of the URL. +2. Combine Short URL Service with URL Generator Service to allow short URLs to + be constructed from URL generators, which will also allow us to automatically + migrate the short URLs if the parameters of the underlying URL generator + change and be able to store location state in every short URL. +3. Make the short url service easier to use. (It was previously undocumented, + and no server side plugin APIs existed, which meant consumers had to use + REST APIs which is discouraged. Merging the two services will help achieve + this goal by simplifying the APIs.) +4. Support short urls being deleted (previously not possible). +5. Support short urls being migrated (previously not possible). + +See more detailed explanation and other small improvements in the "Motivation" +section below. + + +# Terminology + +In the proposed new service we introduce "locators". This is mostly a change +in language, we are renaming "URL generators" to "locators". The old name would +no longer make sense as we are not returning URLs from locators. + + +# Basic example + +The URL Service will have a client (`UrlServiceClient`) which will have the same +interface, both, on the server-side and the client-side. It will also have a +documented public set of HTTP API endpoints for use by: (1) the client-side +client; (2) external users, Elastic Cloud, and Support. + +The following code examples will work, both, on the server-side and the +client-side, as the base `UrlServiceClient` interface will be similar in both +environments. + +Below we consider four main examples of usage of the URL Service. All four +examples are existing use cases we currently have in Kibana. + + +## Navigating within Kibana using locators + +In this example let's consider a case where Discover app creates a locator, +then another plugin uses that locator to navigate to a deep link within the +Discover app. + +First, the Discover plugin creates its locator (usually one per app). It needs +to do this on the client and server. + + +```ts +const locator = plugins.share.locators.create({ + id: 'DISCOVER_DEEP_LINKS', + getLocation: ({ + indexPattern, + highlightedField, + filters: [], + query: {}, + fields: [], + activeDoc: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx', + }) => { + app: 'discover', + route: `/${indexPatten}#_a=(${risonEncode({filters, query, fields})})`, + state: { + highlightedField, + activeDoc, + }, + }, +}); +``` + +Now, the Discover plugin exports this locator from its plugin contract. + +```ts +class DiscoverPlugin() { + start() { + return { + locator, + }; + } +} +``` + +Finally, if any other app now wants to navigate to a deep link within the +Discover application, they use this exported locator. + +```ts +plugins.discover.locator.navigate({ + indexPattern: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + highlightedField: 'foo', +}); +``` + +Note, in this example the `highlightedField` parameter will not appear in the +URL bar, it will be passed to the Discover app through [`history.pushState()`](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState) +mechanism (in Kibana case, using the [`history`](https://www.npmjs.com/package/history) package, which is used by `core.application.navigateToApp`). + + +## Sending a deep link to Kibana + +We have use cases were a deep link to some Kibana app is sent out, for example, +through e-mail or as a Slack message. + +In this example, lets consider some plugin gets hold of the Discover locator +on the server-side. + +```ts +const location = plugins.discover.locator.getRedirectPath({ + indexPattern: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + highlightedField: 'foo', +}); +``` + +This would return the location of the client-side redirect endpoint. The redirect +endpoint could look like this: + +``` +/app/goto/_redirect/DISCOVER_DEEP_LINKS?params={"indexPattern":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","highlightedField":"foo"}¶msVersion=7.x +``` + +This redirect client-side endpoint would find the Discover locator and and +execute the `.navigate()` method on it. + + +## Creating a short link + +In this example, lets create a short link using the Discover locator. + +```ts +const shortUrl = await plugins.discover.locator.createShortUrl( + { + indexPattern: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + highlightedField: 'foo', + } + 'human-readable-slug', +}); +``` + +The above example creates a short link and persists it in a saved object. The +short URL can have a human-readable slug, which uniquely identifies that short +URL. + +```ts +shortUrl.slug === 'human-readable-slug' +``` + +The short URL can be used to navigate to the Discover app. The redirect +client-side endpoint currently looks like this: + +``` +/app/goto/human-readable-slug +``` + +This persisted short URL would effectively work the same as the full version: + +``` +/app/goto/_redirect/DISCOVER_DEEP_LINKS?params={"indexPattern":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","highlightedField":"foo"}¶msVersion=7.x +``` + + +## External users navigating to a Kibana deep link + +Currently Elastic Cloud and Support have many links linking into Kibana. Most of +them are deep links into Discover and Dashboard apps where, for example, index +pattern is selected, or filters and time range are set. + +The external users could use the above mentioned client-side redirect endpoint +to navigate to their desired deep location within Kibana, for example, to the +Discover application: + +``` +/app/goto/_redirect/DISCOVER_DEEP_LINKS?params={"indexPattern":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","highlightedField":"foo"}¶msVersion=7.x +``` + + +# Motivation + +Our motivation to improve the URL services comes from us intending to use them +more, for example, for panel sharing to Slack or e-mail; and we believe that the +current state of the URL services needs an upgrade. + + +## Limitations of the Short URL Service + +We have identified the following limitations in the current implementation of +the Short URL Service: + +1. There is no migration system. If an application exposes this functionality, + every possible URL that might be generated should be supported forever. A + migration could be written inside the app itself, on page load, but this is a + risky path for URLs with many possibilities. + 1. __Will do:__ Short URLs will be created using locators. We will use + migrations provided by the locators to migrate the stored parameters + in the short URL saved object. +1. Short URLs store only the URL of the destination page. However, the + destination page might have other state which affects the display of the page + but is not present in the URL. Once the short URL is used to navigate to that + page, any state that is kept only in memory is lost. + 1. __Will do:__ The new implementation of the short URLs will also persist + the location state of the URL. That state would be provided to a + Kibana app once a user navigates to that app using a short URL. +1. It exposes only HTTP endpoint API. + 1. __Will do:__ We will also expose a URL Service client through plugin + contract on the server and browser. +1. It only has 3 HTTP endpoints, yet all three have different paths: + (1) `/short_url`, (2) `/shorten_url`; and (3) `/goto`. + 1. __Will do:__ We will normalize the HTTP endpoints. We will use HTTP + method "verbs" like POST, instead of verbs in the url like "shorten_url". +1. There is not much documentation for developers. + 1. __Will do:__ The new service will have a much nicer API and docs. +1. There is no way to delete short URLs once they are created. + 1. __Will do:__ The new service will provide CRUD API to manage short URLs, + including deletion. +1. Short URL service uses MD5 algorithm to hash long URLs. Security team + requested to stop using that algorithm. + 1. __Will do:__ The new URL Service will not use MD5 algorithm. +1. Short URLs are not automatically deleted when the target (say dashboard) is + deleted. (#10450) + 1. __Could do:__ The URL Service will not provide such feature. Though the + short URLs will keep track of saved object references used in the params + to generate a short URL. Maybe those saved references could somehow be + used in the future to provide such a facility. + + Currently, there are two possible avenues for deleting a short URL when + the underlying dashboard is deleted: + + 1. The Dashboard app could keep track of short URLs it generates for each + dashboard. Once a dashboard is deleted, the Dashboard app also + deletes all short URLs associated with that dashboard. + 1. Saved Objects Service could implement *cascading deletes*. Once a saved + object is deleted, the associated saved objects are also deleted + (#71453). +1. Add additional metadata to each short URL. + 1. __Could do:__ Each short URL already keeps a counter of how often it was + resolved, we could also keep track of a timestamp when it was last + resolved, and have an ability for users to give a title to each short URL. +1. Short URLs don't have a management UI. + 1. __Will NOT do:__ We will not create a dedicated UI for managing short + URLs. We could improve how short URLs saved objects are presented in saved + object management UI. +1. Short URLs can't be created by read-only users (#18006). + 1. __Will NOT do:__ Currently short URLs are stored as saved objects of type + `url`, we would like to keep it that way and benefit from saved object + facilities like references, migrations, authorization etc.. The consensus + is that we will not allow anonymous users to create short URLs. We want to + continue using saved object for short URLs going forward and not + compromise on their security model. + + +## Limitations of the URL Generator Service + +We have identified the following limitations in the current implementation of +the URL Generator Service: + +1. URL generator generate only the URL of the destination. However there is + also the ability to use location state with `core.application.navigateToApp` + navigation method. + 1. __Will do:__ The new locators will also generate the location state, which + will be used in `.navigateToApp` method. +1. URL generators are available only on the client-side. There is no way to use + them together with short URLs. + 1. __Will do:__ We will implement locators also on the server-side + (they will be available in both environments) and we will combine them + with the Short URL Service. +1. URL generators are not exposed externally, thus Cloud and Support cannot use + them to generate deep links into Kibana. + 1. __Will do:__ We will expose HTTP endpoints on the server-side and the + "redirect" app on the client-side which external users will be able to use + to deep link into Kibana using locators. + + +## Limitations of the architecture + +One major reason we want to "refresh" the Short URL Service and the URL +Generator Service is their architecture. + +Currently, the Short URL Service is implemented on top of the `url` type saved +object on the server-side. However, it only exposes the +HTTP endpoints, it does not expose any API on the server for the server-side +plugins to consume; on the client-side there is no plugin API either, developers +need to manually execute HTTP requests. + +The URL Generator Service is only available on the client-side, there is no way +to use it on the server-side, yet we already have use cases (for example ML +team) where a server-side plugin wants to use a URL generator. + +![Current Short URL Service and URL Generator Service architecture](../images/url_service/old_architecture.png) + +The current architecture does not allow both services to be conveniently used, +also as they are implemented in different locations, they are disjointed— +we cannot create a short URL using an URL generator. + + +# Detailed design + +In general we will try to provide as much as possible the same API on the +server-side and the client-side. + + +## High level architecture + +Below diagram shows the proposed architecture of the URL Service. + +![URL Service architecture](../images/url_service/new_architecture.png) + + +## Plugin contracts + +The aim is to provide developers the same experience on the server and browser. + +Below are preliminary interfaces of the new URL Service. `IUrlService` will be +a shared interface defined in `/common` folder shared across server and browser. +This will allow us to provide users a common API interface on the server and +browser, wherever they choose to use the URL Service: + +```ts +/** + * Common URL Service client interface for the server-side and the client-side. + */ +interface IUrlService { + locators: ILocatorClient; + shortUrls: IShortUrlClient; +} +``` + + +### Locators + +The locator business logic will be contained in `ILocatorClient` client and will +provide two main functionalities: + +1. It will provide a facility to create locators. +1. It will also be a registry of locators, every newly created locator is + automatically added to the registry. The registry should never be used when + locator ID is known at the compile time, but is reserved only for use cases + when we only know ID of a locator at runtime. + +```ts +interface ILocatorClient { + create

(definition: LocatorDefinition

): Locator

; + get

(id: string): Locator

; +} +``` + +The `LocatorDefinition` interface is a developer-friendly interface for creating +new locators. Mainly two things will be required from each new locator: + +1. Implement the `getLocation()` method, which gives the locator specific `params` + object returns a Kibana location, see description of `KibanaLocation` below. +2. Implement the `PersistableState` interface which we use in Kibana. This will + allow to migrate the locator `params`. Implementation of the `PersistableState` + interface will replace the `.isDeprecated` and `.migrate()` properties of URL + generators. + + +```ts +interface LocatorDefinition

extends PeristableState

{ + id: string; + getLocation(params: P): KibanaLocation; +} +``` + +Each constructed locator will have the following interface: + +```ts +interface Locator

{ + /** Creates a new short URL saved object using this locator. */ + createShortUrl(params: P, slug?: string): Promise; + /** Returns a relative URL to the client-side redirect endpoint using this locator. */ + getRedirectPath(params: P): string; + /** Navigate using core.application.navigateToApp() using this locator. */ + navigate(params: P): void; // Only on browser. +} +``` + + +### Short URLs + +The short URL client `IShortUrlClient` which will be the same on the server and +browser. However, the server and browser might add extra utility methods for +convenience. + +```ts +/** + * CRUD-like API for short URLs. + */ +interface IShortUrlClient { + /** + * Delete a short URL. + * + * @param slug The slug (ID) of the short URL. + * @return Returns true if deletion was successful. + */ + delete(slug: string): Promise; + + /** + * Fetch short URL. + * + * @param slug The slug (ID) of the short URL. + */ + get(slug: string): Promise; + + /** + * Same as `get()` but it also increments the "view" counter and the + * "last view" timestamp of this short URL. + * + * @param slug The slug (ID) of the short URL. + */ + resolve(slug: string): Promise; +} +``` + +Note, that in this new service to create a short URL the developer will have to +use a locator (instead of creating it directly from a long URL). + +```ts +const shortUrl = await plugins.share.shortUrls.create( + plugins.discover.locator, + { + indexPattern: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', + highlightedField: 'foo', + }, + 'optional-human-readable-slug', +); +``` + +These short URLs will be stored in saved objects of type `url` and will be +automatically migrated using the locator. The long URL will NOT be stored in the +saved object. The locator ID and locator params will be stored in the saved +object, that will allow us to do the migrations for short URLs. + + +### `KibanaLocation` interface + +The `KibanaLocation` interface is a simple interface to store a location in some +Kibana application. + +```ts +interface KibanaLocation { + app: string; + route: string; + state: object; +} +``` + +It maps directly to a `.navigateToApp()` call. + +```ts +let location: KibanaLocation; + +core.application.navigateToApp(location.app, { + route: location.route, + state: location.state, +}); +``` + + +## HTTP endpoints + + +### Short URL CRUD+ HTTP endpoints + +Below HTTP endpoints are designed to work specifically with short URLs: + +| HTTP method | Path | Description | +|-----------------------|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| +| __POST__ | `/api/short_url` | Endpoint for creating new short URLs. | +| __GET__ | `/api/short_url/` | Endpoint for retrieving information about an existing short URL. | +| __DELETE__ | `/api/short_url/` | Endpoint for deleting an existing short URL. | +| __POST__ | `/api/short_url/` | Endpoint for updating information about an existing short URL. | +| __POST__ | `/api/short_url//_resolve` | Similar to `GET /api/short_url/`, but also increments the short URL access count counter and the last access timestamp. | + + +### The client-side navigate endpoint + +__NOTE.__ We are currently investigating if we really need this endpoint. The +main user of it was expected to be Cloud and Support to deeply link into Kibana, +but we are now reconsidering if we want to support this endpoint and possibly +find a different solution. + +The `/app/goto/_redirect/?params=...¶msVersion=...` client-side +endpoint will receive the locator ID and locator params, it will use those to +find the locator and execute `locator.navigate(params)` method. + +The `paramsVersion` parameter will be used to specify the version of the +`params` parameter. If the version is behind the latest version, then the migration +facilities of the locator will be used to on-the-fly migrate the `params` to the +latest version. + + +### Legacy endpoints + +Below are the legacy HTTP endpoints implemented by the `share` plugin, with a +plan of action for each endpoint: + +| HTTP method | Path | Description | +|-----------------------|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| +| __ANY__ | `/goto/` | Endpoint for redirecting short URLs, we will keep it to redirect short URLs. | +| __GET__ | `/api/short_url/` | The new `GET /api/short_url/` endpoint will return a superset of the payload that the legacy endpoint now returns. | +| __POST__ | `/api/shorten_url` | The legacy endpoints for creating short URLs. We will remove it or deprecate this endpoint and maintain it until 8.0 major release. | + + +# Drawbacks + +Why should we *not* do this? + +- Implementation cost will be a few weeks, but the code complexity and quality + will improve. +- There is a cost of migrating existing Kibana plugins to use the new API. + + +# Alternatives + +We haven't considered other design alternatives. + +One alternative is still do the short URL improvements outlined above. But +reconsider URL generators: + +- Do we need URL generators at all? + - Kibana URLs are not stable and have changed in our past experience. Hence, + the URL generators were created to make the URL generator parameters stable + unless a migration is available. +- Do we want to put migration support in URL generators? + - Alternative would be for each app to support URLs forever or do the + migrations on the fly for old URLs. +- Should Kibana URLs be stable and break only during major releases? +- Should the Kibana application interface be extended such that some version of + URL generators is built in? + +The impact of not doing this change is essentially extending technical debt. + + +# Adoption strategy + +Is this a breaking change? It is a breaking change in the sense that the API +will change. However, all the existing use cases will be supported. When +implementing this we will also adjust all Kibana code to use the new API. From +the perspective of the developers when using the existing URL services nothing +will change, they will simply need to review a PR which stops using the URL +Generator Service and uses the combined URL Service instead, which will provide +a superset of features. + +Alternatively, we can deprecate the URL Generator Service and maintain it for a +few minor releases. + + +# How we teach this + +For the existing short URL and URL generator functionality there is nothing to +teach, as they will continue working with a largely similar API. + +Everything else in the new URL Service will have JSDoc comments and good +documentation on our website. From f5a8405eb97b301021b14f129830975663830555 Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Mon, 19 Apr 2021 12:58:33 +0300 Subject: [PATCH 22/82] [Vega] Fixes problem with controls not being displayed on a map (#97373) * add element for vegaControls * Fix check types * Fixed type check Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../vis_type_vega/public/vega_view/vega_base_view.d.ts | 1 + .../public/vega_view/vega_map_view/layers/vega_layer.test.ts | 1 + .../public/vega_view/vega_map_view/layers/vega_layer.ts | 5 +++-- .../vis_type_vega/public/vega_view/vega_map_view/view.ts | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.d.ts b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.d.ts index b0ccdbba021ed..8f5770500253f 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.d.ts +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.d.ts @@ -34,6 +34,7 @@ export class VegaBaseView { destroy(): Promise; _$container: any; + _$controls: any; _parser: any; _vegaViewConfig: any; _serviceSettings: VegaViewParams['serviceSettings']; diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts b/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts index da4c14c77bc98..53337388dc190 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts +++ b/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts @@ -36,6 +36,7 @@ describe('vega_map_view/tms_raster_layer', () => { vegaView: ({ initialize: jest.fn(), } as unknown) as View, + vegaControls: 'element', updateVegaView: jest.fn(), }; }); diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.ts b/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.ts index a3efba804b454..8972b80cb99c5 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.ts +++ b/src/plugins/vis_type_vega/public/vega_view/vega_map_view/layers/vega_layer.ts @@ -13,12 +13,13 @@ import type { LayerParameters } from './types'; export interface VegaLayerContext { vegaView: View; updateVegaView: (map: Map, view: View) => void; + vegaControls: any; } export function initVegaLayer({ id, map: mapInstance, - context: { vegaView, updateVegaView }, + context: { vegaView, vegaControls, updateVegaView }, }: LayerParameters) { const vegaLayer: CustomLayerInterface = { id, @@ -34,7 +35,7 @@ export function initVegaLayer({ vegaContainer.style.height = mapCanvas.style.height; mapContainer.appendChild(vegaContainer); - vegaView.initialize(vegaContainer); + vegaView.initialize(vegaContainer, vegaControls); }, render() { updateVegaView(mapInstance, vegaView); diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_map_view/view.ts b/src/plugins/vis_type_vega/public/vega_view/vega_map_view/view.ts index b1ec79e6b8310..61ae1ce4e5d78 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_map_view/view.ts +++ b/src/plugins/vis_type_vega/public/vega_view/vega_map_view/view.ts @@ -175,6 +175,7 @@ export class VegaMapView extends VegaBaseView { map: mapBoxInstance, context: { vegaView, + vegaControls: this._$controls.get(0), updateVegaView, }, }); From b6fd28884b5800e147b2374bf4569625665b7ab8 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 19 Apr 2021 11:37:56 +0100 Subject: [PATCH 23/82] chore(NA): moving @kbn/babel-preset into bazel (#97271) * chore(NA): moving @kbn/babel-preset into bazel * chore(NA): remove unused deps from xpack package.json --- .../monorepo-packages.asciidoc | 1 + package.json | 2 +- packages/BUILD.bazel | 1 + packages/kbn-ace/package.json | 3 +- packages/kbn-analytics/package.json | 3 +- packages/kbn-babel-code-parser/package.json | 3 - packages/kbn-babel-preset/BUILD.bazel | 63 +++++++++++++++++++ packages/kbn-dev-utils/package.json | 1 - packages/kbn-es/package.json | 3 - packages/kbn-i18n/package.json | 1 - packages/kbn-interpreter/package.json | 1 - packages/kbn-monaco/package.json | 1 - packages/kbn-optimizer/package.json | 1 - packages/kbn-test/package.json | 1 - packages/kbn-ui-shared-deps/package.json | 1 - x-pack/package.json | 4 +- yarn.lock | 2 +- 17 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 packages/kbn-babel-preset/BUILD.bazel diff --git a/docs/developer/getting-started/monorepo-packages.asciidoc b/docs/developer/getting-started/monorepo-packages.asciidoc index bc47e46f6763b..9564087dabefe 100644 --- a/docs/developer/getting-started/monorepo-packages.asciidoc +++ b/docs/developer/getting-started/monorepo-packages.asciidoc @@ -63,6 +63,7 @@ yarn kbn watch-bazel - @elastic/datemath - @kbn/apm-utils +- @kbn/babel-preset - @kbn/config-schema - @kbn/tinymath - @kbn/utility-types diff --git a/package.json b/package.json index c6f33d263df84..38eaec444ac5d 100644 --- a/package.json +++ b/package.json @@ -454,7 +454,7 @@ "@istanbuljs/schema": "^0.1.2", "@jest/reporters": "^26.5.2", "@kbn/babel-code-parser": "link:packages/kbn-babel-code-parser", - "@kbn/babel-preset": "link:packages/kbn-babel-preset", + "@kbn/babel-preset": "link:bazel-bin/packages/kbn-babel-preset/npm_module", "@kbn/cli-dev-mode": "link:packages/kbn-cli-dev-mode", "@kbn/dev-utils": "link:packages/kbn-dev-utils", "@kbn/docs-utils": "link:packages/kbn-docs-utils", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index fe0e8efe0d44f..e1a85e926f049 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -5,6 +5,7 @@ filegroup( srcs = [ "//packages/elastic-datemath:build", "//packages/kbn-apm-utils:build", + "//packages/kbn-babel-preset:build", "//packages/kbn-config-schema:build", "//packages/kbn-tinymath:build", "//packages/kbn-utility-types:build", diff --git a/packages/kbn-ace/package.json b/packages/kbn-ace/package.json index 30f37b4786f36..5b4b0312aa1ae 100644 --- a/packages/kbn-ace/package.json +++ b/packages/kbn-ace/package.json @@ -10,7 +10,6 @@ "kbn:bootstrap": "yarn build --dev" }, "devDependencies": { - "@kbn/dev-utils": "link:../kbn-dev-utils", - "@kbn/babel-preset": "link:../kbn-babel-preset" + "@kbn/dev-utils": "link:../kbn-dev-utils" } } \ No newline at end of file diff --git a/packages/kbn-analytics/package.json b/packages/kbn-analytics/package.json index 715f0af96ea3e..5b9db79febd77 100644 --- a/packages/kbn-analytics/package.json +++ b/packages/kbn-analytics/package.json @@ -14,7 +14,6 @@ "kbn:watch": "node scripts/build --source-maps --watch" }, "devDependencies": { - "@kbn/dev-utils": "link:../kbn-dev-utils", - "@kbn/babel-preset": "link:../kbn-babel-preset" + "@kbn/dev-utils": "link:../kbn-dev-utils" } } \ No newline at end of file diff --git a/packages/kbn-babel-code-parser/package.json b/packages/kbn-babel-code-parser/package.json index bfe01c6eae8e3..a5e05da6f8ee4 100755 --- a/packages/kbn-babel-code-parser/package.json +++ b/packages/kbn-babel-code-parser/package.json @@ -13,8 +13,5 @@ "build": "../../node_modules/.bin/babel src --out-dir target", "kbn:bootstrap": "yarn build --quiet", "kbn:watch": "yarn build --watch" - }, - "dependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset" } } diff --git a/packages/kbn-babel-preset/BUILD.bazel b/packages/kbn-babel-preset/BUILD.bazel new file mode 100644 index 0000000000000..13542ed6e73ad --- /dev/null +++ b/packages/kbn-babel-preset/BUILD.bazel @@ -0,0 +1,63 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") + +PKG_BASE_NAME = "kbn-babel-preset" +PKG_REQUIRE_NAME = "@kbn/babel-preset" + +SOURCE_FILES = glob([ + "common_babel_parser_options.js", + "common_preset.js", + "istanbul_preset.js", + "node_preset.js", + "webpack_preset.js", +]) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", + "README.md", +] + +DEPS = [ + "@npm//@babel/plugin-proposal-class-properties", + "@npm//@babel/plugin-proposal-export-namespace-from", + "@npm//@babel/plugin-proposal-nullish-coalescing-operator", + "@npm//@babel/plugin-proposal-optional-chaining", + "@npm//@babel/plugin-proposal-private-methods", + "@npm//@babel/preset-env", + "@npm//@babel/preset-react", + "@npm//@babel/preset-typescript", + "@npm//babel-plugin-add-module-exports", + "@npm//babel-plugin-styled-components", +] + +js_library( + name = PKG_BASE_NAME, + srcs = [ + ":srcs", + ], + deps = DEPS, + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + srcs = NPM_MODULE_EXTRA_FILES, + deps = [ + ":%s" % PKG_BASE_NAME, + ] +) + +filegroup( + name = "build", + srcs = [ + ":npm_module", + ], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-dev-utils/package.json b/packages/kbn-dev-utils/package.json index e1990fca4e0bb..87e142c3bece7 100644 --- a/packages/kbn-dev-utils/package.json +++ b/packages/kbn-dev-utils/package.json @@ -17,7 +17,6 @@ "@kbn/utils": "link:../kbn-utils" }, "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/expect": "link:../kbn-expect" } } \ No newline at end of file diff --git a/packages/kbn-es/package.json b/packages/kbn-es/package.json index c8fe2101bd639..f47f042505cad 100644 --- a/packages/kbn-es/package.json +++ b/packages/kbn-es/package.json @@ -14,8 +14,5 @@ }, "dependencies": { "@kbn/dev-utils": "link:../kbn-dev-utils" - }, - "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset" } } \ No newline at end of file diff --git a/packages/kbn-i18n/package.json b/packages/kbn-i18n/package.json index d3b4e56fe05d4..570110589490b 100644 --- a/packages/kbn-i18n/package.json +++ b/packages/kbn-i18n/package.json @@ -12,7 +12,6 @@ "kbn:watch": "node scripts/build --watch --source-maps" }, "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/dev-utils": "link:../kbn-dev-utils" } } \ No newline at end of file diff --git a/packages/kbn-interpreter/package.json b/packages/kbn-interpreter/package.json index 59a14fa828583..491a7205be210 100644 --- a/packages/kbn-interpreter/package.json +++ b/packages/kbn-interpreter/package.json @@ -13,7 +13,6 @@ "@kbn/i18n": "link:../kbn-i18n" }, "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/dev-utils": "link:../kbn-dev-utils" } } \ No newline at end of file diff --git a/packages/kbn-monaco/package.json b/packages/kbn-monaco/package.json index bdf36915bab3a..f4309e08f5bdb 100644 --- a/packages/kbn-monaco/package.json +++ b/packages/kbn-monaco/package.json @@ -11,7 +11,6 @@ "build:antlr4ts": "../../node_modules/antlr4ts-cli/antlr4ts ./src/painless/antlr/painless_lexer.g4 ./src/painless/antlr/painless_parser.g4 && node ./scripts/fix_generated_antlr.js" }, "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/dev-utils": "link:../kbn-dev-utils" }, "dependencies": { diff --git a/packages/kbn-optimizer/package.json b/packages/kbn-optimizer/package.json index ac73fbc0fc16a..3c14d98755a32 100644 --- a/packages/kbn-optimizer/package.json +++ b/packages/kbn-optimizer/package.json @@ -11,7 +11,6 @@ "kbn:watch": "yarn build --watch" }, "dependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/config": "link:../kbn-config", "@kbn/dev-utils": "link:../kbn-dev-utils", "@kbn/std": "link:../kbn-std", diff --git a/packages/kbn-test/package.json b/packages/kbn-test/package.json index a2dc8f84cfb51..2afbe41e0e00e 100644 --- a/packages/kbn-test/package.json +++ b/packages/kbn-test/package.json @@ -19,7 +19,6 @@ "@kbn/optimizer": "link:../kbn-optimizer" }, "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/dev-utils": "link:../kbn-dev-utils", "@kbn/expect": "link:../kbn-expect", "@kbn/utils": "link:../kbn-utils" diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 47a2fa19e7a8e..00c6f677cd223 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -14,7 +14,6 @@ "@kbn/monaco": "link:../kbn-monaco" }, "devDependencies": { - "@kbn/babel-preset": "link:../kbn-babel-preset", "@kbn/dev-utils": "link:../kbn-dev-utils" } } \ No newline at end of file diff --git a/x-pack/package.json b/x-pack/package.json index 36a6d120d946b..0c0924b51264a 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -27,14 +27,12 @@ "yarn": "^1.21.1" }, "devDependencies": { - "@kbn/babel-preset": "link:../packages/kbn-babel-preset", "@kbn/dev-utils": "link:../packages/kbn-dev-utils", "@kbn/es": "link:../packages/kbn-es", "@kbn/expect": "link:../packages/kbn-expect", "@kbn/plugin-helpers": "link:../packages/kbn-plugin-helpers", "@kbn/storybook": "link:../packages/kbn-storybook", - "@kbn/test": "link:../packages/kbn-test", - "@kbn/utility-types": "link:../packages/kbn-utility-types" + "@kbn/test": "link:../packages/kbn-test" }, "dependencies": { "@elastic/safer-lodash-set": "link:../packages/elastic-safer-lodash-set", diff --git a/yarn.lock b/yarn.lock index 4d453cdb1dd27..c1b0fe1d1be4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2624,7 +2624,7 @@ version "0.0.0" uid "" -"@kbn/babel-preset@link:packages/kbn-babel-preset": +"@kbn/babel-preset@link:bazel-bin/packages/kbn-babel-preset/npm_module": version "0.0.0" uid "" From 2f4e9db7fc8de5752e32e8c30675099617af768a Mon Sep 17 00:00:00 2001 From: John Schulz Date: Mon, 19 Apr 2021 07:33:27 -0400 Subject: [PATCH 24/82] Use for consistent name+icon lockup (#97377) ## Summary From design ticket https://github.com/elastic/observability-design/issues/32 > any ... place we display a link to the hosted agent policy, show an icon with hover tooltip: This PR closes 1B + 1C from https://github.com/elastic/kibana/issues/91906 & two other places which followed the same pattern. Factored out some repeated code at each call site into a `` component

Screenshots

Agent Policy List View

Screen Shot 2021-04-16 at 1 01 55 PM

Agent List View

Screen Shot 2021-04-16 at 12 38 40 PM

Packaged Policy List View

Screen Shot 2021-04-16 at 10 23 49 AM

Agent Policy Detail View

Screen Shot 2021-04-16 at 12 21 42 PM
### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/components/link_and_revision.tsx | 75 +++++++++++-------- .../sections/agent_policy/list_page/index.tsx | 14 +--- .../agent_details/agent_details_overview.tsx | 13 +--- .../sections/agents/agent_list_page/index.tsx | 46 +++--------- .../detail/policies/package_policies.tsx | 31 +------- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 3 +- 7 files changed, 64 insertions(+), 120 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/link_and_revision.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/link_and_revision.tsx index 071a9dc5943b2..41ef63b23b564 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/link_and_revision.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/link_and_revision.tsx @@ -5,43 +5,54 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiText } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiIconTip, EuiLink, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import type { CSSProperties } from 'react'; import React, { memo } from 'react'; -import type { EuiLinkProps } from '@elastic/eui/src/components/link/link'; +import type { AgentPolicy } from '../../../../common/types'; +import { useLink } from '../hooks'; const MIN_WIDTH: CSSProperties = { minWidth: 0 }; const NO_WRAP_WHITE_SPACE: CSSProperties = { whiteSpace: 'nowrap' }; -export type LinkAndRevisionProps = EuiLinkProps & { - revision?: string | number; -}; - -/** - * Components shows a link for a given value along with a revision number to its right. The display - * value is truncated if it is longer than the width of where it is displayed, while the revision - * always remain visible - */ -export const LinkAndRevision = memo( - ({ revision, className, ...euiLinkProps }) => { - return ( - - - +export const AgentPolicySummaryLine = memo<{ policy: AgentPolicy }>(({ policy }) => { + const { getHref } = useLink(); + const { name, id, revision, is_managed: isManaged } = policy; + return ( + + + + {name || id} + + + {isManaged && ( + + )} + {revision && ( + + + + - {revision && ( - - - - - - )} - - ); - } -); + )} + + ); +}); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx index 55788da05bcea..48b9118d11566 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx @@ -36,7 +36,7 @@ import { useUrlParams, useBreadcrumbs, } from '../../../hooks'; -import { LinkAndRevision, SearchBar } from '../../../components'; +import { AgentPolicySummaryLine, SearchBar } from '../../../components'; import { LinkedAgentCount, AgentPolicyActionMenu } from '../components'; import { CreateAgentPolicyFlyout } from './components'; @@ -74,7 +74,7 @@ const AgentPolicyListPageLayout: React.FunctionComponent = ({ children }) => ( export const AgentPolicyListPage: React.FunctionComponent<{}> = () => { useBreadcrumbs('policies_list'); - const { getHref, getPath } = useLink(); + const { getPath } = useLink(); const hasWriteCapabilites = useCapabilities().write; const { agents: { enabled: isFleetEnabled }, @@ -132,13 +132,7 @@ export const AgentPolicyListPage: React.FunctionComponent<{}> = () => { }), width: '20%', render: (name: string, agentPolicy: AgentPolicy) => ( - - {name || agentPolicy.id} - + ), }, { @@ -205,7 +199,7 @@ export const AgentPolicyListPage: React.FunctionComponent<{}> = () => { } return cols; - }, [getHref, isFleetEnabled, resendRequest]); + }, [isFleetEnabled, resendRequest]); const createAgentPolicyButton = useMemo( () => ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx index 482861b3db9e8..bf8385712dd23 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx @@ -21,10 +21,10 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import type { Agent, AgentPolicy } from '../../../../../types'; -import { useKibanaVersion, useLink } from '../../../../../hooks'; +import { useKibanaVersion } from '../../../../../hooks'; import { isAgentUpgradeable } from '../../../../../services'; import { AgentPolicyPackageBadges } from '../../../components/agent_policy_package_badges'; -import { LinkAndRevision } from '../../../../../components'; +import { AgentPolicySummaryLine } from '../../../../../components'; // Allows child text to be truncated const FlexItemWithMinWidth = styled(EuiFlexItem)` @@ -35,7 +35,6 @@ export const AgentDetailsOverviewSection: React.FunctionComponent<{ agent: Agent; agentPolicy?: AgentPolicy; }> = memo(({ agent, agentPolicy }) => { - const { getHref } = useLink(); const kibanaVersion = useKibanaVersion(); return ( @@ -52,13 +51,7 @@ export const AgentDetailsOverviewSection: React.FunctionComponent<{ defaultMessage: 'Agent policy', }), description: agentPolicy ? ( - - {agentPolicy.name || agentPolicy.id} - + ) : ( agent.policy_id || '-' ), diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index 10f35aab44c5a..6dd1b8a9693e8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -37,7 +37,7 @@ import { useKibanaVersion, useStartServices, } from '../../../hooks'; -import { ContextMenuActions } from '../../../components'; +import { AgentPolicySummaryLine, ContextMenuActions } from '../../../components'; import { AgentStatusKueryHelper, isAgentUpgradeable } from '../../../services'; import { AGENT_SAVED_OBJECT_TYPE } from '../../../constants'; import { @@ -374,48 +374,24 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { defaultMessage: 'Agent policy', }), render: (policyId: string, agent: Agent) => { - const policyName = agentPoliciesIndexedById[policyId]?.name; + const agentPolicy = agentPoliciesIndexedById[policyId]; + const showWarning = agent.policy_revision && agentPolicy?.revision > agent.policy_revision; + return ( - - - {policyName || policyId} - - - {agent.policy_revision && ( + + {showWarning && ( - + + +   )} - {agent.policy_id && - agent.policy_revision && - agentPoliciesIndexedById[agent.policy_id] && - agentPoliciesIndexedById[agent.policy_id].revision > agent.policy_revision && ( - - - -   - {true && ( - <> - - - )} - - - )} ); }, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/epm/screens/detail/policies/package_policies.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/epm/screens/detail/policies/package_policies.tsx index 94b4b748cb1bd..b14551098e688 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/epm/screens/detail/policies/package_policies.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/epm/screens/detail/policies/package_policies.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import type { ReactNode } from 'react'; import React, { memo, useCallback, useMemo } from 'react'; import { Redirect } from 'react-router-dom'; import type { CriteriaWithPagination, EuiTableFieldDataColumnType } from '@elastic/eui'; @@ -16,8 +15,7 @@ import { FormattedRelative, FormattedMessage } from '@kbn/i18n/react'; import { InstallStatus } from '../../../../../types'; import { useLink, useUrlPagination } from '../../../../../hooks'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../../../constants'; -import type { LinkAndRevisionProps } from '../../../../../components'; -import { LinkAndRevision } from '../../../../../components'; +import { AgentPolicySummaryLine } from '../../../../../components'; import { LinkedAgentCount } from '../../../../../components/linked_agent_count'; import { useGetPackageInstallStatus } from '../../../hooks'; @@ -42,27 +40,6 @@ const IntegrationDetailsLink = memo<{ ); }); - -const AgentPolicyDetailLink = memo<{ - agentPolicyId: string; - revision: LinkAndRevisionProps['revision']; - children: ReactNode; -}>(({ agentPolicyId, revision, children }) => { - const { getHref } = useLink(); - - return ( - - {children} - - ); -}); - interface PackagePoliciesPanelProps { name: string; version: string; @@ -112,11 +89,7 @@ export const PackagePoliciesPage = ({ name, version }: PackagePoliciesPanelProps }), truncateText: true, render(id, { agentPolicy }) { - return ( - - {agentPolicy.name ?? id} - - ); + return ; }, }, { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 29f162a005a98..ec604eaf255cb 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8248,7 +8248,6 @@ "xpack.fleet.agentList.policyColumnTitle": "エージェントポリシー", "xpack.fleet.agentList.policyFilterText": "エージェントポリシー", "xpack.fleet.agentList.reassignActionText": "新しいポリシーに割り当てる", - "xpack.fleet.agentList.revisionNumber": "rev. {revNumber}", "xpack.fleet.agentList.showUpgradeableFilterLabel": "アップグレードが利用可能です", "xpack.fleet.agentList.statusColumnTitle": "ステータス", "xpack.fleet.agentList.statusFilterText": "ステータス", @@ -8666,7 +8665,6 @@ "xpack.fleet.policyForm.generalSettingsGroupDescription": "エージェントポリシーの名前と説明を選択してください。", "xpack.fleet.policyForm.generalSettingsGroupTitle": "一般設定", "xpack.fleet.policyForm.unableToDeleteDefaultPolicyText": "デフォルトポリシーは削除できません", - "xpack.fleet.policyNameLink.revisionNumber": "rev. {revNumber}", "xpack.fleet.securityRequiredErrorMessage": "Fleet を使用するには、Kibana と Elasticsearch でセキュリティを有効にする必要があります。", "xpack.fleet.securityRequiredErrorTitle": "セキュリティが有効ではありません", "xpack.fleet.settings.additionalYamlConfig": "Elasticsearch出力構成", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 0553e3c195532..729e32e11a5ff 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8323,7 +8323,6 @@ "xpack.fleet.agentList.policyColumnTitle": "代理策略", "xpack.fleet.agentList.policyFilterText": "代理策略", "xpack.fleet.agentList.reassignActionText": "分配到新策略", - "xpack.fleet.agentList.revisionNumber": "修订版 {revNumber}", "xpack.fleet.agentList.showUpgradeableFilterLabel": "升级可用", "xpack.fleet.agentList.statusColumnTitle": "状态", "xpack.fleet.agentList.statusFilterText": "状态", @@ -8751,7 +8750,7 @@ "xpack.fleet.policyForm.generalSettingsGroupDescription": "为您的代理策略选择名称和描述。", "xpack.fleet.policyForm.generalSettingsGroupTitle": "常规设置", "xpack.fleet.policyForm.unableToDeleteDefaultPolicyText": "默认策略无法删除", - "xpack.fleet.policyNameLink.revisionNumber": "修订版 {revNumber}", + "xpack.fleet.agentPolicySummaryLine.revisionNumber": "修订版 {revNumber}", "xpack.fleet.securityRequiredErrorMessage": "必须在 Kibana 和 Elasticsearch 启用安全性,才能使用 Fleet。", "xpack.fleet.securityRequiredErrorTitle": "安全性未启用", "xpack.fleet.settings.additionalYamlConfig": "Elasticsearch 输出配置", From 0ea0e40331fa85a88e695779f9e1669fe563a9f9 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 19 Apr 2021 13:49:26 +0200 Subject: [PATCH 25/82] [Lens] Better defaults for top values odering (#97099) --- .../indexpattern_suggestions.test.tsx | 14 ++- .../operations/definitions/index.ts | 2 +- .../operations/definitions/terms/index.tsx | 50 ++++++++--- .../definitions/terms/terms.test.tsx | 85 +++++++++++++++++-- .../operations/layer_helpers.test.ts | 52 +++++++++++- .../operations/layer_helpers.ts | 12 ++- .../test/functional/apps/lens/chart_data.ts | 16 ++-- 7 files changed, 198 insertions(+), 33 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx index c4ebcab85e722..ccae659934ba7 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx @@ -965,7 +965,19 @@ describe('IndexPattern Data Source suggestions', () => { currentLayer: { ...initialState.layers.currentLayer, columns: { - cola: initialState.layers.currentLayer.columns.cola, + cola: { + dataType: 'string', + isBucketed: true, + sourceField: 'source', + label: 'values of source', + customLabel: true, + operationType: 'terms', + params: { + orderBy: { type: 'alphabetical', fallback: false }, + orderDirection: 'asc', + size: 5, + }, + }, }, columnOrder: ['cola'], }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts index 0b63dc6ece974..37bd64251ed81 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts @@ -179,7 +179,7 @@ interface BaseOperationDefinitionProps { columns: Record ) => string; /** - * This function is called if another column in the same layer changed or got removed. + * This function is called if another column in the same layer changed or got added/removed. * Can be used to update references to other columns (e.g. for sorting). * Based on the current column and the other updated columns, this function has to * return an updated column. If not implemented, the `id` function is used instead. diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx index 857e8b3605cfc..d226fe6f2a745 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx @@ -57,7 +57,9 @@ export interface TermsIndexPatternColumn extends FieldBasedIndexPatternColumn { operationType: 'terms'; params: { size: number; - orderBy: { type: 'alphabetical' } | { type: 'column'; columnId: string }; + // if order is alphabetical, the `fallback` flag indicates whether it became alphabetical because there wasn't + // another option or whether the user explicitly chose to make it alphabetical. + orderBy: { type: 'alphabetical'; fallback?: boolean } | { type: 'column'; columnId: string }; orderDirection: 'asc' | 'desc'; otherBucket?: boolean; missingBucket?: boolean; @@ -123,7 +125,7 @@ export const termsOperation: OperationDefinition { const columns = layer.columns; const currentColumn = columns[thisColumnId] as TermsIndexPatternColumn; - if (currentColumn.params.orderBy.type === 'column') { + if (currentColumn.params.orderBy.type === 'column' || currentColumn.params.orderBy.fallback) { // check whether the column is still there and still a metric - const columnSortedBy = columns[currentColumn.params.orderBy.columnId]; - if (!columnSortedBy || !isSortableByColumn(layer, changedColumnId)) { + const columnSortedBy = + currentColumn.params.orderBy.type === 'column' + ? columns[currentColumn.params.orderBy.columnId] + : undefined; + if ( + !columnSortedBy || + (currentColumn.params.orderBy.type === 'column' && + !isSortableByColumn(layer, currentColumn.params.orderBy.columnId)) + ) { + // check whether we can find another metric column to sort by + const existingMetricColumn = Object.entries(layer.columns) + .filter(([columnId]) => isSortableByColumn(layer, columnId)) + .map(([id]) => id)[0]; return { ...currentColumn, params: { ...currentColumn.params, - orderBy: { type: 'alphabetical' }, - orderDirection: 'asc', + orderBy: existingMetricColumn + ? { type: 'column', columnId: existingMetricColumn } + : { type: 'alphabetical', fallback: true }, + orderDirection: existingMetricColumn ? 'desc' : 'asc', }, }; } @@ -197,7 +212,7 @@ export const termsOperation: OperationDefinition) => + onChange={(e: React.ChangeEvent) => { + const newOrderByValue = fromValue(e.target.value); + const updatedLayer = updateColumnParam({ + layer, + columnId, + paramName: 'orderBy', + value: newOrderByValue, + }); updateLayer( updateColumnParam({ - layer, + layer: updatedLayer, columnId, - paramName: 'orderBy', - value: fromValue(e.target.value), + paramName: 'orderDirection', + value: newOrderByValue.type === 'alphabetical' ? 'asc' : 'desc', }) - ) - } + ); + }} aria-label={i18n.translate('xpack.lens.indexPattern.terms.orderBy', { defaultMessage: 'Rank by', })} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx index f75bec141ccae..2e7307f6a2ec4 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx @@ -358,7 +358,7 @@ describe('terms', () => { }, }); expect(termsColumn.params).toEqual( - expect.objectContaining({ orderBy: { type: 'alphabetical' } }) + expect.objectContaining({ orderBy: { type: 'alphabetical', fallback: true } }) ); }); @@ -469,7 +469,7 @@ describe('terms', () => { ); expect(updatedColumn.params).toEqual( expect.objectContaining({ - orderBy: { type: 'alphabetical' }, + orderBy: { type: 'alphabetical', fallback: true }, }) ); }); @@ -516,7 +516,7 @@ describe('terms', () => { ); expect(updatedColumn.params).toEqual( expect.objectContaining({ - orderBy: { type: 'alphabetical' }, + orderBy: { type: 'alphabetical', fallback: true }, }) ); }); @@ -548,7 +548,7 @@ describe('terms', () => { ); expect(termsColumn.params).toEqual( expect.objectContaining({ - orderBy: { type: 'alphabetical' }, + orderBy: { type: 'alphabetical', fallback: true }, }) ); }); @@ -592,7 +592,81 @@ describe('terms', () => { ); expect(termsColumn.params).toEqual( expect.objectContaining({ - orderBy: { type: 'alphabetical' }, + orderBy: { type: 'alphabetical', fallback: true }, + }) + ); + }); + + it('should set order to ascending if falling back to alphabetical', () => { + const termsColumn = termsOperation.onOtherColumnChanged!( + { + columns: { + col2: { + label: 'Top value of category', + dataType: 'string', + isBucketed: true, + + // Private + operationType: 'terms', + params: { + orderBy: { type: 'column', columnId: 'col1' }, + size: 3, + orderDirection: 'desc', + }, + sourceField: 'category', + }, + }, + columnOrder: [], + indexPatternId: '', + }, + 'col2', + 'col1' + ); + expect(termsColumn.params).toEqual( + expect.objectContaining({ + orderDirection: 'asc', + }) + ); + }); + + it('should switch back to descending metric sorting if alphabetical sorting was applied as fallback', () => { + const initialColumn: TermsIndexPatternColumn = { + label: 'Top value of category', + dataType: 'string', + isBucketed: true, + + // Private + operationType: 'terms', + params: { + orderBy: { type: 'alphabetical', fallback: true }, + size: 3, + orderDirection: 'asc', + }, + sourceField: 'category', + }; + const updatedColumn = termsOperation.onOtherColumnChanged!( + { + indexPatternId: '', + columnOrder: [], + columns: { + col2: initialColumn, + col1: { + label: 'Count', + dataType: 'number', + isBucketed: false, + sourceField: 'Records', + operationType: 'count', + }, + }, + }, + 'col2', + 'col1' + ); + + expect(updatedColumn.params).toEqual( + expect.objectContaining({ + orderBy: { type: 'column', columnId: 'col1' }, + orderDirection: 'desc', }) ); }); @@ -774,6 +848,7 @@ describe('terms', () => { type: 'column', columnId: 'col2', }, + orderDirection: 'desc', }, }, }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts index 34e2eb2c90122..d3ca70c086cb5 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts @@ -352,6 +352,50 @@ describe('state_helpers', () => { ).toEqual(expect.objectContaining({ columnOrder: ['col1', 'col2'] })); }); + it('should call onOtherColumn changed on existing columns', () => { + expect( + insertNewColumn({ + layer: { + indexPatternId: '1', + columnOrder: ['col1'], + columns: { + col1: { + label: 'Top values of source', + dataType: 'string', + isBucketed: true, + + // Private + operationType: 'terms', + sourceField: 'source', + params: { + orderBy: { type: 'alphabetical', fallback: true }, + orderDirection: 'asc', + size: 5, + }, + }, + }, + }, + columnId: 'col2', + indexPattern, + op: 'sum', + field: indexPattern.fields[2], + visualizationGroups: [], + }) + ).toEqual( + expect.objectContaining({ + columns: expect.objectContaining({ + col1: expect.objectContaining({ + params: { + orderBy: { columnId: 'col2', type: 'column' }, + orderDirection: 'desc', + size: 5, + }, + }), + }), + }) + ); + }); + it('should allow multiple metrics', () => { expect( insertNewColumn({ @@ -908,7 +952,11 @@ describe('state_helpers', () => { columns: { col1: { ...termsColumn, - params: { orderBy: { type: 'alphabetical' }, orderDirection: 'asc', size: 5 }, + params: { + orderBy: { type: 'alphabetical', fallback: true }, + orderDirection: 'asc', + size: 5, + }, }, id1: expect.objectContaining({ dataType: 'number', @@ -1624,7 +1672,7 @@ describe('state_helpers', () => { ...termsColumn, params: { ...termsColumn.params, - orderBy: { type: 'alphabetical' }, + orderBy: { type: 'alphabetical', fallback: true }, orderDirection: 'asc', }, }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts index 1661e5de8248e..bbe2ca4cd3d61 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts @@ -714,7 +714,11 @@ function addBucket( columns: { ...layer.columns, [addedColumnId]: column }, columnOrder: updatedColumnOrder, }; - return { ...tempLayer, columnOrder: getColumnOrder(tempLayer) }; + return { + ...tempLayer, + columns: adjustColumnReferencesForChangedColumn(tempLayer, addedColumnId), + columnOrder: getColumnOrder(tempLayer), + }; } export function reorderByGroups( @@ -766,7 +770,11 @@ function addMetric( [addedColumnId]: column, }, }; - return { ...tempLayer, columnOrder: getColumnOrder(tempLayer) }; + return { + ...tempLayer, + columnOrder: getColumnOrder(tempLayer), + columns: adjustColumnReferencesForChangedColumn(tempLayer, addedColumnId), + }; } export function getMetricOperationTypes(field: IndexPatternField) { diff --git a/x-pack/test/functional/apps/lens/chart_data.ts b/x-pack/test/functional/apps/lens/chart_data.ts index c4db59c020f13..887906ce2205b 100644 --- a/x-pack/test/functional/apps/lens/chart_data.ts +++ b/x-pack/test/functional/apps/lens/chart_data.ts @@ -37,19 +37,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); const expectedData = [ - { x: '0.53.251.53', y: 4624.75 }, - { x: '0.108.3.2', y: 7359.41 }, - { x: '0.209.80.244', y: 6169.9 }, - { x: '0.228.1.71', y: 7092.8 }, - { x: '0.254.91.215', y: 3835.58 }, - { x: '__other__', y: 5727.24 }, + { x: '97.220.3.248', y: 19755 }, + { x: '169.228.188.120', y: 18994 }, + { x: '78.83.247.30', y: 17246 }, + { x: '226.82.228.233', y: 15687 }, + { x: '93.28.27.24', y: 15614.33 }, + { x: '__other__', y: 5722.77 }, ]; function assertMatchesExpectedData(state: DebugState) { expect( state.bars![0].bars.map((bar) => ({ x: bar.x, - y: Math.round(bar.y * 100) / 100, + y: Math.floor(bar.y * 100) / 100, })) ).to.eql(expectedData); } @@ -94,7 +94,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(terms.map((term) => (term === 'Other' ? '__other__' : term))).to.eql( expectedData.map(({ x }) => x) ); - expect(values.map((value) => Math.round(100 * Number(value.replace(',', ''))) / 100)).to.eql( + expect(values.map((value) => Math.floor(100 * Number(value.replace(',', ''))) / 100)).to.eql( expectedData.map(({ y }) => y) ); }); From a021946e85bee62dd2d68b1da4b1c34cc852cdc2 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 19 Apr 2021 13:52:49 +0200 Subject: [PATCH 26/82] [Lens] Reload on runtime edit (#97161) --- .../lens/public/app_plugin/app.test.tsx | 23 ++++++++++++++++++- x-pack/plugins/lens/public/app_plugin/app.tsx | 20 +++++++++++++++- .../indexpattern_datasource/datapanel.tsx | 2 ++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index b7dbf1bbe4d87..a4137aa0407ba 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { Observable } from 'rxjs'; +import { Observable, Subject } from 'rxjs'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { App } from './app'; @@ -77,6 +77,8 @@ function createMockFrame(): jest.Mocked { }; } +const sessionIdSubject = new Subject(); + function createMockSearchService() { let sessionIdCounter = 1; return { @@ -84,6 +86,7 @@ function createMockSearchService() { start: jest.fn(() => `sessionId-${sessionIdCounter++}`), clear: jest.fn(), getSessionId: jest.fn(() => `sessionId-${sessionIdCounter}`), + getSession$: jest.fn(() => sessionIdSubject.asObservable()), }, }; } @@ -1328,6 +1331,24 @@ describe('Lens App', () => { ); }); + it('re-renders the frame if session id changes from the outside', async () => { + const services = makeDefaultServices(); + const { frame } = mountWith({ props: undefined, services }); + + act(() => { + sessionIdSubject.next('new-session-id'); + }); + await act(async () => { + await new Promise((r) => setTimeout(r, 0)); + }); + expect(frame.mount).toHaveBeenCalledWith( + expect.any(Element), + expect.objectContaining({ + searchSessionId: `new-session-id`, + }) + ); + }); + it('updates the searchSessionId when the active saved query is cleared', () => { const { component, frame, services } = mountWith({}); act(() => diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index 8caa1737c00ad..e30fcda40276c 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -14,7 +14,7 @@ import { Toast } from 'kibana/public'; import { VisualizeFieldContext } from 'src/plugins/ui_actions/public'; import { Datatable } from 'src/plugins/expressions/public'; import { EuiBreadcrumb } from '@elastic/eui'; -import { finalize, switchMap, tap } from 'rxjs/operators'; +import { delay, finalize, switchMap, tap } from 'rxjs/operators'; import { downloadMultipleAs } from '../../../../../src/plugins/share/public'; import { createKbnUrlStateStorage, @@ -221,11 +221,29 @@ export function App({ kbnUrlStateStorage ); + const sessionSubscription = data.search.session + .getSession$() + // wait for a tick to filter/timerange subscribers the chance to update the session id in the state + .pipe(delay(0)) + // then update if it didn't get updated yet + .subscribe((newSessionId) => { + if (newSessionId) { + setState((prevState) => { + if (prevState.searchSessionId !== newSessionId) { + return { ...prevState, searchSessionId: newSessionId }; + } else { + return prevState; + } + }); + } + }); + return () => { stopSyncingQueryServiceStateWithUrl(); filterSubscription.unsubscribe(); timeSubscription.unsubscribe(); autoRefreshSubscription.unsubscribe(); + sessionSubscription.unsubscribe(); }; }, [ data.query.filterManager, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx index 2cad77b003454..1b7c8d64de36e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx @@ -503,6 +503,8 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ patterns: [currentIndexPattern.id], }); onUpdateIndexPattern(newlyMappedIndexPattern[currentIndexPattern.id]); + // start a new session so all charts are refreshed + data.search.session.start(); }, [data, currentIndexPattern, onUpdateIndexPattern]); const editField = useMemo( From ce6d2f5a50cbff4c304be023f1641be1e5fc0298 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 19 Apr 2021 14:06:13 +0200 Subject: [PATCH 27/82] improve custom label handling (#97219) --- .../dimension_panel/dimension_editor.tsx | 7 +++- .../dimension_panel/dimension_panel.test.tsx | 38 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx index 1fc755ec489c7..2c503a7bd6967 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx @@ -542,7 +542,12 @@ export function DimensionEditor(props: DimensionEditorProps) { [columnId]: { ...selectedColumn, label: value, - customLabel: true, + customLabel: + operationDefinitionMap[selectedColumn.operationType].getDefaultLabel( + selectedColumn, + state.indexPatterns[state.layers[layerId].indexPatternId], + state.layers[layerId].columns + ) !== value, }, }, }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx index 7d1644d07d2aa..5e79fde0fa8fa 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx @@ -683,6 +683,44 @@ describe('IndexPatternDimensionEditorPanel', () => { ); }); + it('should remove customLabel flag if label is set to default', () => { + wrapper = mount( + + ); + + act(() => { + wrapper + .find('input[data-test-subj="indexPattern-label-edit"]') + .simulate('change', { target: { value: 'Maximum of bytes' } }); + }); + + expect(setState).toHaveBeenCalledWith({ + ...state, + layers: { + first: { + ...state.layers.first, + columns: { + ...state.layers.first.columns, + col1: expect.objectContaining({ + label: 'Maximum of bytes', + customLabel: false, + // Other parts of this don't matter for this test + }), + }, + }, + }, + }); + }); + describe('transient invalid state', () => { it('should set the state if selecting an operation incompatible with the current field', () => { wrapper = mount(); From 5035230190e2bfa351a697d4afc28f67cb39ea98 Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Mon, 19 Apr 2021 13:10:24 +0100 Subject: [PATCH 28/82] [Discover] Sort option: Introduce format parameter (#96774) * [Discover] Updating a functional test * [Discover] Context view: add support for date nanos custom * Remove unnecessary change to a functional test * Fix failing unit tests * Remove unnecessary intialization * Add new type definition to data plugin * Update docs * Simplify return statement * Removing unnecessary type export Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...-plugin-plugins-data-public.esquerysortvalue.md | 2 +- .../data/common/search/search_source/types.ts | 10 +++++++++- src/plugins/data/public/public.api.md | 3 ++- .../application/angular/context/api/_stubs.js | 2 +- .../context/api/context.predecessors.test.js | 5 ++++- .../angular/context/api/context.successors.test.js | 5 ++++- .../application/angular/context/api/context.ts | 2 +- .../angular/context/api/utils/get_es_query_sort.ts | 14 ++++++++++++-- .../apps/context/_date_nanos_custom_timestamp.js | 7 +++---- 9 files changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquerysortvalue.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquerysortvalue.md index 83762c22f0f82..15f45532cce2f 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquerysortvalue.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquerysortvalue.md @@ -7,5 +7,5 @@ Signature: ```typescript -export declare type EsQuerySortValue = Record; +export declare type EsQuerySortValue = Record; ``` diff --git a/src/plugins/data/common/search/search_source/types.ts b/src/plugins/data/common/search/search_source/types.ts index 99f3f67a5e257..507fda0dc9e47 100644 --- a/src/plugins/data/common/search/search_source/types.ts +++ b/src/plugins/data/common/search/search_source/types.ts @@ -42,12 +42,20 @@ export enum SortDirection { desc = 'desc', } +export interface SortDirectionFormat { + order: SortDirection; + format?: string; +} + export interface SortDirectionNumeric { order: SortDirection; numeric_type?: 'double' | 'long' | 'date' | 'date_nanos'; } -export type EsQuerySortValue = Record; +export type EsQuerySortValue = Record< + string, + SortDirection | SortDirectionNumeric | SortDirectionFormat +>; interface SearchField { [key: string]: SearchFieldValue; diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 0dd06691d68bb..dc138b7347d04 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -832,10 +832,11 @@ export interface EsQueryConfig { } // Warning: (ae-forgotten-export) The symbol "SortDirectionNumeric" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "SortDirectionFormat" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "EsQuerySortValue" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type EsQuerySortValue = Record; +export type EsQuerySortValue = Record; // Warning: (ae-forgotten-export) The symbol "ExpressionTypeDefinition" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "name" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/discover/public/application/angular/context/api/_stubs.js b/src/plugins/discover/public/application/angular/context/api/_stubs.js index 3baa7424e35d7..6930e96a0d411 100644 --- a/src/plugins/discover/public/application/angular/context/api/_stubs.js +++ b/src/plugins/discover/public/application/angular/context/api/_stubs.js @@ -66,7 +66,7 @@ export function createContextSearchSourceStub(hits, timeField = '@timestamp') { const lastQuery = searchSourceStub.setField.withArgs('query').lastCall.args[1]; const timeRange = lastQuery.query.bool.must.constant_score.filter.range[timeField]; const lastSort = searchSourceStub.setField.withArgs('sort').lastCall.args[1]; - const sortDirection = lastSort[0][timeField]; + const sortDirection = lastSort[0][timeField].order; const sortFunction = sortDirection === 'asc' ? (first, second) => first[timeField] - second[timeField] diff --git a/src/plugins/discover/public/application/angular/context/api/context.predecessors.test.js b/src/plugins/discover/public/application/angular/context/api/context.predecessors.test.js index ab47111f70e92..9f5e62da398d2 100644 --- a/src/plugins/discover/public/application/angular/context/api/context.predecessors.test.js +++ b/src/plugins/discover/public/application/angular/context/api/context.predecessors.test.js @@ -211,7 +211,10 @@ describe('context app', function () { [] ).then(() => { expect( - mockSearchSource.setField.calledWith('sort', [{ '@timestamp': 'asc' }, { _doc: 'asc' }]) + mockSearchSource.setField.calledWith('sort', [ + { '@timestamp': { order: 'asc', format: 'strict_date_optional_time' } }, + { _doc: 'asc' }, + ]) ).toBe(true); }); }); diff --git a/src/plugins/discover/public/application/angular/context/api/context.successors.test.js b/src/plugins/discover/public/application/angular/context/api/context.successors.test.js index d4f3754f3d0a5..4936c937aa2fa 100644 --- a/src/plugins/discover/public/application/angular/context/api/context.successors.test.js +++ b/src/plugins/discover/public/application/angular/context/api/context.successors.test.js @@ -215,7 +215,10 @@ describe('context app', function () { [] ).then(() => { expect( - mockSearchSource.setField.calledWith('sort', [{ '@timestamp': 'desc' }, { _doc: 'desc' }]) + mockSearchSource.setField.calledWith('sort', [ + { '@timestamp': { order: 'desc', format: 'strict_date_optional_time' } }, + { _doc: 'desc' }, + ]) ).toBe(true); }); }); diff --git a/src/plugins/discover/public/application/angular/context/api/context.ts b/src/plugins/discover/public/application/angular/context/api/context.ts index 43f6e83d286b3..820e37d754ef2 100644 --- a/src/plugins/discover/public/application/angular/context/api/context.ts +++ b/src/plugins/discover/public/application/angular/context/api/context.ts @@ -87,7 +87,7 @@ function fetchContextProvider(indexPatterns: IndexPatternsContract, useNewFields useNewFieldsApi ); - const sort = getEsQuerySort(timeField, tieBreakerField, sortDirToApply); + const sort = getEsQuerySort(timeField, tieBreakerField, sortDirToApply, nanos); const hits = await fetchHitsInInterval( searchSource, diff --git a/src/plugins/discover/public/application/angular/context/api/utils/get_es_query_sort.ts b/src/plugins/discover/public/application/angular/context/api/utils/get_es_query_sort.ts index a560315dc04a4..2144d2f1cd7fd 100644 --- a/src/plugins/discover/public/application/angular/context/api/utils/get_es_query_sort.ts +++ b/src/plugins/discover/public/application/angular/context/api/utils/get_es_query_sort.ts @@ -14,11 +14,21 @@ import { EsQuerySortValue, SortDirection } from '../../../../../kibana_services' * @param timeField * @param tieBreakerField * @param sortDir + * @param nanos */ export function getEsQuerySort( timeField: string, tieBreakerField: string, - sortDir: SortDirection + sortDir: SortDirection, + nanos?: string ): [EsQuerySortValue, EsQuerySortValue] { - return [{ [timeField]: sortDir }, { [tieBreakerField]: sortDir }]; + return [ + { + [timeField]: { + order: sortDir, + format: nanos ? 'strict_date_optional_time_nanos' : 'strict_date_optional_time', + }, + }, + { [tieBreakerField]: sortDir }, + ]; } diff --git a/test/functional/apps/context/_date_nanos_custom_timestamp.js b/test/functional/apps/context/_date_nanos_custom_timestamp.js index 8860204b058a5..b837c55d821ac 100644 --- a/test/functional/apps/context/_date_nanos_custom_timestamp.js +++ b/test/functional/apps/context/_date_nanos_custom_timestamp.js @@ -27,7 +27,6 @@ export default function ({ getService, getPageObjects }) { await kibanaServer.uiSettings.update({ 'context:defaultSize': `${TEST_DEFAULT_CONTEXT_SIZE}`, 'context:step': `${TEST_STEP_SIZE}`, - 'discover:searchFieldsFromSource': true, }); }); @@ -35,9 +34,9 @@ export default function ({ getService, getPageObjects }) { await PageObjects.context.navigateTo(TEST_INDEX_PATTERN, '1'); const actualRowsText = await docTable.getRowsText(); const expectedRowsText = [ - 'Oct 21, 2019 @ 08:30:04.828733000 -', - 'Oct 21, 2019 @ 00:30:04.828740000 -', - 'Oct 21, 2019 @ 00:30:04.828723000 -', + 'Oct 21, 2019 @ 08:30:04.828733000', + 'Oct 21, 2019 @ 00:30:04.828740000', + 'Oct 21, 2019 @ 00:30:04.828723000', ]; expect(actualRowsText).to.eql(expectedRowsText); }); From 4540a943d795245df9386dd222b9e1b63232e707 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 19 Apr 2021 14:14:10 +0200 Subject: [PATCH 29/82] directly submit query (#97254) --- .../lens/public/app_plugin/app.test.tsx | 20 +++++++++++++++++++ x-pack/plugins/lens/public/app_plugin/app.tsx | 1 + 2 files changed, 21 insertions(+) diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index a4137aa0407ba..87000865850e1 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -1272,6 +1272,26 @@ describe('Lens App', () => { ); }); + it('updates the query if saved query is selected', () => { + const { component } = mountWith({}); + act(() => { + component.find(TopNavMenu).prop('onSavedQueryUpdated')!({ + id: '2', + attributes: { + title: 'new title', + description: '', + query: { query: 'abc:def', language: 'lucene' }, + }, + }); + }); + expect(TopNavMenu).toHaveBeenCalledWith( + expect.objectContaining({ + query: { query: 'abc:def', language: 'lucene' }, + }), + {} + ); + }); + it('clears all existing unpinned filters when the active saved query is cleared', () => { const { component, frame, services } = mountWith({}); act(() => diff --git a/x-pack/plugins/lens/public/app_plugin/app.tsx b/x-pack/plugins/lens/public/app_plugin/app.tsx index e30fcda40276c..f137047cfc871 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.tsx @@ -692,6 +692,7 @@ export function App({ setState((s) => ({ ...s, savedQuery: { ...savedQuery }, // Shallow query for reference issues + query: savedQuery.attributes.query, })); }} onClearSavedQuery={() => { From 1b02152e185caf3cfb8d997558650a0d388be4a2 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Mon, 19 Apr 2021 15:30:28 +0200 Subject: [PATCH 30/82] [Graph] Fix style for disabled fields when focused (#96780) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../field_manager/_field_editor.scss | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/graph/public/components/field_manager/_field_editor.scss b/x-pack/plugins/graph/public/components/field_manager/_field_editor.scss index 20773d98ce9c3..867899fc66391 100644 --- a/x-pack/plugins/graph/public/components/field_manager/_field_editor.scss +++ b/x-pack/plugins/graph/public/components/field_manager/_field_editor.scss @@ -1,11 +1,21 @@ .gphFieldEditor__badge { @include gphFieldBadgeSize; -} -.gphFieldEditor__badge--disabled, -.gphFieldEditor__badge--disabled:focus { - opacity: .7; - text-decoration: line-through; + &.gphFieldEditor__badge--disabled, + &.gphFieldEditor__badge--disabled:hover, + &.gphFieldEditor__badge--disabled:focus, + &.gphFieldEditor__badge--disabled:not(:disabled):hover + &.gphFieldEditor__badge--disabled:not(:disabled):focus { + opacity: .7; + text-decoration: line-through; + } + + // Chrome fix for focus: duplicate or Safari will ignore completely the disabled rule + &.gphFieldEditor__badge--disabled:focus:not(:focus-visible), + &.gphFieldEditor__badge--disabled:hover:not(:focus-visible) { + opacity: .7; + text-decoration: line-through; + } } .gphFieldEditor__badgeIcon { From 17ecb04dce72585f7ada69de7af3065cf4cc17d1 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Mon, 19 Apr 2021 09:43:43 -0400 Subject: [PATCH 31/82] [Fleet] Filter hosted policies from menu (#97380) ## Summary * 4C & 7C from https://github.com/elastic/kibana/issues/91906 about hiding hosted agent policy from select menus * Also changed reassign agent to new policy UI from flyout to modal as requested
Screenshots

Current

Screen Shot 2021-04-16 at 1 37 02 PM

PR

Screen Shot 2021-04-16 at 1 43 51 PM

current

Screen Shot 2021-04-16 at 1 44 41 PM

PR

Screen Shot 2021-04-16 at 1 50 28 PM

current

Screen Shot 2021-04-16 at 1 35 48 PM

PR

Screen Shot 2021-04-16 at 2 35 15 PM Screen Shot 2021-04-16 at 3 24 16 PM
### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/components/package_icon.tsx | 15 +- .../step_select_agent_policy.tsx | 6 +- .../components/actions_menu.tsx | 4 +- .../components/bulk_actions.tsx | 4 +- .../sections/agents/agent_list_page/index.tsx | 6 +- .../agent_enrollment_flyout/steps.tsx | 5 +- .../agent_reassign_policy_flyout/index.tsx | 175 ------------------ .../agent_reassign_policy_modal/index.tsx | 159 ++++++++++++++++ .../sections/agents/components/index.tsx | 2 +- 9 files changed, 189 insertions(+), 187 deletions(-) delete mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_reassign_policy_flyout/index.tsx create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_reassign_policy_modal/index.tsx diff --git a/x-pack/plugins/fleet/public/applications/fleet/components/package_icon.tsx b/x-pack/plugins/fleet/public/applications/fleet/components/package_icon.tsx index cb0b02527f756..e7fd1da394bb3 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/components/package_icon.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/components/package_icon.tsx @@ -14,7 +14,18 @@ import { usePackageIconType } from '../hooks'; export const PackageIcon: React.FunctionComponent< UsePackageIconType & Omit -> = ({ packageName, version, icons, tryApi, ...euiIconProps }) => { +> = ({ size = 's', packageName, version, icons, tryApi, ...euiIconProps }) => { const iconType = usePackageIconType({ packageName, version, icons, tryApi }); - return ; + return ( + + // this collides with some EuiText (+img) CSS from the EuiIcon component + // which makes the button large, wide, and poorly layed out + // override those styles until the bug is fixed or we find a better approach + style={{ margin: 'unset', width: 'unset' }} + size={size} + type={iconType} + {...euiIconProps} + /> + ); }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx index 53fab8bda4a8c..26d47cbff5b86 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx @@ -94,7 +94,11 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ sortOrder: 'asc', full: true, }); - const agentPolicies = useMemo(() => agentPoliciesData?.items || [], [agentPoliciesData?.items]); + const agentPolicies = useMemo( + () => agentPoliciesData?.items.filter((policy) => !policy.is_managed) || [], + [agentPoliciesData?.items] + ); + const agentPoliciesById = useMemo(() => { return agentPolicies.reduce((acc: { [key: string]: GetAgentPoliciesResponseItem }, policy) => { acc[policy.id] = policy; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx index e5ad131bd7e05..d814d2d0646a8 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx @@ -14,7 +14,7 @@ import { useCapabilities, useKibanaVersion } from '../../../../hooks'; import { ContextMenuActions } from '../../../../components'; import { AgentUnenrollAgentModal, - AgentReassignAgentPolicyFlyout, + AgentReassignAgentPolicyModal, AgentUpgradeAgentModal, } from '../../components'; import { useAgentRefresh } from '../hooks'; @@ -45,7 +45,7 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ <> {isReassignFlyoutOpen && ( - + )} {isUnenrollModalOpen && ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx index de27d5fada755..b59ef1f749fb2 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx @@ -22,7 +22,7 @@ import { FormattedMessage, FormattedNumber } from '@kbn/i18n/react'; import { SO_SEARCH_LIMIT } from '../../../../constants'; import type { Agent } from '../../../../types'; import { - AgentReassignAgentPolicyFlyout, + AgentReassignAgentPolicyModal, AgentUnenrollAgentModal, AgentUpgradeAgentModal, } from '../../components'; @@ -161,7 +161,7 @@ export const AgentBulkActions: React.FunctionComponent<{ <> {isReassignFlyoutOpen && ( - { setIsReassignFlyoutOpen(false); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index 6dd1b8a9693e8..b3c0cf93c88ef 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -41,7 +41,7 @@ import { AgentPolicySummaryLine, ContextMenuActions } from '../../../components' import { AgentStatusKueryHelper, isAgentUpgradeable } from '../../../services'; import { AGENT_SAVED_OBJECT_TYPE } from '../../../constants'; import { - AgentReassignAgentPolicyFlyout, + AgentReassignAgentPolicyModal, AgentHealth, AgentUnenrollAgentModal, AgentUpgradeAgentModal, @@ -379,7 +379,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { return ( - + {agentPolicy && } {showWarning && ( @@ -488,7 +488,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { ) : null} {agentToReassign && ( - { setAgentToReassign(undefined); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_enrollment_flyout/steps.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_enrollment_flyout/steps.tsx index 1d5e8cbfc5cd6..faa0461ed4773 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_enrollment_flyout/steps.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_enrollment_flyout/steps.tsx @@ -53,13 +53,16 @@ export const AgentPolicySelectionStep = ({ setSelectedAPIKeyId?: (key: string) => void; setSelectedPolicyId?: (policyId: string) => void; }) => { + const regularAgentPolicies = Array.isArray(agentPolicies) + ? agentPolicies.filter((policy) => policy && !policy.is_managed) + : []; return { title: i18n.translate('xpack.fleet.agentEnrollment.stepChooseAgentPolicyTitle', { defaultMessage: 'Choose an agent policy', }), children: ( void; - agents: Agent[] | string; -} - -export const AgentReassignAgentPolicyFlyout: React.FunctionComponent = ({ - onClose, - agents, -}) => { - const { notifications } = useStartServices(); - const isSingleAgent = Array.isArray(agents) && agents.length === 1; - - const [selectedAgentPolicyId, setSelectedAgentPolicyId] = useState( - isSingleAgent ? (agents[0] as Agent).policy_id : undefined - ); - const agentPoliciesRequest = useGetAgentPolicies({ - page: 1, - perPage: 1000, - }); - // eslint-disable-next-line react-hooks/exhaustive-deps - const agentPolicies = agentPoliciesRequest.data ? agentPoliciesRequest.data.items : []; - useEffect(() => { - if (!selectedAgentPolicyId && agentPolicies[0]) { - setSelectedAgentPolicyId(agentPolicies[0].id); - } - }, [agentPolicies, selectedAgentPolicyId]); - - const [isSubmitting, setIsSubmitting] = useState(false); - async function onSubmit() { - try { - setIsSubmitting(true); - if (!selectedAgentPolicyId) { - throw new Error('No selected agent policy id'); - } - const res = isSingleAgent - ? await sendPutAgentReassign((agents[0] as Agent).id, { - policy_id: selectedAgentPolicyId, - }) - : await sendPostBulkAgentReassign({ - policy_id: selectedAgentPolicyId, - agents: Array.isArray(agents) ? agents.map((agent) => agent.id) : agents, - }); - if (res.error) { - throw res.error; - } - setIsSubmitting(false); - const successMessage = i18n.translate( - 'xpack.fleet.agentReassignPolicy.successSingleNotificationTitle', - { - defaultMessage: 'Agent policy reassigned', - } - ); - notifications.toasts.addSuccess(successMessage); - onClose(); - } catch (error) { - setIsSubmitting(false); - notifications.toasts.addError(error, { - title: 'Unable to reassign agent policy', - }); - } - } - - return ( - - - -

- -

-
- - - - -
- - - - - ({ - value: agentPolicy.id, - text: agentPolicy.name, - }))} - value={selectedAgentPolicyId} - onChange={(e) => setSelectedAgentPolicyId(e.target.value)} - /> - - - - - - {selectedAgentPolicyId && ( - - )} - - - - - - - - - - - - - - - -
- ); -}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_reassign_policy_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_reassign_policy_modal/index.tsx new file mode 100644 index 0000000000000..8ee401d3c4ddf --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_reassign_policy_modal/index.tsx @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useEffect, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiConfirmModal, + EuiSpacer, + EuiFlexGroup, + EuiFlexItem, + EuiSelect, + EuiFormRow, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import type { Agent } from '../../../../types'; +import { + sendPutAgentReassign, + sendPostBulkAgentReassign, + useStartServices, + useGetAgentPolicies, +} from '../../../../hooks'; +import { AgentPolicyPackageBadges } from '../agent_policy_package_badges'; + +interface Props { + onClose: () => void; + agents: Agent[] | string; +} + +export const AgentReassignAgentPolicyModal: React.FunctionComponent = ({ + onClose, + agents, +}) => { + const { notifications } = useStartServices(); + const isSingleAgent = Array.isArray(agents) && agents.length === 1; + + const [selectedAgentPolicyId, setSelectedAgentPolicyId] = useState( + isSingleAgent ? (agents[0] as Agent).policy_id : undefined + ); + const agentPoliciesRequest = useGetAgentPolicies({ + page: 1, + perPage: 1000, + }); + // eslint-disable-next-line react-hooks/exhaustive-deps + const agentPolicies = agentPoliciesRequest.data ? agentPoliciesRequest.data.items : []; + useEffect(() => { + if (!selectedAgentPolicyId && agentPolicies[0]) { + setSelectedAgentPolicyId(agentPolicies[0].id); + } + }, [agentPolicies, selectedAgentPolicyId]); + + const policySelectOptions = useMemo(() => { + return agentPolicies + .filter((policy) => policy && !policy.is_managed) + .map((agentPolicy) => ({ + value: agentPolicy.id, + text: agentPolicy.name, + })); + }, [agentPolicies]); + + const [isSubmitting, setIsSubmitting] = useState(false); + async function onSubmit() { + try { + setIsSubmitting(true); + if (!selectedAgentPolicyId) { + throw new Error('No selected agent policy id'); + } + const res = isSingleAgent + ? await sendPutAgentReassign((agents[0] as Agent).id, { + policy_id: selectedAgentPolicyId, + }) + : await sendPostBulkAgentReassign({ + policy_id: selectedAgentPolicyId, + agents: Array.isArray(agents) ? agents.map((agent) => agent.id) : agents, + }); + if (res.error) { + throw res.error; + } + setIsSubmitting(false); + const successMessage = i18n.translate( + 'xpack.fleet.agentReassignPolicy.successSingleNotificationTitle', + { + defaultMessage: 'Agent policy reassigned', + } + ); + notifications.toasts.addSuccess(successMessage); + onClose(); + } catch (error) { + setIsSubmitting(false); + notifications.toasts.addError(error, { + title: 'Unable to reassign agent policy', + }); + } + } + + return ( + + } + onCancel={onClose} + onConfirm={onSubmit} + cancelButtonText={ + + } + confirmButtonDisabled={ + isSubmitting || (isSingleAgent && selectedAgentPolicyId === (agents[0] as Agent).policy_id) + } + confirmButtonText={ + + } + buttonColor="danger" + > +

+ +

+ + + + setSelectedAgentPolicyId(e.target.value)} + /> + + + + + + {selectedAgentPolicyId && } +
+ ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/index.tsx index 93425ba10413c..45f09c79d5533 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/index.tsx @@ -6,7 +6,7 @@ */ export * from './loading'; -export * from './agent_reassign_policy_flyout'; +export * from './agent_reassign_policy_modal'; export * from './agent_enrollment_flyout'; export * from './agent_health'; export * from './agent_unenroll_modal'; From efcf7d1a25f4df487829489b631edd39b75ae3e5 Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Mon, 19 Apr 2021 16:01:10 +0200 Subject: [PATCH 32/82] [Fleet] Don't fail on errors in 'update' or 'reupdate' operation in /setup (#97404) * Don't fail on, just report, update and reupdate errors. * Show error toast on update and reupdate errors. * Don't return empty error array. * Adjust mock. * Adjust test. --- .../plugins/fleet/common/types/models/epm.ts | 5 ++++ .../common/types/rest_spec/ingest_setup.ts | 3 ++ .../fleet/public/applications/fleet/app.tsx | 7 +++++ .../server/routes/setup/handlers.test.ts | 6 +++- .../fleet/server/routes/setup/handlers.ts | 10 +++++-- .../epm/packages/bulk_install_packages.ts | 12 ++++++-- .../ensure_installed_default_packages.test.ts | 2 +- .../server/services/epm/packages/install.ts | 28 ++++++++++++++++--- x-pack/plugins/fleet/server/services/setup.ts | 13 ++++++--- 9 files changed, 72 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 1a594e77f4857..eab13fe5819f9 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -30,6 +30,11 @@ export enum InstallStatus { uninstalling = 'uninstalling', } +export interface DefaultPackagesInstallationError { + installType: InstallType; + error: Error; +} + export type InstallType = 'reinstall' | 'reupdate' | 'rollback' | 'update' | 'install' | 'unknown'; export type InstallSource = 'registry' | 'upload'; diff --git a/x-pack/plugins/fleet/common/types/rest_spec/ingest_setup.ts b/x-pack/plugins/fleet/common/types/rest_spec/ingest_setup.ts index 2180b66908498..6f64f1c48336d 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/ingest_setup.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/ingest_setup.ts @@ -5,7 +5,10 @@ * 2.0. */ +import type { DefaultPackagesInstallationError } from '../models/epm'; + export interface PostIngestSetupResponse { isInitialized: boolean; preconfigurationError?: { name: string; message: string }; + nonFatalPackageUpgradeErrors?: DefaultPackagesInstallationError[]; } diff --git a/x-pack/plugins/fleet/public/applications/fleet/app.tsx b/x-pack/plugins/fleet/public/applications/fleet/app.tsx index 5663bd4768d5c..f2eee6228906a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/app.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/app.tsx @@ -90,6 +90,13 @@ export const WithPermissionsAndSetup: React.FC = memo(({ children }) => { }), }); } + if (setupResponse.data.nonFatalPackageUpgradeErrors) { + notifications.toasts.addError(setupResponse.data.nonFatalPackageUpgradeErrors, { + title: i18n.translate('xpack.fleet.setup.nonFatalPackageErrorsTitle', { + defaultMessage: 'One or more packages could not be successfully upgraded', + }), + }); + } } catch (err) { setInitializationError(err); } diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts index 2cf9bbc3b91e3..fd32d699ae45e 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts @@ -46,7 +46,11 @@ describe('FleetSetupHandler', () => { it('POST /setup succeeds w/200 and body of resolved value', async () => { mockSetupIngestManager.mockImplementation(() => - Promise.resolve({ isInitialized: true, preconfigurationError: undefined }) + Promise.resolve({ + isInitialized: true, + preconfigurationError: undefined, + nonFatalPackageUpgradeErrors: [], + }) ); await fleetSetupHandler(context, request, response); diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.ts index b6aa9e29de9ee..a6d7acccfb4fe 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.ts @@ -46,8 +46,14 @@ export const fleetSetupHandler: RequestHandler = async (context, request, respon try { const soClient = context.core.savedObjects.client; const esClient = context.core.elasticsearch.client.asCurrentUser; - const body: PostIngestSetupResponse = { isInitialized: true }; - await setupIngestManager(soClient, esClient); + const setupStatus = await setupIngestManager(soClient, esClient); + const body: PostIngestSetupResponse = { + isInitialized: true, + }; + + if (setupStatus.nonFatalPackageUpgradeErrors.length > 0) { + body.nonFatalPackageUpgradeErrors = setupStatus.nonFatalPackageUpgradeErrors; + } return response.ok({ body, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts index baaaaf6c6b0cf..2c5b072aa3979 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts @@ -45,7 +45,11 @@ export async function bulkInstallPackages({ skipPostInstall: true, }); if (installResult.error) { - return { name: packageName, error: installResult.error }; + return { + name: packageName, + error: installResult.error, + installType: installResult.installType, + }; } else { return { name: packageName, @@ -75,7 +79,11 @@ export async function bulkInstallPackages({ const packageName = packagesToInstall[index]; if (result.status === 'fulfilled') { if (result.value && result.value.error) { - return { name: packageName, error: result.value.error }; + return { + name: packageName, + error: result.value.error, + installType: result.value.installType, + }; } else { return result.value; } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts index f8c91e55fbbb6..60e2e5ea2cbf8 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts @@ -84,7 +84,7 @@ describe('ensureInstalledDefaultPackages', () => { ]; }); const resp = await ensureInstalledDefaultPackages(soClient, jest.fn()); - expect(resp).toEqual([mockInstallation.attributes]); + expect(resp.installations).toEqual([mockInstallation.attributes]); }); it('should throw the first Error it finds', async () => { class SomeCustomError extends Error {} diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 31d0732096790..ec1cc322475b0 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -12,7 +12,12 @@ import type { ElasticsearchClient, SavedObject, SavedObjectsClientContract } fro import { generateESIndexPatterns } from '../elasticsearch/template/template'; import { defaultPackages } from '../../../../common'; -import type { BulkInstallPackageInfo, InstallablePackage, InstallSource } from '../../../../common'; +import type { + BulkInstallPackageInfo, + InstallablePackage, + InstallSource, + DefaultPackagesInstallationError, +} from '../../../../common'; import { IngestManagerError, PackageOperationNotSupportedError, @@ -45,11 +50,17 @@ import { removeInstallation } from './remove'; import { getPackageSavedObjects } from './get'; import { _installPackage } from './_install_package'; +export interface DefaultPackagesInstallationResult { + installations: Installation[]; + nonFatalPackageUpgradeErrors: DefaultPackagesInstallationError[]; +} + export async function ensureInstalledDefaultPackages( savedObjectsClient: SavedObjectsClientContract, esClient: ElasticsearchClient -): Promise { +): Promise { const installations = []; + const nonFatalPackageUpgradeErrors = []; const bulkResponse = await bulkInstallPackages({ savedObjectsClient, packagesToInstall: Object.values(defaultPackages), @@ -58,19 +69,27 @@ export async function ensureInstalledDefaultPackages( for (const resp of bulkResponse) { if (isBulkInstallError(resp)) { - throw resp.error; + if (resp.installType && (resp.installType === 'update' || resp.installType === 'reupdate')) { + nonFatalPackageUpgradeErrors.push({ installType: resp.installType, error: resp.error }); + } else { + throw resp.error; + } } else { installations.push(getInstallation({ savedObjectsClient, pkgName: resp.name })); } } const retrievedInstallations = await Promise.all(installations); - return retrievedInstallations.map((installation, index) => { + const verifiedInstallations = retrievedInstallations.map((installation, index) => { if (!installation) { throw new Error(`could not get installation ${bulkResponse[index].name}`); } return installation; }); + return { + installations: verifiedInstallations, + nonFatalPackageUpgradeErrors, + }; } async function isPackageVersionOrLaterInstalled(options: { @@ -181,6 +200,7 @@ export async function handleInstallPackageFailure({ export interface IBulkInstallPackageError { name: string; error: Error; + installType?: InstallType; } export type BulkInstallResponse = BulkInstallPackageInfo | IBulkInstallPackageError; diff --git a/x-pack/plugins/fleet/server/services/setup.ts b/x-pack/plugins/fleet/server/services/setup.ts index c906dc73e6df2..de6876c7f6fda 100644 --- a/x-pack/plugins/fleet/server/services/setup.ts +++ b/x-pack/plugins/fleet/server/services/setup.ts @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { DEFAULT_AGENT_POLICIES_PACKAGES, FLEET_SERVER_PACKAGE } from '../../common'; -import type { PackagePolicy } from '../../common'; +import type { PackagePolicy, DefaultPackagesInstallationError } from '../../common'; import { SO_SEARCH_LIMIT } from '../constants'; @@ -33,6 +33,7 @@ import { awaitIfFleetServerSetupPending } from './fleet_server'; export interface SetupStatus { isInitialized: boolean; preconfigurationError: { name: string; message: string } | undefined; + nonFatalPackageUpgradeErrors: DefaultPackagesInstallationError[]; } export async function setupIngestManager( @@ -46,7 +47,7 @@ async function createSetupSideEffects( soClient: SavedObjectsClientContract, esClient: ElasticsearchClient ): Promise { - const [installedPackages, defaultOutput] = await Promise.all([ + const [defaultPackagesResult, defaultOutput] = await Promise.all([ // packages installed by default ensureInstalledDefaultPackages(soClient, esClient), outputService.ensureDefaultOutput(soClient), @@ -142,7 +143,7 @@ async function createSetupSideEffects( ); } - for (const installedPackage of installedPackages) { + for (const installedPackage of defaultPackagesResult.installations) { const packageShouldBeInstalled = DEFAULT_AGENT_POLICIES_PACKAGES.some( (packageName) => installedPackage.name === packageName ); @@ -172,7 +173,11 @@ async function createSetupSideEffects( await ensureAgentActionPolicyChangeExists(soClient, esClient); - return { isInitialized: true, preconfigurationError }; + return { + isInitialized: true, + preconfigurationError, + nonFatalPackageUpgradeErrors: defaultPackagesResult.nonFatalPackageUpgradeErrors, + }; } export async function ensureDefaultEnrollmentAPIKeysExists( From 7c5f41e171625bf4ebda1075241e5690f03c47e3 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 19 Apr 2021 16:13:03 +0200 Subject: [PATCH 33/82] [Discover] Unskip functional saved queries test --- test/functional/apps/discover/_saved_queries.ts | 7 +------ .../services/saved_query_management_component.ts | 15 +++++++-------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/test/functional/apps/discover/_saved_queries.ts b/test/functional/apps/discover/_saved_queries.ts index 1d65b9a68bd4d..a7374c8128630 100644 --- a/test/functional/apps/discover/_saved_queries.ts +++ b/test/functional/apps/discover/_saved_queries.ts @@ -26,8 +26,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const savedQueryManagementComponent = getService('savedQueryManagementComponent'); const testSubjects = getService('testSubjects'); - // Failing: See https://github.com/elastic/kibana/issues/89477 - describe.skip('saved queries saved objects', function describeIndexTests() { + describe('saved queries saved objects', function describeIndexTests() { before(async function () { log.debug('load kibana index with default index pattern'); await esArchiver.load('discover'); @@ -134,10 +133,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await savedQueryManagementComponent.saveNewQueryWithNameError('OkResponse'); }); - it('does not allow saving a query with leading or trailing whitespace in the name', async () => { - await savedQueryManagementComponent.saveNewQueryWithNameError('OkResponse '); - }); - it('resets any changes to a loaded query on reloading the same saved query', async () => { await savedQueryManagementComponent.loadSavedQuery('OkResponse'); await queryBar.setQuery('response:503'); diff --git a/test/functional/services/saved_query_management_component.ts b/test/functional/services/saved_query_management_component.ts index 7398e6ca8c12e..d4fa34f224547 100644 --- a/test/functional/services/saved_query_management_component.ts +++ b/test/functional/services/saved_query_management_component.ts @@ -50,15 +50,14 @@ export function SavedQueryManagementComponentProvider({ // an error. await testSubjects.click('savedQueryFormSaveButton'); - const saveQueryFormSaveButtonStatus = await testSubjects.isEnabled( - 'savedQueryFormSaveButton' - ); + await retry.waitForWithTimeout('save button to be disabled', 1000, async () => { + const saveQueryFormSaveButtonStatus = await testSubjects.isEnabled( + 'savedQueryFormSaveButton' + ); + return saveQueryFormSaveButtonStatus === false; + }); - try { - expect(saveQueryFormSaveButtonStatus).to.not.eql(true); - } finally { - await testSubjects.click('savedQueryFormCancelButton'); - } + await testSubjects.click('savedQueryFormCancelButton'); } public async saveCurrentlyLoadedAsNewQuery( From 92eb85f12175e1526b91a62afee5da5875b9cfdc Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 19 Apr 2021 16:29:47 +0200 Subject: [PATCH 34/82] Added rison-node to kibana shared deps. (#97417) --- packages/kbn-ui-shared-deps/entry.js | 1 + packages/kbn-ui-shared-deps/index.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/kbn-ui-shared-deps/entry.js b/packages/kbn-ui-shared-deps/entry.js index f14c793d22a09..4029ce28faf5b 100644 --- a/packages/kbn-ui-shared-deps/entry.js +++ b/packages/kbn-ui-shared-deps/entry.js @@ -49,3 +49,4 @@ export const TsLib = require('tslib'); export const KbnAnalytics = require('@kbn/analytics'); export const KbnStd = require('@kbn/std'); export const SaferLodashSet = require('@elastic/safer-lodash-set'); +export const RisonNode = require('rison-node'); diff --git a/packages/kbn-ui-shared-deps/index.js b/packages/kbn-ui-shared-deps/index.js index 0542bc89ff9e4..62ddb09d25add 100644 --- a/packages/kbn-ui-shared-deps/index.js +++ b/packages/kbn-ui-shared-deps/index.js @@ -60,5 +60,6 @@ exports.externals = { '@kbn/analytics': '__kbnSharedDeps__.KbnAnalytics', '@kbn/std': '__kbnSharedDeps__.KbnStd', '@elastic/safer-lodash-set': '__kbnSharedDeps__.SaferLodashSet', + 'rison-node': '__kbnSharedDeps__.RisonNode', }; exports.publicPathLoader = require.resolve('./public_path_loader'); From a2620f1c475b910611caffbae67ec7806e88b618 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 19 Apr 2021 16:35:15 +0200 Subject: [PATCH 35/82] [Lens] improve handling of mixed axes (#97236) --- .../xy_visualization/expression.test.tsx | 53 +++++++++++++++++++ .../public/xy_visualization/expression.tsx | 34 ++++++++---- .../test/functional/apps/lens/chart_data.ts | 6 +-- 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx index 2487ddf32cd1f..e1dbd4da4b902 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx @@ -822,6 +822,59 @@ describe('xy_expression', () => { }); }); + test('returns correct original data for ordinal x axis with special formatter', () => { + const geometry: GeometryValue = { x: 'BAR', y: 1, accessor: 'y1', mark: null, datum: {} }; + const series = { + key: 'spec{d}yAccessor{d}splitAccessors{b-2}', + specId: 'd', + yAccessor: 'a', + splitAccessors: {}, + seriesKeys: ['a'], + }; + + const { args, data } = sampleArgs(); + + convertSpy.mockImplementation((x) => (typeof x === 'string' ? x.toUpperCase() : x)); + + const wrapper = mountWithIntl( + + ); + + wrapper.find(Settings).first().prop('onElementClick')!([ + [geometry, series as XYChartSeriesIdentifier], + ]); + + expect(onClickValue).toHaveBeenCalledWith({ + data: [ + { + column: 3, + row: 1, + table: data.tables.first, + value: 'Bar', + }, + ], + }); + }); + test('onElementClick is not triggering event on noInteractivity mode', () => { const { args, data } = sampleArgs(); diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.tsx index a78d86b3f864c..47b8dbfc15f53 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.tsx @@ -456,19 +456,27 @@ export function XYChart({ const table = data.tables[layer.layerId]; + const xColumn = table.columns.find((col) => col.id === layer.xAccessor); + const currentXFormatter = + layer.xAccessor && layersAlreadyFormatted[layer.xAccessor] && xColumn + ? formatFactory(xColumn.meta.params) + : xAxisFormatter; + + const rowIndex = table.rows.findIndex((row) => { + if (layer.xAccessor) { + if (layersAlreadyFormatted[layer.xAccessor]) { + // stringify the value to compare with the chart value + return currentXFormatter.convert(row[layer.xAccessor]) === xyGeometry.x; + } + return row[layer.xAccessor] === xyGeometry.x; + } + }); + const points = [ { - row: table.rows.findIndex((row) => { - if (layer.xAccessor) { - if (layersAlreadyFormatted[layer.xAccessor]) { - // stringify the value to compare with the chart value - return xAxisFormatter.convert(row[layer.xAccessor]) === xyGeometry.x; - } - return row[layer.xAccessor] === xyGeometry.x; - } - }), + row: rowIndex, column: table.columns.findIndex((col) => col.id === layer.xAccessor), - value: xyGeometry.x, + value: layer.xAccessor ? table.rows[rowIndex][layer.xAccessor] : xyGeometry.x, }, ]; @@ -626,7 +634,11 @@ export function XYChart({ const newRow = { ...row }; for (const column of table.columns) { const record = newRow[column.id]; - if (record && !isPrimitive(record)) { + if ( + record && + // pre-format values for ordinal x axes because there can only be a single x axis formatter on chart level + (!isPrimitive(record) || (column.id === xAccessor && xScaleType === 'ordinal')) + ) { newRow[column.id] = formatFactory(column.meta.params).convert(record); } } diff --git a/x-pack/test/functional/apps/lens/chart_data.ts b/x-pack/test/functional/apps/lens/chart_data.ts index 887906ce2205b..b87d4e999d597 100644 --- a/x-pack/test/functional/apps/lens/chart_data.ts +++ b/x-pack/test/functional/apps/lens/chart_data.ts @@ -42,7 +42,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { { x: '78.83.247.30', y: 17246 }, { x: '226.82.228.233', y: 15687 }, { x: '93.28.27.24', y: 15614.33 }, - { x: '__other__', y: 5722.77 }, + { x: 'Other', y: 5722.77 }, ]; function assertMatchesExpectedData(state: DebugState) { @@ -91,9 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const values = await Promise.all( range(0, 6).map((index) => PageObjects.lens.getDatatableCellText(index, 1)) ); - expect(terms.map((term) => (term === 'Other' ? '__other__' : term))).to.eql( - expectedData.map(({ x }) => x) - ); + expect(terms).to.eql(expectedData.map(({ x }) => x)); expect(values.map((value) => Math.floor(100 * Number(value.replace(',', ''))) / 100)).to.eql( expectedData.map(({ y }) => y) ); From f1bc11e2fa183267e0e01692b908ffdbe5020aab Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Mon, 19 Apr 2021 17:50:17 +0200 Subject: [PATCH 36/82] add FTR test for aborted requests error name (#97086) * add FTR test for aborted requests error name * delete unused file * wait for the request to fire before cancellation --- .../plugins/core_http/kibana.json | 8 ++++ .../plugins/core_http/package.json | 14 ++++++ .../plugins/core_http/public/index.ts | 13 ++++++ .../plugins/core_http/public/plugin.tsx | 46 +++++++++++++++++++ .../plugins/core_http/server/index.ts | 11 +++++ .../plugins/core_http/server/plugin.ts | 30 ++++++++++++ .../plugins/core_http/tsconfig.json | 18 ++++++++ .../plugins/core_provider_plugin/kibana.json | 8 +++- .../test_suites/core_plugins/http.ts | 33 +++++++++++++ .../test_suites/core_plugins/index.ts | 1 + 10 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 test/plugin_functional/plugins/core_http/kibana.json create mode 100644 test/plugin_functional/plugins/core_http/package.json create mode 100644 test/plugin_functional/plugins/core_http/public/index.ts create mode 100644 test/plugin_functional/plugins/core_http/public/plugin.tsx create mode 100644 test/plugin_functional/plugins/core_http/server/index.ts create mode 100644 test/plugin_functional/plugins/core_http/server/plugin.ts create mode 100644 test/plugin_functional/plugins/core_http/tsconfig.json create mode 100644 test/plugin_functional/test_suites/core_plugins/http.ts diff --git a/test/plugin_functional/plugins/core_http/kibana.json b/test/plugin_functional/plugins/core_http/kibana.json new file mode 100644 index 0000000000000..69855f59d64b7 --- /dev/null +++ b/test/plugin_functional/plugins/core_http/kibana.json @@ -0,0 +1,8 @@ +{ + "id": "coreHttp", + "version": "0.0.1", + "kibanaVersion": "kibana", + "configPath": ["core_http"], + "server": true, + "ui": true +} diff --git a/test/plugin_functional/plugins/core_http/package.json b/test/plugin_functional/plugins/core_http/package.json new file mode 100644 index 0000000000000..fd0e80d3c1822 --- /dev/null +++ b/test/plugin_functional/plugins/core_http/package.json @@ -0,0 +1,14 @@ +{ + "name": "core_http", + "version": "1.0.0", + "main": "target/test/plugin_functional/plugins/core_http", + "kibana": { + "version": "kibana", + "templateVersion": "1.0.0" + }, + "license": "SSPL-1.0 OR Elastic License 2.0", + "scripts": { + "kbn": "node ../../../../scripts/kbn.js", + "build": "rm -rf './target' && ../../../../node_modules/.bin/tsc" + } +} \ No newline at end of file diff --git a/test/plugin_functional/plugins/core_http/public/index.ts b/test/plugin_functional/plugins/core_http/public/index.ts new file mode 100644 index 0000000000000..7b353cb1d2905 --- /dev/null +++ b/test/plugin_functional/plugins/core_http/public/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { PluginInitializer } from 'kibana/public'; +import { CoreHttpPlugin, CoreHttpPluginSetup, CoreHttpPluginStart } from './plugin'; + +export const plugin: PluginInitializer = () => + new CoreHttpPlugin(); diff --git a/test/plugin_functional/plugins/core_http/public/plugin.tsx b/test/plugin_functional/plugins/core_http/public/plugin.tsx new file mode 100644 index 0000000000000..64b59847ffd1b --- /dev/null +++ b/test/plugin_functional/plugins/core_http/public/plugin.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Plugin, CoreSetup } from 'kibana/public'; + +export class CoreHttpPlugin implements Plugin { + public setup({ http }: CoreSetup, deps: {}) { + const tryRequestCancellation = async () => { + const abortController = new AbortController(); + + const errorNamePromise = http + .get('/api/core_http/never_reply', { signal: abortController.signal }) + .then( + () => { + return undefined; + }, + (e) => { + return e.name; + } + ); + + // simulating 'real' cancellation by awaiting a bit + window.setTimeout(() => { + abortController.abort(); + }, 100); + + return errorNamePromise; + }; + + return { + tryRequestCancellation, + }; + } + + public start() {} + + public stop() {} +} + +export type CoreHttpPluginSetup = ReturnType; +export type CoreHttpPluginStart = ReturnType; diff --git a/test/plugin_functional/plugins/core_http/server/index.ts b/test/plugin_functional/plugins/core_http/server/index.ts new file mode 100644 index 0000000000000..66c2bb9e676f3 --- /dev/null +++ b/test/plugin_functional/plugins/core_http/server/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CoreHttpPlugin } from './plugin'; + +export const plugin = () => new CoreHttpPlugin(); diff --git a/test/plugin_functional/plugins/core_http/server/plugin.ts b/test/plugin_functional/plugins/core_http/server/plugin.ts new file mode 100644 index 0000000000000..533e3b22b368b --- /dev/null +++ b/test/plugin_functional/plugins/core_http/server/plugin.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Plugin, CoreSetup } from 'kibana/server'; + +export class CoreHttpPlugin implements Plugin { + public setup(core: CoreSetup, deps: {}) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/core_http/never_reply', + validate: false, + }, + async (ctx, req, res) => { + // need the endpoint to never reply to test request cancelation on the client side. + await new Promise(() => undefined); + return res.ok(); + } + ); + } + + public start() {} + + public stop() {} +} diff --git a/test/plugin_functional/plugins/core_http/tsconfig.json b/test/plugin_functional/plugins/core_http/tsconfig.json new file mode 100644 index 0000000000000..3d9d8ca9451d4 --- /dev/null +++ b/test/plugin_functional/plugins/core_http/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../../typings/**/*", + ], + "exclude": [], + "references": [ + { "path": "../../../../src/core/tsconfig.json" } + ] +} diff --git a/test/plugin_functional/plugins/core_provider_plugin/kibana.json b/test/plugin_functional/plugins/core_provider_plugin/kibana.json index c55f62762e233..b3009b07de0a0 100644 --- a/test/plugin_functional/plugins/core_provider_plugin/kibana.json +++ b/test/plugin_functional/plugins/core_provider_plugin/kibana.json @@ -2,7 +2,13 @@ "id": "coreProviderPlugin", "version": "0.0.1", "kibanaVersion": "kibana", - "optionalPlugins": ["corePluginA", "corePluginB", "licensing", "globalSearchTest"], + "optionalPlugins": [ + "corePluginA", + "corePluginB", + "coreHttp", + "licensing", + "globalSearchTest" + ], "server": false, "ui": true } diff --git a/test/plugin_functional/test_suites/core_plugins/http.ts b/test/plugin_functional/test_suites/core_plugins/http.ts new file mode 100644 index 0000000000000..78682da70e608 --- /dev/null +++ b/test/plugin_functional/test_suites/core_plugins/http.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import expect from '@kbn/expect'; +import { PluginFunctionalProviderContext } from '../../services'; + +export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { + const PageObjects = getPageObjects(['common']); + const browser = getService('browser'); + + const getCancelationErrorName = async () => { + return await browser.executeAsync(async (cb) => { + const errorName = await window._coreProvider.setup.plugins.coreHttp.tryRequestCancellation(); + cb(errorName); + }); + }; + + describe('http requests', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('home'); + }); + + it('returns correct name for aborted requests', async () => { + const canceledErrorName = await getCancelationErrorName(); + expect(canceledErrorName).to.eql('AbortError'); + }); + }); +} diff --git a/test/plugin_functional/test_suites/core_plugins/index.ts b/test/plugin_functional/test_suites/core_plugins/index.ts index 3f26b317b81ed..25868ac9a62db 100644 --- a/test/plugin_functional/test_suites/core_plugins/index.ts +++ b/test/plugin_functional/test_suites/core_plugins/index.ts @@ -21,5 +21,6 @@ export default function ({ loadTestFile }: PluginFunctionalProviderContext) { loadTestFile(require.resolve('./rendering')); loadTestFile(require.resolve('./chrome_help_menu_links')); loadTestFile(require.resolve('./history_block')); + loadTestFile(require.resolve('./http')); }); } From 4ab22f933605e33c543cba781585e6afba421749 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 19 Apr 2021 09:57:50 -0600 Subject: [PATCH 37/82] [Maps] add visibility toggle and fit to bounds buttons to layer quick actions menu. (#97013) * hover actions * clean up * tslint, i18n, and snapshot fixes * update jest snapshot Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../layer_toc/__snapshots__/view.test.js.snap | 2 + .../toc_entry/__snapshots__/view.test.js.snap | 43 ++++++++++-- .../layer_toc/toc_entry/action_labels.ts | 33 +++++++++ .../layer_toc/toc_entry/index.js | 8 +++ .../toc_entry_actions_popover.test.tsx | 16 ++--- .../toc_entry_actions_popover.tsx | 53 ++++---------- .../layer_control/layer_toc/toc_entry/view.js | 70 ++++++++++++++----- .../layer_control/layer_toc/view.test.js | 6 ++ .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 10 files changed, 160 insertions(+), 77 deletions(-) create mode 100644 x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/action_labels.ts diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/__snapshots__/view.test.js.snap b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/__snapshots__/view.test.js.snap index beacaaecbf7f8..fbd83ed145a08 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/__snapshots__/view.test.js.snap +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/__snapshots__/view.test.js.snap @@ -26,6 +26,7 @@ exports[`LayerTOC props isReadOnly 1`] = ` layer={ Object { "getId": [Function], + "supportsFitToBounds": [Function], } } /> @@ -34,6 +35,7 @@ exports[`LayerTOC props isReadOnly 1`] = ` layer={ Object { "getId": [Function], + "supportsFitToBounds": [Function], } } /> diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/__snapshots__/view.test.js.snap b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/__snapshots__/view.test.js.snap index f711549d87316..b43d740e72907 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/__snapshots__/view.test.js.snap +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/__snapshots__/view.test.js.snap @@ -25,10 +25,17 @@ exports[`TOCEntry is rendered 1`] = ` "showAtZoomLevel": [Function], } } + supportsFitToBounds={false} />
+ @@ -88,10 +94,17 @@ exports[`TOCEntry props Should shade background when not selected layer 1`] = ` "showAtZoomLevel": [Function], } } + supportsFitToBounds={false} />
+ @@ -151,10 +163,17 @@ exports[`TOCEntry props Should shade background when selected layer 1`] = ` "showAtZoomLevel": [Function], } } + supportsFitToBounds={false} />
+ @@ -214,7 +232,18 @@ exports[`TOCEntry props isReadOnly 1`] = ` "showAtZoomLevel": [Function], } } + supportsFitToBounds={false} /> +
+ +
+ diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/action_labels.ts b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/action_labels.ts new file mode 100644 index 0000000000000..74d4b205bfdf2 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/action_labels.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export function getVisibilityToggleIcon(isVisible: boolean) { + return isVisible ? 'eyeClosed' : 'eye'; +} + +export function getVisibilityToggleLabel(isVisible: boolean) { + return isVisible + ? i18n.translate('xpack.maps.layerTocActions.hideLayerTitle', { + defaultMessage: 'Hide layer', + }) + : i18n.translate('xpack.maps.layerTocActions.showLayerTitle', { + defaultMessage: 'Show layer', + }); +} + +export const EDIT_LAYER_LABEL = i18n.translate( + 'xpack.maps.layerControl.layerTocActions.editButtonLabel', + { + defaultMessage: 'Edit layer', + } +); + +export const FIT_TO_DATA_LABEL = i18n.translate('xpack.maps.layerTocActions.fitToDataTitle', { + defaultMessage: 'Fit to data', +}); diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/index.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/index.js index 85e9c242bf4bf..ee7922a579c34 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/index.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/index.js @@ -19,10 +19,12 @@ import { getFlyoutDisplay, } from '../../../../../selectors/ui_selectors'; import { + fitToLayerExtent, setSelectedLayer, updateFlyout, hideTOCDetails, showTOCDetails, + toggleLayerVisible, } from '../../../../../actions'; function mapStateToProps(state = {}, ownProps) { @@ -40,6 +42,9 @@ function mapStateToProps(state = {}, ownProps) { function mapDispatchToProps(dispatch) { return { + fitToBounds: (layerId) => { + dispatch(fitToLayerExtent(layerId)); + }, openLayerPanel: async (layerId) => { await dispatch(setSelectedLayer(layerId)); dispatch(updateFlyout(FLYOUT_STATE.LAYER_PANEL)); @@ -50,6 +55,9 @@ function mapDispatchToProps(dispatch) { showTOCDetails: (layerId) => { dispatch(showTOCDetails(layerId)); }, + toggleVisible: (layerId) => { + dispatch(toggleLayerVisible(layerId)); + }, }; } diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx index b1afb72750dab..dd85d6dd1eb6e 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx @@ -14,8 +14,6 @@ import { AbstractSource, ISource } from '../../../../../../classes/sources/sourc import { TOCEntryActionsPopover } from './toc_entry_actions_popover'; -let supportsFitToBounds: boolean; - class MockSource extends AbstractSource implements ISource {} class LayerMock extends AbstractLayer implements ILayer { @@ -31,10 +29,6 @@ class LayerMock extends AbstractLayer implements ILayer { super({ layerDescriptor, source }); } - async supportsFitToBounds(): Promise { - return supportsFitToBounds; - } - isVisible() { return true; } @@ -51,13 +45,10 @@ const defaultProps = { layer: new LayerMock(), removeLayer: () => {}, toggleVisible: () => {}, + supportsFitToBounds: true, }; describe('TOCEntryActionsPopover', () => { - beforeEach(() => { - supportsFitToBounds = true; - }); - test('is rendered', async () => { const component = shallow(); @@ -81,8 +72,9 @@ describe('TOCEntryActionsPopover', () => { }); test('should disable fit to data when supportsFitToBounds is false', async () => { - supportsFitToBounds = false; - const component = shallow(); + const component = shallow( + + ); // Ensure all promises resolve await new Promise((resolve) => process.nextTick(resolve)); diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx index 8127bd1e41283..3cd719f0b9447 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx @@ -11,6 +11,12 @@ import { EuiPopover, EuiContextMenu, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ILayer } from '../../../../../../classes/layers/layer'; import { TOCEntryButton } from '../toc_entry_button'; +import { + getVisibilityToggleIcon, + getVisibilityToggleLabel, + EDIT_LAYER_LABEL, + FIT_TO_DATA_LABEL, +} from '../action_labels'; export interface Props { cloneLayer: (layerId: string) => void; @@ -22,37 +28,16 @@ export interface Props { isReadOnly: boolean; layer: ILayer; removeLayer: (layerId: string) => void; + supportsFitToBounds: boolean; toggleVisible: (layerId: string) => void; } interface State { isPopoverOpen: boolean; - supportsFitToBounds: boolean; } export class TOCEntryActionsPopover extends Component { - private _isMounted: boolean = false; - - state = { - isPopoverOpen: false, - supportsFitToBounds: false, - }; - - componentDidMount() { - this._isMounted = true; - this._loadSupportsFitToBounds(); - } - - componentWillUnmount() { - this._isMounted = false; - } - - async _loadSupportsFitToBounds() { - const supportsFitToBounds = await this.props.layer.supportsFitToBounds(); - if (this._isMounted) { - this.setState({ supportsFitToBounds }); - } - } + state: State = { isPopoverOpen: false }; _togglePopover = () => { this.setState((prevState) => ({ @@ -85,31 +70,23 @@ export class TOCEntryActionsPopover extends Component { _getActionsPanel() { const actionItems = [ { - name: i18n.translate('xpack.maps.layerTocActions.fitToDataTitle', { - defaultMessage: 'Fit to data', - }), + name: FIT_TO_DATA_LABEL, icon: , 'data-test-subj': 'fitToBoundsButton', - toolTipContent: this.state.supportsFitToBounds + toolTipContent: this.props.supportsFitToBounds ? null : i18n.translate('xpack.maps.layerTocActions.noFitSupportTooltip', { defaultMessage: 'Layer does not support fit to data', }), - disabled: !this.state.supportsFitToBounds, + disabled: !this.props.supportsFitToBounds, onClick: () => { this._closePopover(); this._fitToBounds(); }, }, { - name: this.props.layer.isVisible() - ? i18n.translate('xpack.maps.layerTocActions.hideLayerTitle', { - defaultMessage: 'Hide layer', - }) - : i18n.translate('xpack.maps.layerTocActions.showLayerTitle', { - defaultMessage: 'Show layer', - }), - icon: , + name: getVisibilityToggleLabel(this.props.layer.isVisible()), + icon: , 'data-test-subj': 'layerVisibilityToggleButton', toolTipContent: null, onClick: () => { @@ -122,9 +99,7 @@ export class TOCEntryActionsPopover extends Component { if (!this.props.isReadOnly) { actionItems.push({ disabled: this.props.isEditButtonDisabled, - name: i18n.translate('xpack.maps.layerTocActions.editLayerTitle', { - defaultMessage: 'Edit layer', - }), + name: EDIT_LAYER_LABEL, icon: , 'data-test-subj': 'editLayerButton', toolTipContent: null, diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/view.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/view.js index 9e5a6080c830d..b886dd21030ba 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/view.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/view.js @@ -11,6 +11,12 @@ import classNames from 'classnames'; import { EuiIcon, EuiButtonIcon, EuiConfirmModal } from '@elastic/eui'; import { TOCEntryActionsPopover } from './toc_entry_actions_popover'; import { i18n } from '@kbn/i18n'; +import { + getVisibilityToggleIcon, + getVisibilityToggleLabel, + EDIT_LAYER_LABEL, + FIT_TO_DATA_LABEL, +} from './action_labels'; function escapeLayerName(name) { return name ? name.split(' ').join('_') : ''; @@ -21,12 +27,14 @@ export class TOCEntry extends React.Component { displayName: null, hasLegendDetails: false, shouldShowModal: false, + supportsFitToBounds: false, }; componentDidMount() { this._isMounted = true; this._updateDisplayName(); this._loadHasLegendDetails(); + this._loadSupportsFitToBounds(); } componentWillUnmount() { @@ -46,6 +54,13 @@ export class TOCEntry extends React.Component { } }; + async _loadSupportsFitToBounds() { + const supportsFitToBounds = await this.props.layer.supportsFitToBounds(); + if (this._isMounted) { + this.setState({ supportsFitToBounds }); + } + } + async _loadHasLegendDetails() { const hasLegendDetails = (await this.props.layer.hasLegendDetails()) && @@ -83,6 +98,14 @@ export class TOCEntry extends React.Component { this.props.openLayerPanel(this.props.layer.getId()); }; + _fitToBounds = () => { + this.props.fitToBounds(this.props.layer.getId()); + }; + + _toggleVisible = () => { + this.props.toggleVisible(this.props.layer.getId()); + }; + _renderCancelModal() { if (!this.state.shouldShowModal) { return null; @@ -115,28 +138,40 @@ export class TOCEntry extends React.Component { ); } - _renderLayerIcons() { - if (this.props.isReadOnly) { - return null; + _renderQuickActions() { + const quickActions = [ + , + ]; + + if (this.state.supportsFitToBounds) { + quickActions.push( + + ); } - return ( -
+ if (!this.props.isReadOnly) { + quickActions.push( - + ); + quickActions.push( -
- ); + ); + } + + return
{quickActions}
; } _renderDetailsToggle() { @@ -206,9 +243,10 @@ export class TOCEntry extends React.Component { escapedDisplayName={escapeLayerName(this.state.displayName)} editLayer={this._openLayerPanelWithCheck} isEditButtonDisabled={this.props.isEditButtonDisabled} + supportsFitToBounds={this.state.supportsFitToBounds} /> - {this._renderLayerIcons()} + {this._renderQuickActions()}
); } diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/view.test.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/view.test.js index 1a14d854b5449..4a036d8d70c8f 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/view.test.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/view.test.js @@ -21,11 +21,17 @@ const mockLayers = [ getId: () => { return '1'; }, + supportsFitToBounds: () => { + return true; + }, }, { getId: () => { return '2'; }, + supportsFitToBounds: () => { + return false; + }, }, ]; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ec604eaf255cb..d1d58755d6daa 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -12460,8 +12460,6 @@ "xpack.maps.layerControl.closeLayerTOCButtonAriaLabel": "レイヤーパネルを畳む", "xpack.maps.layerControl.layersTitle": "レイヤー", "xpack.maps.layerControl.openLayerTOCButtonAriaLabel": "レイヤーパネルを拡張", - "xpack.maps.layerControl.tocEntry.editButtonAriaLabel": "レイヤーを編集", - "xpack.maps.layerControl.tocEntry.editButtonTitle": "レイヤーを編集", "xpack.maps.layerControl.tocEntry.grabButtonAriaLabel": "レイヤーの並べ替え", "xpack.maps.layerControl.tocEntry.grabButtonTitle": "レイヤーの並べ替え", "xpack.maps.layerControl.tocEntry.hideDetailsButtonAriaLabel": "レイヤー詳細を非表示", @@ -12519,7 +12517,6 @@ "xpack.maps.layerPanel.whereExpression.helpText": "右のソースを絞り込むには、クエリを使用します。", "xpack.maps.layerPanel.whereExpression.queryBarSubmitButtonLabel": "フィルターを設定", "xpack.maps.layerTocActions.cloneLayerTitle": "レイヤーおクローンを作成", - "xpack.maps.layerTocActions.editLayerTitle": "レイヤーを編集", "xpack.maps.layerTocActions.fitToDataTitle": "データに合わせる", "xpack.maps.layerTocActions.hideLayerTitle": "レイヤーの非表示", "xpack.maps.layerTocActions.layerActionsTitle": "レイヤー操作", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 729e32e11a5ff..30da649ff153c 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -12628,8 +12628,6 @@ "xpack.maps.layerControl.closeLayerTOCButtonAriaLabel": "折叠图层面板", "xpack.maps.layerControl.layersTitle": "图层", "xpack.maps.layerControl.openLayerTOCButtonAriaLabel": "展开图层面板", - "xpack.maps.layerControl.tocEntry.editButtonAriaLabel": "编辑图层", - "xpack.maps.layerControl.tocEntry.editButtonTitle": "编辑图层", "xpack.maps.layerControl.tocEntry.grabButtonAriaLabel": "重新排序图层", "xpack.maps.layerControl.tocEntry.grabButtonTitle": "重新排序图层", "xpack.maps.layerControl.tocEntry.hideDetailsButtonAriaLabel": "隐藏图层详情", @@ -12688,7 +12686,6 @@ "xpack.maps.layerPanel.whereExpression.helpText": "使用查询缩小右源范围。", "xpack.maps.layerPanel.whereExpression.queryBarSubmitButtonLabel": "设置筛选", "xpack.maps.layerTocActions.cloneLayerTitle": "克隆图层", - "xpack.maps.layerTocActions.editLayerTitle": "编辑图层", "xpack.maps.layerTocActions.fitToDataTitle": "适应数据", "xpack.maps.layerTocActions.hideLayerTitle": "隐藏图层", "xpack.maps.layerTocActions.layerActionsTitle": "图层操作", From 5141f598dced11344a6e1a3cca18a46cdf7b672d Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Mon, 19 Apr 2021 09:04:34 -0700 Subject: [PATCH 38/82] [Alerting] Added proper check to see if TLS is required using security API for apiKeys: `areAPIKeysEnabled` (#97317) * replaced xpack usage calls with the security API areAPIKeysEnabled * fixed typechecks Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/alerting/server/plugin.ts | 6 +- .../server/routes/_mock_handler_arguments.ts | 9 +- .../alerting/server/routes/health.test.ts | 73 ++++------------ .../plugins/alerting/server/routes/health.ts | 28 +----- .../server/routes/legacy/health.test.ts | 85 +++---------------- .../alerting/server/routes/legacy/health.ts | 28 +----- x-pack/plugins/alerting/server/types.ts | 1 + 7 files changed, 42 insertions(+), 188 deletions(-) diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index 787d3cc548ba1..1155cfa93337d 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -364,7 +364,7 @@ export class AlertingPlugin { } private createRouteHandlerContext = ( - core: CoreSetup + core: CoreSetup ): IContextProvider => { const { alertTypeRegistry, alertsClientFactory } = this; return async function alertsRouteHandlerContext(context, request) { @@ -376,6 +376,10 @@ export class AlertingPlugin { listTypes: alertTypeRegistry!.list.bind(alertTypeRegistry!), getFrameworkHealth: async () => await getHealth(savedObjects.createInternalRepository(['alert'])), + areApiKeysEnabled: async () => { + const [, { security }] = await core.getStartServices(); + return security?.authc.apiKeys.areAPIKeysEnabled() ?? false; + }, }; }; }; diff --git a/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts b/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts index cd1c32a9b2d8f..7bab31fa4c89a 100644 --- a/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts +++ b/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts @@ -8,26 +8,23 @@ import { KibanaRequest, KibanaResponseFactory } from 'kibana/server'; import { identity } from 'lodash'; import type { MethodKeysOf } from '@kbn/utility-types'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ScopedClusterClientMock } from '../../../../../src/core/server/elasticsearch/client/mocks'; import { httpServerMock } from '../../../../../src/core/server/mocks'; import { alertsClientMock, AlertsClientMock } from '../alerts_client.mock'; import { AlertsHealth, AlertType } from '../../common'; -import { elasticsearchServiceMock } from '../../../../../src/core/server/mocks'; import type { AlertingRequestHandlerContext } from '../types'; export function mockHandlerArguments( { alertsClient = alertsClientMock.create(), listTypes: listTypesRes = [], - esClient = elasticsearchServiceMock.createScopedClusterClient(), getFrameworkHealth, + areApiKeysEnabled, }: { alertsClient?: AlertsClientMock; listTypes?: AlertType[]; - esClient?: jest.Mocked; getFrameworkHealth?: jest.MockInstance, []> & (() => Promise); + areApiKeysEnabled?: () => Promise; }, req: unknown, res?: Array> @@ -39,13 +36,13 @@ export function mockHandlerArguments( const listTypes = jest.fn(() => listTypesRes); return [ ({ - core: { elasticsearch: { client: esClient } }, alerting: { listTypes, getAlertsClient() { return alertsClient || alertsClientMock.create(); }, getFrameworkHealth, + areApiKeysEnabled: areApiKeysEnabled ? areApiKeysEnabled : () => Promise.resolve(true), }, } as unknown) as AlertingRequestHandlerContext, req as KibanaRequest, diff --git a/x-pack/plugins/alerting/server/routes/health.test.ts b/x-pack/plugins/alerting/server/routes/health.test.ts index be63e0b7054be..40ad2721e816e 100644 --- a/x-pack/plugins/alerting/server/routes/health.test.ts +++ b/x-pack/plugins/alerting/server/routes/health.test.ts @@ -8,15 +8,12 @@ import { healthRoute } from './health'; import { httpServiceMock } from 'src/core/server/mocks'; import { mockHandlerArguments } from './_mock_handler_arguments'; -import { elasticsearchServiceMock } from '../../../../../src/core/server/mocks'; import { verifyApiAccess } from '../lib/license_api_access'; import { licenseStateMock } from '../lib/license_state.mock'; import { encryptedSavedObjectsMock } from '../../../encrypted_saved_objects/server/mocks'; import { alertsClientMock } from '../alerts_client.mock'; import { HealthStatus } from '../types'; import { alertsMock } from '../mocks'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { elasticsearchClientMock } from '../../../../../src/core/server/elasticsearch/client/mocks'; const alertsClient = alertsClientMock.create(); jest.mock('../lib/license_api_access.ts', () => ({ @@ -65,25 +62,11 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({}) - ); - - const [context, req, res] = mockHandlerArguments({ esClient, alertsClient }, {}, ['ok']); + const [context, req, res] = mockHandlerArguments({ alertsClient }, {}, ['ok']); await handler(context, req, res); expect(verifyApiAccess).toHaveBeenCalledWith(licenseState); - - expect(esClient.asInternalUser.transport.request.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "method": "GET", - "path": "/_xpack/usage", - }, - ] - `); }); it('evaluates whether Encrypted Saved Objects is missing encryption key', async () => { @@ -94,13 +77,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({}) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); @@ -135,13 +113,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({}) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); @@ -176,13 +149,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({ security: {} }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); @@ -217,13 +185,12 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({ security: { enabled: true } }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { + alertsClient, + getFrameworkHealth: alerting.getFrameworkHealth, + areApiKeysEnabled: () => Promise.resolve(false), + }, {}, ['ok'] ); @@ -258,15 +225,12 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - security: { enabled: true, ssl: {} }, - }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { + alertsClient, + getFrameworkHealth: alerting.getFrameworkHealth, + areApiKeysEnabled: () => Promise.resolve(false), + }, {}, ['ok'] ); @@ -301,15 +265,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchClientMock.createSuccessTransportRequestPromise({ - security: { enabled: true, ssl: { http: { enabled: true } } }, - }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); diff --git a/x-pack/plugins/alerting/server/routes/health.ts b/x-pack/plugins/alerting/server/routes/health.ts index c2a122a28fa49..96016ccc45472 100644 --- a/x-pack/plugins/alerting/server/routes/health.ts +++ b/x-pack/plugins/alerting/server/routes/health.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { ApiResponse } from '@elastic/elasticsearch'; import { IRouter } from 'kibana/server'; import { ILicenseState } from '../lib'; import { EncryptedSavedObjectsPluginSetup } from '../../../encrypted_saved_objects/server'; @@ -16,17 +15,6 @@ import { AlertingFrameworkHealth, } from '../types'; -interface XPackUsageSecurity { - security?: { - enabled?: boolean; - ssl?: { - http?: { - enabled?: boolean; - }; - }; - }; -} - const rewriteBodyRes: RewriteResponseCase = ({ isSufficientlySecure, hasPermanentEncryptionKey, @@ -56,23 +44,11 @@ export const healthRoute = ( router.handleLegacyErrors( verifyAccessAndContext(licenseState, async function (context, req, res) { try { - const { - body: { - security: { - enabled: isSecurityEnabled = false, - ssl: { http: { enabled: isTLSEnabled = false } = {} } = {}, - } = {}, - }, - }: ApiResponse = await context.core.elasticsearch.client.asInternalUser.transport // Do not augment with such input. // `transport.request` is potentially unsafe when combined with untrusted user input. - .request({ - method: 'GET', - path: '/_xpack/usage', - }); - + const areApiKeysEnabled = await context.alerting.areApiKeysEnabled(); const alertingFrameworkHeath = await context.alerting.getFrameworkHealth(); const frameworkHealth: AlertingFrameworkHealth = { - isSufficientlySecure: !isSecurityEnabled || (isSecurityEnabled && isTLSEnabled), + isSufficientlySecure: areApiKeysEnabled, hasPermanentEncryptionKey: encryptedSavedObjects.canEncrypt, alertingFrameworkHeath, }; diff --git a/x-pack/plugins/alerting/server/routes/legacy/health.test.ts b/x-pack/plugins/alerting/server/routes/legacy/health.test.ts index 74de5f70a32e7..bc60eae34e0ce 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/health.test.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/health.test.ts @@ -8,8 +8,6 @@ import { healthRoute } from './health'; import { httpServiceMock } from 'src/core/server/mocks'; import { mockHandlerArguments } from './../_mock_handler_arguments'; -import { elasticsearchServiceMock } from '../../../../../../src/core/server/mocks'; -import { verifyApiAccess } from '../../lib/license_api_access'; import { licenseStateMock } from '../../lib/license_state.mock'; import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; import { alertsClientMock } from '../../alerts_client.mock'; @@ -55,35 +53,6 @@ describe('healthRoute', () => { expect(config.path).toMatchInlineSnapshot(`"/api/alerts/_health"`); }); - it('queries the usage api', async () => { - const router = httpServiceMock.createRouter(); - - const licenseState = licenseStateMock.create(); - const encryptedSavedObjects = encryptedSavedObjectsMock.createSetup({ canEncrypt: true }); - healthRoute(router, licenseState, encryptedSavedObjects); - const [, handler] = router.get.mock.calls[0]; - - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({}) - ); - - const [context, req, res] = mockHandlerArguments({ esClient, alertsClient }, {}, ['ok']); - - await handler(context, req, res); - - expect(verifyApiAccess).toHaveBeenCalledWith(licenseState); - - expect(esClient.asInternalUser.transport.request.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "method": "GET", - "path": "/_xpack/usage", - }, - ] - `); - }); - it('evaluates whether Encrypted Saved Objects is missing encryption key', async () => { const router = httpServiceMock.createRouter(); @@ -92,13 +61,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({}) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); @@ -133,13 +97,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({}) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); @@ -174,13 +133,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({}) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); @@ -215,13 +169,12 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({ security: { enabled: true } }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { + alertsClient, + getFrameworkHealth: alerting.getFrameworkHealth, + areApiKeysEnabled: () => Promise.resolve(false), + }, {}, ['ok'] ); @@ -256,15 +209,12 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({ - security: { enabled: true, ssl: {} }, - }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { + alertsClient, + getFrameworkHealth: alerting.getFrameworkHealth, + areApiKeysEnabled: () => Promise.resolve(false), + }, {}, ['ok'] ); @@ -299,15 +249,8 @@ describe('healthRoute', () => { healthRoute(router, licenseState, encryptedSavedObjects); const [, handler] = router.get.mock.calls[0]; - const esClient = elasticsearchServiceMock.createScopedClusterClient(); - esClient.asInternalUser.transport.request.mockReturnValue( - elasticsearchServiceMock.createSuccessTransportRequestPromise({ - security: { enabled: true, ssl: { http: { enabled: true } } }, - }) - ); - const [context, req, res] = mockHandlerArguments( - { esClient, alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, + { alertsClient, getFrameworkHealth: alerting.getFrameworkHealth }, {}, ['ok'] ); diff --git a/x-pack/plugins/alerting/server/routes/legacy/health.ts b/x-pack/plugins/alerting/server/routes/legacy/health.ts index b9906a56ce972..206a74c2ea636 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/health.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/health.ts @@ -5,24 +5,12 @@ * 2.0. */ -import { ApiResponse } from '@elastic/elasticsearch'; import type { AlertingRouter } from '../../types'; import { ILicenseState } from '../../lib/license_state'; import { verifyApiAccess } from '../../lib/license_api_access'; import { AlertingFrameworkHealth } from '../../types'; import { EncryptedSavedObjectsPluginSetup } from '../../../../encrypted_saved_objects/server'; -interface XPackUsageSecurity { - security?: { - enabled?: boolean; - ssl?: { - http?: { - enabled?: boolean; - }; - }; - }; -} - export function healthRoute( router: AlertingRouter, licenseState: ILicenseState, @@ -39,23 +27,11 @@ export function healthRoute( return res.badRequest({ body: 'RouteHandlerContext is not registered for alerting' }); } try { - const { - body: { - security: { - enabled: isSecurityEnabled = false, - ssl: { http: { enabled: isTLSEnabled = false } = {} } = {}, - } = {}, - }, - }: ApiResponse = await context.core.elasticsearch.client.asInternalUser.transport // Do not augment with such input. // `transport.request` is potentially unsafe when combined with untrusted user input. - .request({ - method: 'GET', - path: '/_xpack/usage', - }); - const alertingFrameworkHeath = await context.alerting.getFrameworkHealth(); + const areApiKeysEnabled = await context.alerting.areApiKeysEnabled(); const frameworkHealth: AlertingFrameworkHealth = { - isSufficientlySecure: !isSecurityEnabled || (isSecurityEnabled && isTLSEnabled), + isSufficientlySecure: areApiKeysEnabled, hasPermanentEncryptionKey: encryptedSavedObjects.canEncrypt, alertingFrameworkHeath, }; diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index 23aed1070a31a..dea5d7ddcc884 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -46,6 +46,7 @@ export interface AlertingApiRequestHandlerContext { getAlertsClient: () => AlertsClient; listTypes: AlertTypeRegistry['list']; getFrameworkHealth: () => Promise; + areApiKeysEnabled: () => Promise; } /** From 6712bc07279c9582094d31eb22ebf72bdfaba2f7 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Mon, 19 Apr 2021 12:35:20 -0400 Subject: [PATCH 39/82] Fix and unskip test suite (#97144) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../migration_7.7.2_xpack_100k.test.ts | 3 +-- src/plugins/dashboard/server/plugin.ts | 20 ++++++------------- x-pack/plugins/monitoring/server/plugin.ts | 2 +- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts index 7f3ee03f1437d..0e51c886f7f30 100644 --- a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts +++ b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts @@ -26,8 +26,7 @@ async function removeLogFile() { await asyncUnlink(logFilePath).catch(() => void 0); } -// FAILING: https://github.com/elastic/kibana/pull/96788 -describe.skip('migration from 7.7.2-xpack with 100k objects', () => { +describe('migration from 7.7.2-xpack with 100k objects', () => { let esServer: kbnTestServer.TestElasticsearchUtils; let root: Root; let coreStart: InternalCoreStart; diff --git a/src/plugins/dashboard/server/plugin.ts b/src/plugins/dashboard/server/plugin.ts index 3aeaf31c190bd..fbed98a882b0a 100644 --- a/src/plugins/dashboard/server/plugin.ts +++ b/src/plugins/dashboard/server/plugin.ts @@ -18,7 +18,7 @@ import { createDashboardSavedObjectType } from './saved_objects'; import { capabilitiesProvider } from './capabilities_provider'; import { DashboardPluginSetup, DashboardPluginStart } from './types'; -import { EmbeddableSetup, EmbeddableStart } from '../../embeddable/server'; +import { EmbeddableSetup } from '../../embeddable/server'; import { UsageCollectionSetup } from '../../usage_collection/server'; import { registerDashboardUsageCollector } from './usage/register_collector'; import { dashboardPersistableStateServiceFactory } from './embeddable/dashboard_container_embeddable_factory'; @@ -28,19 +28,15 @@ interface SetupDeps { usageCollection: UsageCollectionSetup; } -interface StartDeps { - embeddable: EmbeddableStart; -} - export class DashboardPlugin - implements Plugin { + implements Plugin { private readonly logger: Logger; constructor(initializerContext: PluginInitializerContext) { this.logger = initializerContext.logger.get(); } - public setup(core: CoreSetup, plugins: SetupDeps) { + public setup(core: CoreSetup, plugins: SetupDeps) { this.logger.debug('dashboard: Setup'); core.savedObjects.registerType( @@ -54,13 +50,9 @@ export class DashboardPlugin registerDashboardUsageCollector(plugins.usageCollection, plugins.embeddable); - (async () => { - const [, startPlugins] = await core.getStartServices(); - - plugins.embeddable.registerEmbeddableFactory( - dashboardPersistableStateServiceFactory(startPlugins.embeddable) - ); - })(); + plugins.embeddable.registerEmbeddableFactory( + dashboardPersistableStateServiceFactory(plugins.embeddable) + ); return {}; } diff --git a/x-pack/plugins/monitoring/server/plugin.ts b/x-pack/plugins/monitoring/server/plugin.ts index 87134c765fbf9..6b47b47a21394 100644 --- a/x-pack/plugins/monitoring/server/plugin.ts +++ b/x-pack/plugins/monitoring/server/plugin.ts @@ -230,7 +230,7 @@ export class MonitoringPlugin if (this.cluster) { this.cluster.close(); } - if (this.licenseService) { + if (this.licenseService && this.licenseService.stop) { this.licenseService.stop(); } this.bulkUploader?.stop(); From b7a9b84af89da3b9e93bc78c8d954f50061b1e2c Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 19 Apr 2021 09:45:09 -0700 Subject: [PATCH 40/82] Revert "Revert "[ci] skip building ts refs when not necessary (#95739)" (#95746)" (#95750) Co-authored-by: spalger Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .ci/Jenkinsfile_baseline_capture | 1 + src/dev/ci_setup/setup.sh | 4 ---- src/dev/typescript/build_ts_refs_cli.ts | 2 +- test/scripts/checks/type_check.sh | 8 ++++++++ vars/workers.groovy | 1 + 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.ci/Jenkinsfile_baseline_capture b/.ci/Jenkinsfile_baseline_capture index b729f5d9da082..d074da1cb1926 100644 --- a/.ci/Jenkinsfile_baseline_capture +++ b/.ci/Jenkinsfile_baseline_capture @@ -23,6 +23,7 @@ kibanaPipeline(timeoutMinutes: 210) { ) { withGcpServiceAccount.fromVaultSecret('secret/kibana-issues/dev/ci-artifacts-key', 'value') { withEnv([ + 'BUILD_TS_REFS_DISABLE=false', // disabled in root config so we need to override that here 'BUILD_TS_REFS_CACHE_ENABLE=true', 'BUILD_TS_REFS_CACHE_CAPTURE=true', 'DISABLE_BOOTSTRAP_VALIDATION=true', diff --git a/src/dev/ci_setup/setup.sh b/src/dev/ci_setup/setup.sh index dde1cb212c536..62e1b24d6d559 100755 --- a/src/dev/ci_setup/setup.sh +++ b/src/dev/ci_setup/setup.sh @@ -21,10 +21,6 @@ cp "src/dev/ci_setup/.bazelrc-ci" "$HOME/.bazelrc"; echo "# Appended by src/dev/ci_setup/setup.sh" >> "$HOME/.bazelrc" echo "build --remote_header=x-buildbuddy-api-key=$KIBANA_BUILDBUDDY_CI_API_KEY" >> "$HOME/.bazelrc" -if [[ "$BUILD_TS_REFS_CACHE_ENABLE" != "true" ]]; then - export BUILD_TS_REFS_CACHE_ENABLE=false -fi - ### ### install dependencies ### diff --git a/src/dev/typescript/build_ts_refs_cli.ts b/src/dev/typescript/build_ts_refs_cli.ts index 42b278ce6450c..00f298887ee17 100644 --- a/src/dev/typescript/build_ts_refs_cli.ts +++ b/src/dev/typescript/build_ts_refs_cli.ts @@ -21,7 +21,7 @@ const CACHE_WORKING_DIR = Path.resolve(REPO_ROOT, 'data/ts_refs_output_cache'); const TS_ERROR_REF = /\sTS\d{1,6}:\s/; const isTypeFailure = (error: any) => - error.exitCode === 1 && + error.exitCode > 0 && error.stderr === '' && typeof error.stdout === 'string' && TS_ERROR_REF.test(error.stdout); diff --git a/test/scripts/checks/type_check.sh b/test/scripts/checks/type_check.sh index 5e091625de4ed..bbe5748558684 100755 --- a/test/scripts/checks/type_check.sh +++ b/test/scripts/checks/type_check.sh @@ -2,5 +2,13 @@ source src/dev/ci_setup/setup_env.sh +checks-reporter-with-killswitch "Build TS Refs" \ + node scripts/build_ts_refs \ + --ignore-type-failures \ + --clean \ + --no-cache \ + --force \ + --debug + checks-reporter-with-killswitch "Check Types" \ node scripts/type_check diff --git a/vars/workers.groovy b/vars/workers.groovy index 5d3328bc8a3c4..1260f74f1bdf9 100644 --- a/vars/workers.groovy +++ b/vars/workers.groovy @@ -101,6 +101,7 @@ def base(Map params, Closure closure) { "TEST_BROWSER_HEADLESS=1", "GIT_BRANCH=${checkoutInfo.branch}", "TMPDIR=${env.WORKSPACE}/tmp", // For Chrome and anything else that respects it + "BUILD_TS_REFS_DISABLE=true", // no need to build ts refs in bootstrap ]) { withCredentials([ string(credentialsId: 'vault-addr', variable: 'VAULT_ADDR'), From 978f5eca5a481a7a2c69efa94cc4e39c3930de10 Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Mon, 19 Apr 2021 13:12:45 -0400 Subject: [PATCH 41/82] Add config properties for HTTP security headers (#97158) --- config/kibana.yml | 2 +- ...-core-server.cspconfig.disableembedding.md | 11 +++ .../kibana-plugin-core-server.cspconfig.md | 1 + ...core-server.icspconfig.disableembedding.md | 13 +++ .../kibana-plugin-core-server.icspconfig.md | 1 + ...-server.routeconfigoptionsbody.maxbytes.md | 2 +- ...ugin-core-server.routeconfigoptionsbody.md | 2 +- docs/maps/trouble-shooting.asciidoc | 2 +- docs/setup/settings.asciidoc | 59 ++++++++++- .../core_usage_data_service.mock.ts | 7 ++ .../core_usage_data_service.test.ts | 7 ++ .../core_usage_data_service.ts | 10 ++ src/core/server/core_usage_data/types.ts | 7 ++ src/core/server/csp/config.test.ts | 19 ++++ src/core/server/csp/config.ts | 3 + src/core/server/csp/csp_config.test.ts | 86 ++++++++-------- src/core/server/csp/csp_config.ts | 17 +++- .../__snapshots__/http_config.test.ts.snap | 7 ++ src/core/server/http/http_config.ts | 12 ++- .../lifecycle_handlers.test.ts | 43 ++++---- .../server/http/lifecycle_handlers.test.ts | 11 ++- src/core/server/http/lifecycle_handlers.ts | 6 +- src/core/server/http/router/route.ts | 2 +- .../security_response_headers_config.test.ts | 99 +++++++++++++++++++ .../http/security_response_headers_config.ts | 72 ++++++++++++++ src/core/server/http/test_utils.ts | 1 + src/core/server/server.api.md | 10 ++ .../resources/base/bin/kibana-docker | 7 +- .../collectors/core/core_usage_collector.ts | 32 ++++++ src/plugins/telemetry/schema/oss_plugins.json | 34 +++++++ test/common/config.js | 2 +- 31 files changed, 501 insertions(+), 86 deletions(-) create mode 100644 docs/development/core/server/kibana-plugin-core-server.cspconfig.disableembedding.md create mode 100644 docs/development/core/server/kibana-plugin-core-server.icspconfig.disableembedding.md create mode 100644 src/core/server/csp/config.test.ts create mode 100644 src/core/server/http/security_response_headers_config.test.ts create mode 100644 src/core/server/http/security_response_headers_config.ts diff --git a/config/kibana.yml b/config/kibana.yml index 7c7378fb5d29d..eefb6bb8bacda 100644 --- a/config/kibana.yml +++ b/config/kibana.yml @@ -23,7 +23,7 @@ #server.publicBaseUrl: "" # The maximum payload size in bytes for incoming server requests. -#server.maxPayloadBytes: 1048576 +#server.maxPayload: 1048576 # The Kibana server's name. This is used for display purposes. #server.name: "your-hostname" diff --git a/docs/development/core/server/kibana-plugin-core-server.cspconfig.disableembedding.md b/docs/development/core/server/kibana-plugin-core-server.cspconfig.disableembedding.md new file mode 100644 index 0000000000000..bbd7c42c302d1 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.cspconfig.disableembedding.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [CspConfig](./kibana-plugin-core-server.cspconfig.md) > [disableEmbedding](./kibana-plugin-core-server.cspconfig.disableembedding.md) + +## CspConfig.disableEmbedding property + +Signature: + +```typescript +readonly disableEmbedding: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.cspconfig.md b/docs/development/core/server/kibana-plugin-core-server.cspconfig.md index 6ff807929e6fb..9f4f3211ea2b1 100644 --- a/docs/development/core/server/kibana-plugin-core-server.cspconfig.md +++ b/docs/development/core/server/kibana-plugin-core-server.cspconfig.md @@ -21,6 +21,7 @@ The constructor for this class is marked as internal. Third-party code should no | Property | Modifiers | Type | Description | | --- | --- | --- | --- | | [DEFAULT](./kibana-plugin-core-server.cspconfig.default.md) | static | CspConfig | | +| [disableEmbedding](./kibana-plugin-core-server.cspconfig.disableembedding.md) | | boolean | | | [header](./kibana-plugin-core-server.cspconfig.header.md) | | string | | | [rules](./kibana-plugin-core-server.cspconfig.rules.md) | | string[] | | | [strict](./kibana-plugin-core-server.cspconfig.strict.md) | | boolean | | diff --git a/docs/development/core/server/kibana-plugin-core-server.icspconfig.disableembedding.md b/docs/development/core/server/kibana-plugin-core-server.icspconfig.disableembedding.md new file mode 100644 index 0000000000000..2cfd680459fbc --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.icspconfig.disableembedding.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [ICspConfig](./kibana-plugin-core-server.icspconfig.md) > [disableEmbedding](./kibana-plugin-core-server.icspconfig.disableembedding.md) + +## ICspConfig.disableEmbedding property + +Whether or not embedding (using iframes) should be allowed by the CSP. If embedding is disabled \*and\* no custom rules have been defined, a restrictive 'frame-ancestors' rule will be added to the default CSP rules. + +Signature: + +```typescript +readonly disableEmbedding: boolean; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.icspconfig.md b/docs/development/core/server/kibana-plugin-core-server.icspconfig.md index bf04b760a0636..ee49950df076c 100644 --- a/docs/development/core/server/kibana-plugin-core-server.icspconfig.md +++ b/docs/development/core/server/kibana-plugin-core-server.icspconfig.md @@ -16,6 +16,7 @@ export interface ICspConfig | Property | Type | Description | | --- | --- | --- | +| [disableEmbedding](./kibana-plugin-core-server.icspconfig.disableembedding.md) | boolean | Whether or not embedding (using iframes) should be allowed by the CSP. If embedding is disabled \*and\* no custom rules have been defined, a restrictive 'frame-ancestors' rule will be added to the default CSP rules. | | [header](./kibana-plugin-core-server.icspconfig.header.md) | string | The CSP rules in a formatted directives string for use in a Content-Security-Policy header. | | [rules](./kibana-plugin-core-server.icspconfig.rules.md) | string[] | The CSP rules used for Kibana. | | [strict](./kibana-plugin-core-server.icspconfig.strict.md) | boolean | Specify whether browsers that do not support CSP should be able to use Kibana. Use true to block and false to allow. | diff --git a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.maxbytes.md b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.maxbytes.md index 474f7092b1b39..4d2641255adb4 100644 --- a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.maxbytes.md +++ b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.maxbytes.md @@ -6,7 +6,7 @@ Limits the size of incoming payloads to the specified byte count. Allowing very large payloads may cause the server to run out of memory. -Default value: The one set in the kibana.yml config file under the parameter `server.maxPayloadBytes`. +Default value: The one set in the kibana.yml config file under the parameter `server.maxPayload`. Signature: diff --git a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.md b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.md index 330935e42026a..d27c67891161a 100644 --- a/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.md +++ b/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.md @@ -17,7 +17,7 @@ export interface RouteConfigOptionsBody | Property | Type | Description | | --- | --- | --- | | [accepts](./kibana-plugin-core-server.routeconfigoptionsbody.accepts.md) | RouteContentType | RouteContentType[] | string | string[] | A string or an array of strings with the allowed mime types for the endpoint. Use this settings to limit the set of allowed mime types. Note that allowing additional mime types not listed above will not enable them to be parsed, and if parse is true, the request will result in an error response.Default value: allows parsing of the following mime types: \* application/json \* application/\*+json \* application/octet-stream \* application/x-www-form-urlencoded \* multipart/form-data \* text/\* | -| [maxBytes](./kibana-plugin-core-server.routeconfigoptionsbody.maxbytes.md) | number | Limits the size of incoming payloads to the specified byte count. Allowing very large payloads may cause the server to run out of memory.Default value: The one set in the kibana.yml config file under the parameter server.maxPayloadBytes. | +| [maxBytes](./kibana-plugin-core-server.routeconfigoptionsbody.maxbytes.md) | number | Limits the size of incoming payloads to the specified byte count. Allowing very large payloads may cause the server to run out of memory.Default value: The one set in the kibana.yml config file under the parameter server.maxPayload. | | [output](./kibana-plugin-core-server.routeconfigoptionsbody.output.md) | typeof validBodyOutput[number] | The processed payload format. The value must be one of: \* 'data' - the incoming payload is read fully into memory. If parse is true, the payload is parsed (JSON, form-decoded, multipart) based on the 'Content-Type' header. If parse is false, a raw Buffer is returned. \* 'stream' - the incoming payload is made available via a Stream.Readable interface. If the payload is 'multipart/form-data' and parse is true, field values are presented as text while files are provided as streams. File streams from a 'multipart/form-data' upload will also have a hapi property containing the filename and headers properties. Note that payload streams for multipart payloads are a synthetic interface created on top of the entire multipart content loaded into memory. To avoid loading large multipart payloads into memory, set parse to false and handle the multipart payload in the handler using a streaming parser (e.g. pez).Default value: 'data', unless no validation.body is provided in the route definition. In that case the default is 'stream' to alleviate memory pressure. | | [parse](./kibana-plugin-core-server.routeconfigoptionsbody.parse.md) | boolean | 'gunzip' | Determines if the incoming payload is processed or presented raw. Available values: \* true - if the request 'Content-Type' matches the allowed mime types set by allow (for the whole payload as well as parts), the payload is converted into an object when possible. If the format is unknown, a Bad Request (400) error response is sent. Any known content encoding is decoded. \* false - the raw payload is returned unmodified. \* 'gunzip' - the raw payload is returned unmodified after any known content encoding is decoded.Default value: true, unless no validation.body is provided in the route definition. In that case the default is false to alleviate memory pressure. | diff --git a/docs/maps/trouble-shooting.asciidoc b/docs/maps/trouble-shooting.asciidoc index 11aa636e0d852..0e1ed0b9e1bec 100644 --- a/docs/maps/trouble-shooting.asciidoc +++ b/docs/maps/trouble-shooting.asciidoc @@ -32,7 +32,7 @@ image::maps/images/inspector.png[] ** Ensure your geospatial field is searchable and aggregatable. ** If your geospatial field type does not match your Elasticsearch mapping, click the *Refresh* button to refresh the field list from Elasticsearch. * Index patterns with thousands of fields can exceed the default maximum payload size. -Increase <> for large index patterns. +Increase <> for large index patterns. [float] ==== Features are not displayed diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 90e813afad6f4..a7af590136355 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -25,12 +25,12 @@ which may cause a delay before pages start being served. Set to `false` to disable Console. *Default: `true`* | `cpu.cgroup.path.override:` - | deprecated:[7.10.0,"This setting will no longer be supported as of 8.0."] + | deprecated:[7.10.0,"In 8.0 and later, this setting will no longer be supported."] This setting has been renamed to <>. | `cpuacct.cgroup.path.override:` - | deprecated:[7.10.0,"This setting will no longer be supported as of 8.0."] + | deprecated:[7.10.0,"In 8.0 and later, this setting will no longer be supported."] This setting has been renamed to <>. @@ -473,7 +473,7 @@ confident your server can hold this many objects in memory. | The maximum byte size of a saved objects import that the {kib} server will accept. This setting exists to prevent the {kib} server from runnning out of memory when handling a large import payload. Note that this setting overrides the more general -<> for saved object imports only. +<> for saved object imports only. *Default: `26214400`* |[[server-basePath]] `server.basePath:` @@ -504,6 +504,55 @@ deprecation warning at startup. This setting cannot end in a slash (`/`). proxy sitting in front of it. This determines whether HTTP compression may be used for responses, based on the request `Referer` header. This setting may not be used when <> is set to `false`. *Default: `none`* + +a| [[server-securityResponseHeaders-strictTransportSecurity]] +---- +server.securityResponseHeaders: + strictTransportSecurity: +---- +| Controls whether the https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security[`Strict-Transport-Security`] +header is used in all responses to the client from the {kib} server, and specifies what value is used. Allowed values are any text value or +`null`. To disable, set to `null`. *Default:* `null` + +a| [[server-securityResponseHeaders-xContentTypeOptions]] +---- +server.securityResponseHeaders: + xContentTypeOptions: +---- +| Controls whether the https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options[`X-Content-Type-Options`] header is +used in all responses to the client from the {kib} server, and specifies what value is used. Allowed values are `nosniff` or `null`. To +disable, set to `null`. *Default:* `"nosniff"` + +a| [[server-securityResponseHeaders-referrerPolicy]] +---- +server.securityResponseHeaders: + referrerPolicy: +---- +| Controls whether the https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy[`Referrer-Policy`] header is used in all +responses to the client from the {kib} server, and specifies what value is used. Allowed values are `no-referrer`, +`no-referrer-when-downgrade`, `origin`, `origin-when-cross-origin`, `same-origin`, `strict-origin`, `strict-origin-when-cross-origin`, +`unsafe-url`, or `null`. To disable, set to `null`. *Default:* `"no-referrer-when-downgrade"` + +a| [[server-securityResponseHeaders-permissionsPolicy]] +---- +server.securityResponseHeaders: + permissionsPolicy: +---- +| experimental[] Controls whether the https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy[`Permissions-Policy`] header +is used in all responses to the client from the {kib} server, and specifies what value is used. Allowed values are any text value or `null`. +To disable, set to `null`. *Default:* `null` + +a| [[server-securityResponseHeaders-disableEmbedding]] +---- +server.securityResponseHeaders: + disableEmbedding: +---- +| Controls whether the https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy[`Content-Security-Policy`] and +https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options[`X-Frame-Options`] headers are configured to disable embedding +{kib} in other webpages using iframes. When set to `true`, secure headers are used to disable embedding, which adds the `frame-ancestors: +'self'` directive to the `Content-Security-Policy` response header (if you are using the default CSP rules), and adds the `X-Frame-Options: +SAMEORIGIN` response header. *Default:* `false` + | `server.customResponseHeaders:` {ess-icon} | Header names and values to send on all responses to the client from the {kib} server. *Default: `{}`* @@ -517,6 +566,10 @@ back end server. To allow remote users to connect, set the value to the IP addre the <> counter. *Default: `"120000"`* |[[server-maxPayloadBytes]] `server.maxPayloadBytes:` + | deprecated:[7.13.0,"In 8.0 and later, this setting will no longer be supported."] + This setting has been renamed to <>. + +|[[server-maxPayload]] `server.maxPayload:` | The maximum payload size in bytes for incoming server requests. *Default: `1048576`* diff --git a/src/core/server/core_usage_data/core_usage_data_service.mock.ts b/src/core/server/core_usage_data/core_usage_data_service.mock.ts index 8ed627cebec7e..7fb15a921a413 100644 --- a/src/core/server/core_usage_data/core_usage_data_service.mock.ts +++ b/src/core/server/core_usage_data/core_usage_data_service.mock.ts @@ -95,6 +95,13 @@ const createStartContractMock = () => { supportedProtocols: ['TLSv1.1', 'TLSv1.2'], truststoreConfigured: false, }, + securityResponseHeaders: { + strictTransportSecurity: 'NULL', // `null` values are coalesced to `"NULL"` strings + xContentTypeOptions: 'nosniff', + referrerPolicy: 'no-referrer-when-downgrade', + permissionsPolicyConfigured: false, + disableEmbedding: false, + }, xsrf: { disableProtection: false, allowlistConfigured: false, diff --git a/src/core/server/core_usage_data/core_usage_data_service.test.ts b/src/core/server/core_usage_data/core_usage_data_service.test.ts index 1c28eca1f1dec..d1f047c129efe 100644 --- a/src/core/server/core_usage_data/core_usage_data_service.test.ts +++ b/src/core/server/core_usage_data/core_usage_data_service.test.ts @@ -187,6 +187,13 @@ describe('CoreUsageDataService', () => { "ipAllowlistConfigured": false, }, "rewriteBasePath": false, + "securityResponseHeaders": Object { + "disableEmbedding": false, + "permissionsPolicyConfigured": false, + "referrerPolicy": "no-referrer-when-downgrade", + "strictTransportSecurity": "NULL", + "xContentTypeOptions": "nosniff", + }, "socketTimeout": 120000, "ssl": Object { "certificateAuthoritiesConfigured": false, diff --git a/src/core/server/core_usage_data/core_usage_data_service.ts b/src/core/server/core_usage_data/core_usage_data_service.ts index dff68bf1c524f..78ac977c31a7d 100644 --- a/src/core/server/core_usage_data/core_usage_data_service.ts +++ b/src/core/server/core_usage_data/core_usage_data_service.ts @@ -225,6 +225,16 @@ export class CoreUsageDataService implements CoreService { + test(`does not allow "disableEmbedding" to be set to true`, () => { + // This is intentionally not editable in the raw CSP config. + // Users should set `server.securityResponseHeaders.disableEmbedding` to control this config property. + expect(() => config.schema.validate({ disableEmbedding: true })).toThrowError( + '[disableEmbedding.0]: expected value to equal [false]' + ); + }); +}); diff --git a/src/core/server/csp/config.ts b/src/core/server/csp/config.ts index 3fc9faa26179e..a61fa1b03a45c 100644 --- a/src/core/server/csp/config.ts +++ b/src/core/server/csp/config.ts @@ -27,5 +27,8 @@ export const config = { }), strict: schema.boolean({ defaultValue: true }), warnLegacyBrowsers: schema.boolean({ defaultValue: true }), + disableEmbedding: schema.oneOf([schema.literal(false)], { defaultValue: false }), }), }; + +export const FRAME_ANCESTORS_RULE = `frame-ancestors 'self'`; // only used by CspConfig when embedding is disabled diff --git a/src/core/server/csp/csp_config.test.ts b/src/core/server/csp/csp_config.test.ts index ed13d363c4166..1e023c6f08ea8 100644 --- a/src/core/server/csp/csp_config.test.ts +++ b/src/core/server/csp/csp_config.test.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { CspConfig } from '.'; +import { CspConfig } from './csp_config'; +import { FRAME_ANCESTORS_RULE } from './config'; // CSP rules aren't strictly additive, so any change can potentially expand or // restrict the policy in a way we consider a breaking change. For that reason, @@ -25,6 +26,7 @@ describe('CspConfig', () => { test('DEFAULT', () => { expect(CspConfig.DEFAULT).toMatchInlineSnapshot(` CspConfig { + "disableEmbedding": false, "header": "script-src 'unsafe-eval' 'self'; worker-src blob: 'self'; style-src 'unsafe-inline' 'self'", "rules": Array [ "script-src 'unsafe-eval' 'self'", @@ -38,49 +40,51 @@ describe('CspConfig', () => { }); test('defaults from config', () => { - expect(new CspConfig()).toMatchInlineSnapshot(` - CspConfig { - "header": "script-src 'unsafe-eval' 'self'; worker-src blob: 'self'; style-src 'unsafe-inline' 'self'", - "rules": Array [ - "script-src 'unsafe-eval' 'self'", - "worker-src blob: 'self'", - "style-src 'unsafe-inline' 'self'", - ], - "strict": true, - "warnLegacyBrowsers": true, - } - `); + expect(new CspConfig()).toEqual(CspConfig.DEFAULT); }); - test('creates from partial config', () => { - expect(new CspConfig({ strict: false, warnLegacyBrowsers: false })).toMatchInlineSnapshot(` - CspConfig { - "header": "script-src 'unsafe-eval' 'self'; worker-src blob: 'self'; style-src 'unsafe-inline' 'self'", - "rules": Array [ - "script-src 'unsafe-eval' 'self'", - "worker-src blob: 'self'", - "style-src 'unsafe-inline' 'self'", - ], - "strict": false, - "warnLegacyBrowsers": false, - } - `); - }); + describe('partial config', () => { + test('allows "rules" to be set and changes header', () => { + const rules = ['foo', 'bar']; + const config = new CspConfig({ rules }); + expect(config.rules).toEqual(rules); + expect(config.header).toMatchInlineSnapshot(`"foo; bar"`); + }); - test('computes header from rules', () => { - const cspConfig = new CspConfig({ rules: ['alpha', 'beta', 'gamma'] }); + test('allows "strict" to be set', () => { + const config = new CspConfig({ strict: false }); + expect(config.strict).toEqual(false); + expect(config.strict).not.toEqual(CspConfig.DEFAULT.strict); + }); - expect(cspConfig).toMatchInlineSnapshot(` - CspConfig { - "header": "alpha; beta; gamma", - "rules": Array [ - "alpha", - "beta", - "gamma", - ], - "strict": true, - "warnLegacyBrowsers": true, - } - `); + test('allows "warnLegacyBrowsers" to be set', () => { + const warnLegacyBrowsers = false; + const config = new CspConfig({ warnLegacyBrowsers }); + expect(config.warnLegacyBrowsers).toEqual(warnLegacyBrowsers); + expect(config.warnLegacyBrowsers).not.toEqual(CspConfig.DEFAULT.warnLegacyBrowsers); + }); + + describe('allows "disableEmbedding" to be set', () => { + const disableEmbedding = true; + + test('and changes rules/header if custom rules are not defined', () => { + const config = new CspConfig({ disableEmbedding }); + expect(config.disableEmbedding).toEqual(disableEmbedding); + expect(config.disableEmbedding).not.toEqual(CspConfig.DEFAULT.disableEmbedding); + expect(config.rules).toEqual(expect.arrayContaining([FRAME_ANCESTORS_RULE])); + expect(config.header).toMatchInlineSnapshot( + `"script-src 'unsafe-eval' 'self'; worker-src blob: 'self'; style-src 'unsafe-inline' 'self'; frame-ancestors 'self'"` + ); + }); + + test('and does not change rules/header if custom rules are defined', () => { + const rules = ['foo', 'bar']; + const config = new CspConfig({ disableEmbedding, rules }); + expect(config.disableEmbedding).toEqual(disableEmbedding); + expect(config.disableEmbedding).not.toEqual(CspConfig.DEFAULT.disableEmbedding); + expect(config.rules).toEqual(rules); + expect(config.header).toMatchInlineSnapshot(`"foo; bar"`); + }); + }); }); }); diff --git a/src/core/server/csp/csp_config.ts b/src/core/server/csp/csp_config.ts index dd0e7ef2dbee4..649c81576ef52 100644 --- a/src/core/server/csp/csp_config.ts +++ b/src/core/server/csp/csp_config.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { config } from './config'; +import { config, FRAME_ANCESTORS_RULE } from './config'; const DEFAULT_CONFIG = Object.freeze(config.schema.validate({})); @@ -32,6 +32,12 @@ export interface ICspConfig { */ readonly warnLegacyBrowsers: boolean; + /** + * Whether or not embedding (using iframes) should be allowed by the CSP. If embedding is disabled *and* no custom rules have been + * defined, a restrictive 'frame-ancestors' rule will be added to the default CSP rules. + */ + readonly disableEmbedding: boolean; + /** * The CSP rules in a formatted directives string for use * in a `Content-Security-Policy` header. @@ -49,6 +55,7 @@ export class CspConfig implements ICspConfig { public readonly rules: string[]; public readonly strict: boolean; public readonly warnLegacyBrowsers: boolean; + public readonly disableEmbedding: boolean; public readonly header: string; /** @@ -58,9 +65,13 @@ export class CspConfig implements ICspConfig { constructor(rawCspConfig: Partial> = {}) { const source = { ...DEFAULT_CONFIG, ...rawCspConfig }; - this.rules = source.rules; + this.rules = [...source.rules]; this.strict = source.strict; this.warnLegacyBrowsers = source.warnLegacyBrowsers; - this.header = source.rules.join('; '); + this.disableEmbedding = source.disableEmbedding; + if (!rawCspConfig.rules?.length && source.disableEmbedding) { + this.rules.push(FRAME_ANCESTORS_RULE); + } + this.header = this.rules.join('; '); } } diff --git a/src/core/server/http/__snapshots__/http_config.test.ts.snap b/src/core/server/http/__snapshots__/http_config.test.ts.snap index 4545396c27b5e..589e4e118991a 100644 --- a/src/core/server/http/__snapshots__/http_config.test.ts.snap +++ b/src/core/server/http/__snapshots__/http_config.test.ts.snap @@ -64,6 +64,13 @@ Object { "ipAllowlist": Array [], }, "rewriteBasePath": false, + "securityResponseHeaders": Object { + "disableEmbedding": false, + "permissionsPolicy": null, + "referrerPolicy": "no-referrer-when-downgrade", + "strictTransportSecurity": null, + "xContentTypeOptions": "nosniff", + }, "socketTimeout": 120000, "ssl": Object { "cipherSuites": Array [ diff --git a/src/core/server/http/http_config.ts b/src/core/server/http/http_config.ts index daf7424b8f8bd..c7e53bb600377 100644 --- a/src/core/server/http/http_config.ts +++ b/src/core/server/http/http_config.ts @@ -14,6 +14,10 @@ import url from 'url'; import { ServiceConfigDescriptor } from '../internal_types'; import { CspConfigType, CspConfig, ICspConfig } from '../csp'; import { ExternalUrlConfig, IExternalUrlConfig } from '../external_url'; +import { + securityResponseHeadersSchema, + parseRawSecurityResponseHeadersConfig, +} from './security_response_headers_config'; const validBasePathRegex = /^\/.*[^\/]$/; const uuidRegexp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; @@ -53,6 +57,7 @@ const configSchema = schema.object( }, } ), + securityResponseHeaders: securityResponseHeadersSchema, customResponseHeaders: schema.recordOf(schema.string(), schema.any(), { defaultValue: {}, }), @@ -171,6 +176,7 @@ export class HttpConfig implements IHttpConfig { allowCredentials: boolean; allowOrigin: string[]; }; + public securityResponseHeaders: Record; public customResponseHeaders: Record; public maxPayload: ByteSizeValue; public basePath?: string; @@ -195,6 +201,10 @@ export class HttpConfig implements IHttpConfig { this.host = rawHttpConfig.host; this.port = rawHttpConfig.port; this.cors = rawHttpConfig.cors; + const { securityResponseHeaders, disableEmbedding } = parseRawSecurityResponseHeadersConfig( + rawHttpConfig.securityResponseHeaders + ); + this.securityResponseHeaders = securityResponseHeaders; this.customResponseHeaders = Object.entries(rawHttpConfig.customResponseHeaders ?? {}).reduce( (headers, [key, value]) => { return { @@ -213,7 +223,7 @@ export class HttpConfig implements IHttpConfig { this.rewriteBasePath = rawHttpConfig.rewriteBasePath; this.ssl = new SslConfig(rawHttpConfig.ssl || {}); this.compression = rawHttpConfig.compression; - this.csp = new CspConfig(rawCspConfig); + this.csp = new CspConfig({ ...rawCspConfig, disableEmbedding }); this.externalUrl = rawExternalUrlConfig; this.xsrf = rawHttpConfig.xsrf; this.requestId = rawHttpConfig.requestId; diff --git a/src/core/server/http/integration_tests/lifecycle_handlers.test.ts b/src/core/server/http/integration_tests/lifecycle_handlers.test.ts index 2f9d393b632f7..8d4cf31a5c705 100644 --- a/src/core/server/http/integration_tests/lifecycle_handlers.test.ts +++ b/src/core/server/http/integration_tests/lifecycle_handlers.test.ts @@ -53,8 +53,16 @@ describe('core lifecycle handlers', () => { }, compression: { enabled: true }, name: kibanaName, + securityResponseHeaders: { + // reflects default config + strictTransportSecurity: null, + xContentTypeOptions: 'nosniff', + referrerPolicy: 'strict-origin-when-cross-origin', + permissionsPolicy: null, + }, customResponseHeaders: { 'some-header': 'some-value', + 'referrer-policy': 'strict-origin', // overrides a header that is defined by securityResponseHeaders }, xsrf: { disableProtection: false, allowlist: [allowlistedTestPath] }, requestId: { @@ -117,6 +125,13 @@ describe('core lifecycle handlers', () => { const testRoute = '/custom_headers/test/route'; const testErrorRoute = '/custom_headers/test/error_route'; + const expectedHeaders = { + [nameHeader]: kibanaName, + 'x-content-type-options': 'nosniff', + 'referrer-policy': 'strict-origin', + 'some-header': 'some-value', + }; + beforeEach(async () => { router.get({ path: testRoute, validate: false }, (context, req, res) => { return res.ok({ body: 'ok' }); @@ -127,36 +142,16 @@ describe('core lifecycle handlers', () => { await server.start(); }); - it('adds the kbn-name header', async () => { - const result = await supertest(innerServer.listener).get(testRoute).expect(200, 'ok'); - const headers = result.header as Record; - expect(headers).toEqual( - expect.objectContaining({ - [nameHeader]: kibanaName, - }) - ); - }); - - it('adds the kbn-name header in case of error', async () => { - const result = await supertest(innerServer.listener).get(testErrorRoute).expect(400); - const headers = result.header as Record; - expect(headers).toEqual( - expect.objectContaining({ - [nameHeader]: kibanaName, - }) - ); - }); - - it('adds the custom headers', async () => { + it('adds the expected headers in case of success', async () => { const result = await supertest(innerServer.listener).get(testRoute).expect(200, 'ok'); const headers = result.header as Record; - expect(headers).toEqual(expect.objectContaining({ 'some-header': 'some-value' })); + expect(headers).toEqual(expect.objectContaining(expectedHeaders)); }); - it('adds the custom headers in case of error', async () => { + it('adds the expected headers in case of error', async () => { const result = await supertest(innerServer.listener).get(testErrorRoute).expect(400); const headers = result.header as Record; - expect(headers).toEqual(expect.objectContaining({ 'some-header': 'some-value' })); + expect(headers).toEqual(expect.objectContaining(expectedHeaders)); }); }); diff --git a/src/core/server/http/lifecycle_handlers.test.ts b/src/core/server/http/lifecycle_handlers.test.ts index cd8caa7c76ab1..e777cbb1c1ff0 100644 --- a/src/core/server/http/lifecycle_handlers.test.ts +++ b/src/core/server/http/lifecycle_handlers.test.ts @@ -241,12 +241,15 @@ describe('customHeaders pre-response handler', () => { expect(toolkit.next).toHaveBeenCalledWith({ headers: { 'kbn-name': 'my-server-name' } }); }); - it('adds the custom headers defined in the configuration', () => { + it('adds the security headers and custom headers defined in the configuration', () => { const config = createConfig({ name: 'my-server-name', - customResponseHeaders: { + securityResponseHeaders: { headerA: 'value-A', - headerB: 'value-B', + headerB: 'value-B', // will be overridden by the custom response header below + }, + customResponseHeaders: { + headerB: 'x', }, }); const handler = createCustomHeadersPreResponseHandler(config as HttpConfig); @@ -258,7 +261,7 @@ describe('customHeaders pre-response handler', () => { headers: { 'kbn-name': 'my-server-name', headerA: 'value-A', - headerB: 'value-B', + headerB: 'x', }, }); }); diff --git a/src/core/server/http/lifecycle_handlers.ts b/src/core/server/http/lifecycle_handlers.ts index a1fae89b68e11..eed24c8071eaf 100644 --- a/src/core/server/http/lifecycle_handlers.ts +++ b/src/core/server/http/lifecycle_handlers.ts @@ -62,12 +62,12 @@ export const createVersionCheckPostAuthHandler = (kibanaVersion: string): OnPost }; export const createCustomHeadersPreResponseHandler = (config: HttpConfig): OnPreResponseHandler => { - const serverName = config.name; - const customHeaders = config.customResponseHeaders; + const { name: serverName, securityResponseHeaders, customResponseHeaders } = config; return (request, response, toolkit) => { const additionalHeaders = { - ...customHeaders, + ...securityResponseHeaders, + ...customResponseHeaders, [KIBANA_NAME_HEADER]: serverName, }; diff --git a/src/core/server/http/router/route.ts b/src/core/server/http/router/route.ts index 77b40ca5995bb..ea70f1b4f543b 100644 --- a/src/core/server/http/router/route.ts +++ b/src/core/server/http/router/route.ts @@ -70,7 +70,7 @@ export interface RouteConfigOptionsBody { /** * Limits the size of incoming payloads to the specified byte count. Allowing very large payloads may cause the server to run out of memory. * - * Default value: The one set in the kibana.yml config file under the parameter `server.maxPayloadBytes`. + * Default value: The one set in the kibana.yml config file under the parameter `server.maxPayload`. */ maxBytes?: number; diff --git a/src/core/server/http/security_response_headers_config.test.ts b/src/core/server/http/security_response_headers_config.test.ts new file mode 100644 index 0000000000000..b1c8bb23102f5 --- /dev/null +++ b/src/core/server/http/security_response_headers_config.test.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + securityResponseHeadersSchema as schema, + parseRawSecurityResponseHeadersConfig as parse, +} from './security_response_headers_config'; + +describe('parseRawSecurityResponseHeadersConfig', () => { + it('returns default values', () => { + const config = schema.validate({}); + const result = parse(config); + expect(result.disableEmbedding).toBe(false); + expect(result.securityResponseHeaders).toMatchInlineSnapshot(` + Object { + "Referrer-Policy": "no-referrer-when-downgrade", + "X-Content-Type-Options": "nosniff", + } + `); + }); + + describe('strictTransportSecurity', () => { + it('a custom value results in the expected Strict-Transport-Security header', () => { + const strictTransportSecurity = 'max-age=31536000; includeSubDomains'; + const config = schema.validate({ strictTransportSecurity }); + const result = parse(config); + expect(result.securityResponseHeaders['Strict-Transport-Security']).toEqual( + strictTransportSecurity + ); + }); + + it('a null value removes the Strict-Transport-Security header', () => { + const config = schema.validate({ strictTransportSecurity: null }); + const result = parse(config); + expect(result.securityResponseHeaders['Strict-Transport-Security']).toBeUndefined(); + }); + }); + + describe('xContentTypeOptions', () => { + it('a custom value results in the expected X-Content-Type-Options header', () => { + const xContentTypeOptions = 'nosniff'; // there is no other valid value to test with + const config = schema.validate({ xContentTypeOptions }); + const result = parse(config); + expect(result.securityResponseHeaders['X-Content-Type-Options']).toEqual(xContentTypeOptions); + }); + + it('a null value removes the X-Content-Type-Options header', () => { + const config = schema.validate({ xContentTypeOptions: null }); + const result = parse(config); + expect(result.securityResponseHeaders['X-Content-Type-Options']).toBeUndefined(); + }); + }); + + describe('referrerPolicy', () => { + it('a custom value results in the expected Referrer-Policy header', () => { + const referrerPolicy = 'strict-origin-when-cross-origin'; + const config = schema.validate({ referrerPolicy }); + const result = parse(config); + expect(result.securityResponseHeaders['Referrer-Policy']).toEqual(referrerPolicy); + }); + + it('a null value removes the Referrer-Policy header', () => { + const config = schema.validate({ referrerPolicy: null }); + const result = parse(config); + expect(result.securityResponseHeaders['Referrer-Policy']).toBeUndefined(); + }); + }); + + describe('permissionsPolicy', () => { + it('a custom value results in the expected Permissions-Policy header', () => { + const permissionsPolicy = 'display-capture=(self)'; + const config = schema.validate({ permissionsPolicy }); + const result = parse(config); + expect(result.securityResponseHeaders['Permissions-Policy']).toEqual(permissionsPolicy); + }); + + it('a null value removes the Permissions-Policy header', () => { + const config = schema.validate({ permissionsPolicy: null }); + const result = parse(config); + expect(result.securityResponseHeaders['Permissions-Policy']).toBeUndefined(); + }); + }); + + describe('disableEmbedding', () => { + it('a true value results in the expected X-Frame-Options header and expected disableEmbedding result value', () => { + const config = schema.validate({ disableEmbedding: true }); + const result = parse(config); + expect(result.securityResponseHeaders['X-Frame-Options']).toMatchInlineSnapshot( + `"SAMEORIGIN"` + ); + expect(result.disableEmbedding).toBe(true); + }); + }); +}); diff --git a/src/core/server/http/security_response_headers_config.ts b/src/core/server/http/security_response_headers_config.ts new file mode 100644 index 0000000000000..917d737d59297 --- /dev/null +++ b/src/core/server/http/security_response_headers_config.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; + +export const securityResponseHeadersSchema = schema.object({ + strictTransportSecurity: schema.oneOf([schema.string(), schema.literal(null)], { + // See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security + defaultValue: null, + }), + xContentTypeOptions: schema.oneOf([schema.literal('nosniff'), schema.literal(null)], { + // See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options + defaultValue: 'nosniff', + }), + referrerPolicy: schema.oneOf( + // See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy + [ + schema.literal('no-referrer'), + schema.literal('no-referrer-when-downgrade'), + schema.literal('origin'), + schema.literal('origin-when-cross-origin'), + schema.literal('same-origin'), + schema.literal('strict-origin'), + schema.literal('strict-origin-when-cross-origin'), + schema.literal('unsafe-url'), + schema.literal(null), + ], + { defaultValue: 'no-referrer-when-downgrade' } + ), + permissionsPolicy: schema.oneOf([schema.string(), schema.literal(null)], { + // See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy + // Note: Feature-Policy is superseded by Permissions-Policy; the link above is temporary until MDN releases an updated page + defaultValue: null, + }), + disableEmbedding: schema.boolean({ defaultValue: false }), // is used to control X-Frame-Options and CSP headers +}); + +/** + * Parses raw security header config info, returning an object with the appropriate header keys and values. + * + * @param raw + * @internal + */ +export function parseRawSecurityResponseHeadersConfig( + raw: TypeOf +) { + const securityResponseHeaders: Record = {}; + const { disableEmbedding } = raw; + + if (raw.strictTransportSecurity) { + securityResponseHeaders['Strict-Transport-Security'] = raw.strictTransportSecurity; + } + if (raw.xContentTypeOptions) { + securityResponseHeaders['X-Content-Type-Options'] = raw.xContentTypeOptions; + } + if (raw.referrerPolicy) { + securityResponseHeaders['Referrer-Policy'] = raw.referrerPolicy; + } + if (raw.permissionsPolicy) { + securityResponseHeaders['Permissions-Policy'] = raw.permissionsPolicy; + } + if (disableEmbedding) { + securityResponseHeaders['X-Frame-Options'] = 'SAMEORIGIN'; + } + + return { securityResponseHeaders, disableEmbedding }; +} diff --git a/src/core/server/http/test_utils.ts b/src/core/server/http/test_utils.ts index b9b877e193fbd..c6368a7166bc3 100644 --- a/src/core/server/http/test_utils.ts +++ b/src/core/server/http/test_utils.ts @@ -38,6 +38,7 @@ configService.atPath.mockImplementation((path) => { disableProtection: true, allowlist: [], }, + securityResponseHeaders: {}, customResponseHeaders: {}, requestId: { allowFromAnyIp: true, diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index e8f9dab435754..e5804b3c9fc58 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -442,6 +442,13 @@ export interface CoreConfigUsageData { supportedProtocols: string[]; clientAuthentication: 'none' | 'optional' | 'required'; }; + securityResponseHeaders: { + strictTransportSecurity: string; + xContentTypeOptions: string; + referrerPolicy: string; + permissionsPolicyConfigured: boolean; + disableEmbedding: boolean; + }; }; // (undocumented) logging: { @@ -757,6 +764,8 @@ export class CspConfig implements ICspConfig { // (undocumented) static readonly DEFAULT: CspConfig; // (undocumented) + readonly disableEmbedding: boolean; + // (undocumented) readonly header: string; // (undocumented) readonly rules: string[]; @@ -1113,6 +1122,7 @@ export type IContextProvider Date: Mon, 19 Apr 2021 13:15:18 -0400 Subject: [PATCH 42/82] [Fleet] Fix deprecation of config variable xpack.fleet.agents.kibana (#97480) --- x-pack/plugins/fleet/server/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/server/index.ts b/x-pack/plugins/fleet/server/index.ts index c1baa43f4d588..25298d991230d 100644 --- a/x-pack/plugins/fleet/server/index.ts +++ b/x-pack/plugins/fleet/server/index.ts @@ -34,8 +34,7 @@ export const config: PluginConfigDescriptor = { deprecations: ({ renameFromRoot, unused }) => [ renameFromRoot('xpack.ingestManager', 'xpack.fleet'), renameFromRoot('xpack.fleet.fleet', 'xpack.fleet.agents'), - unused('agents.kibana.ca_sha256'), - unused('agents.kibana.host'), + unused('agents.kibana'), unused('agents.maxConcurrentConnections'), unused('agents.agentPolicyRolloutRateLimitIntervalMs'), unused('agents.agentPolicyRolloutRateLimitRequestPerInterval'), From 77fe59d58f971cabc875da81567a580b326b246f Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Mon, 19 Apr 2021 19:26:05 +0200 Subject: [PATCH 43/82] Drilldown cloning (#91959) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 💡 remove switch statement * feat: 🎸 improve stories * refactor: 💡 remove component * refactor: 💡 simplify component * feat: 🎸 introduce React context for drilldowns flyout * refactor: 💡 rename drilldown manager component * refactor: 💡 rename drilldown manager in example plugin * refactor: 💡 rename folder to "containers" * feat: 🎸 use drilldown context to store UI state * chore: 🤖 fix linter errors * refactor: 💡 move Drilldown Manager into its own folder * feat: 🎸 add drilldown state management * feat: 🎸 add component * chore: 🤖 clean up component props * feat: 🎸 add component * feat: 🎸 connect action factory picker component * chore: 🤖 cleanup * feat: 🎸 start work on * feat: 🎸 add component * test: 💍 add stories * feat: 🎸 add component * refactor: 💡 remove ActionFactory from * feat: 🎸 connect component * feat: 🎸 improve new drilldown connected form * fix: 🐛 correct TypeScript types * feat: 🎸 show trigger intersection in the UI * feat: 🎸 add component * feat: 🎸 show connected component * feat: 🎸 use a single action factory control * fix: 🐛 remove unused props * refactor: 💡 improve create drilldown form * fix: 🐛 correct hello bar close callback * feat: 🎸 connect welcome message state to local storage * fix: 🐛 correct TypeScript errors * fix: 🐛 hide correctly hello bar * feat: 🎸 add drilldown creation logic * feat: 🎸 connect event list state * fix: 🐛 correct story props * fix: 🐛 correct typescript errors * feat: 🎸 navigate to list view when drilldown is created * feat: 🎸 add EUI tabs * feat: 🎸 connect route state to tabs * refactor: 💡 move flyout content into a separate component * refactor: 💡 move manager tabs into a separate component * chore: 🤖 delete unused variables * feat: 🎸 make drilldowns title dynamic * docs: ✏️ update README * feat: 🎸 add component * feat: 🎸 make flyout footer dynamic * refactor: 💡 make action factory state depend on the route * feat: 🎸 create standalone new drilldown form * fix: 🐛 support i18n in new drilldown form * feat: 🎸 add space between action factory picker * refactor: 💡 simplify * feat: 🎸 add back chevron button to drilldown flyout * chore: 🤖 remove unused translations * chore: 🤖 delete unused translation file * feat: 🎸 add and improve title comp * feat: 🎸 improve * refactor: 💡 improve variable name * feat: 🎸 add isValid() to drilldown state * refactor: 💡 move drilldown hello bar into a seprate component * feat: 🎸 show drilldown list on "Manage" tab * refactor: 💡 improve drilldown list component * feat: 🎸 connect drill list comp to delete and edit functional * feat: 🎸 support form disabling when drill creation in progress * feat: 🎸 connect drilldown edit form * feat: 🎸 use /manage route for editing drilldowns * fix: 🐛 render constant action factory in edit mode * refactor: 💡 move drilldown footer submit button in a sep comp * feat: 🎸 connect editing to drilldown edit form * feat: 🎸 disable edit buttons when list has selection * chore: 🤖 remove unused code * feat: 🎸 show error if delete fails * chore: 🤖 remove legacy code * feat: 🎸 improve drilldown table component * fix: 🐛 fix "Trigger" translation * fix: 🐛 import correct drilldown table item * feat: 🎸 handle empty name errors * feat: 🎸 track config error in drilldown state * feat: 🎸 track drilldown state trigger errors * fix: 🐛 pre-select trigger if only one trigger is available * feat: 🎸 add drilldown template interface * feat: 🎸 progress on drilldown cloning list * feat: 🎸 use table view to display drilldown cloning templates * feat: 🎸 generate drilldown templates from embeddable siblings * feat: 🎸 improve drilldown template generation logic * feat: 🎸 improve drilldown template preview * feat: 🎸 improve start from template table view * feat: 🎸 show number of items to be cloned * feat: 🎸 add ID to drilldown templates * feat: 🎸 implement basic cloning functionality * feat: 🎸 add ability to create drilldown from existing one * feat: 🎸 improve cloning behaviour * feat: 🎸 improve icon of templates * feat: 🎸 remove "Start from template" accordion * feat: 🎸 improve cloning table view * feat: 🎸 add "Triggers" column * feat: 🎸 enable drilldown actions in "edit" mode * fix: 🐛 reset drilldown state cache by factory on new creation * refactor: 💡 use in-memory table for drilldown template list * feat: 🎸 add search box to drilldown template in-memory table * feat: 🎸 show back chevron on no steps back, to close flyout * feat: 🎸 show notification when drilldown was just cloned * feat: 🎸 add i18n to cloning notification, and move to sep comp * feat: 🎸 add support for plural and singular in translation * feat: 🎸 make new drilldown names unique with (copy x) at end * feat: 🎸 rename cloning to copying * feat: 🎸 show incompatible trigger warning in template list * refactor: 💡 craete text with icon component * feat: 🎸 show trigger warning in manage view * refactor: 💡 use in drilldown table view * feat: 🎸 add component * feat: 🎸 show tooltip on incompatible icon hover * feat: 🎸 unify tooltips in component * feat: 🎸 enable sorting in drilldown tables * fix: 🐛 correct ui actions x-pack typescript errors * fix: 🐛 correct ui actions example plugin errors * docs: ✏️ update autogenerated docs * chore: 🤖 remove unused translations * test: 💍 remove implementation from todo placeholders * test: 💍 fix dashboard drilldown functional test * chore: 🤖 remove unused constants * test: 💍 fix url drilldown functional test * test: 💍 add drilldown manager state tests * feat: 🎸 dont show back button when no more steps back * feat: 🎸 pre-fill in drilldown name * feat: 🎸 add copy suffix when creating new drilldown * feat: 🎸 close flyout if opened in create mode * feat: 🎸 dont close flyout if user navigated to "manage" tab * feat: 🎸 show smaller notification message on cloning * feat: 🎸 add "(copy X)" text when cloning/copying drilldowns * feat: 🎸 make copy prefixes start from "(copy)" * feat: 🎸 add link to dismiss notification * feat: 🎸 rename "Clone (x)" button to "Copy (x)" * feat: 🎸 rename tempalte table last column copy button * feat: 🎸 use "copied" terminology in notification * feat: 🎸 add "Copy existing drilldown" label to template picker * feat: 🎸 use "auto" layout on drilldown template picker table * test: 💍 add drilldown manager tests * feat: 🎸 swap label for title --- ...ns-embeddable-public.container.children.md | 2 +- ...ctionspresentable.getdisplaynametooltip.md | 2 +- .../public/lib/containers/container.ts | 2 +- src/plugins/embeddable/public/public.api.md | 2 +- src/plugins/ui_actions/public/public.api.md | 2 +- .../ui_actions/public/util/presentable.ts | 2 +- .../drilldowns_with_embeddable_example.tsx | 13 +- .../drilldowns_without_embeddable_example.tsx | 13 +- ...thout_embeddable_single_button_example.tsx | 7 +- .../public/plugin.ts | 8 +- .../drilldowns/actions/drilldown_shared.ts | 48 ++ .../flyout_create_drilldown.tsx | 20 +- .../flyout_edit_drilldown.tsx | 11 +- .../translations/translations/ja-JP.json | 11 - .../translations/translations/zh-CN.json | 11 - .../action_factory_picker.tsx | 52 ++ .../action_factory_picker}/index.ts | 2 +- .../action_wizard/action_wizard.tsx | 36 +- .../components/presentable_picker/i18n.ts | 29 ++ .../presentable_picker}/index.ts | 2 +- .../presentable_picker.stories.tsx | 152 ++++++ .../presentable_picker/presentable_picker.tsx | 57 +++ .../presentable_picker_item.tsx | 63 +++ .../components/presentable_picker/styles.scss | 5 + ...ected_flyout_manage_drilldowns.stories.tsx | 49 -- ...onnected_flyout_manage_drilldowns.test.tsx | 324 ------------ .../connected_flyout_manage_drilldowns.tsx | 245 --------- .../i18n.ts | 28 - .../test_data.ts | 87 ---- .../flyout_drilldown_wizard.stories.tsx | 69 --- .../flyout_drilldown_wizard.tsx | 248 --------- .../flyout_list_manage_drilldowns.stories.tsx | 23 - .../flyout_list_manage_drilldowns.tsx | 56 -- .../form_drilldown_wizard.stories.tsx | 38 -- .../form_drilldown_wizard.test.tsx | 73 --- .../form_drilldown_wizard.tsx | 143 ------ .../components/form_drilldown_wizard/i18n.ts | 36 -- .../components/list_manage_drilldowns/i18n.ts | 40 -- .../list_manage_drilldowns.stories.tsx | 37 -- .../public/drilldowns/components/types.ts | 16 - .../drilldowns/drilldown_manager/README.md | 12 + .../action_factory/action_factory.tsx | 132 +++++ .../components/action_factory}/index.ts | 2 +- .../button_submit/button_submit.tsx | 27 + .../components/button_submit/index.ts | 8 + .../drilldown_form/drilldown_form.stories.tsx | 62 +++ .../drilldown_form/drilldown_form.tsx | 92 ++++ .../components/drilldown_form}/index.tsx | 2 +- .../drilldown_hello_bar.stories.tsx | 0 .../drilldown_hello_bar.tsx | 17 +- .../components/drilldown_hello_bar/i18n.ts | 0 .../components/drilldown_hello_bar/index.tsx | 0 .../drilldown_table.stories.tsx | 86 ++++ .../drilldown_table/drilldown_table.test.tsx} | 20 +- .../drilldown_table/drilldown_table.tsx} | 143 +++--- .../components/drilldown_table/i18n.ts | 65 +++ .../components/drilldown_table/index.tsx | 8 + .../drilldown_template_table.tsx | 137 +++++ .../drilldown_template_table/i18n.ts | 62 +++ .../drilldown_template_table/index.tsx | 8 + .../flyout_frame/flyout_frame.stories.tsx | 0 .../flyout_frame/flyout_frame.test.tsx | 0 .../components/flyout_frame/flyout_frame.tsx | 0 .../components/flyout_frame/i18n.ts | 0 .../components/flyout_frame/index.tsx | 0 .../components/text_with_icon/index.tsx | 8 + .../text_with_icon/text_with_icon.tsx | 60 +++ .../components/trigger_line_item/index.tsx | 8 + .../trigger_line_item/trigger_line_item.tsx | 40 ++ .../components/trigger_picker/index.ts | 9 + .../trigger_picker/trigger_picker.stories.tsx | 102 ++++ .../trigger_picker/trigger_picker.tsx | 90 ++++ .../trigger_picker/trigger_picker_item.tsx | 73 +++ .../drilldown_manager/components/types.ts | 8 + .../action_factory_picker.tsx | 31 ++ .../containers/action_factory_picker/index.ts | 8 + .../action_factory_view.tsx | 33 ++ .../containers/action_factory_view/index.ts | 8 + .../containers/context/context.tsx | 25 + .../containers/context/index.ts | 8 + .../create_drilldown_form.tsx | 63 +++ .../containers/create_drilldown_form/index.ts | 8 + .../drilldown_list/cloning_notification.tsx | 53 ++ .../drilldown_list/drilldown_list.tsx | 47 ++ .../containers/drilldown_list/index.ts | 8 + .../create_public_drilldown_manager.tsx | 31 ++ .../drilldown_manager/drilldown_manager.tsx | 34 ++ .../drilldown_manager_content.tsx | 22 + .../containers/drilldown_manager}/index.ts | 3 +- .../drilldown_manager_footer.tsx | 26 + .../drilldown_manager_footer/index.ts | 8 + .../drilldown_manager_title.tsx | 26 + .../drilldown_manager_title/index.ts | 8 + .../drilldown_state_form.tsx | 51 ++ .../containers/drilldown_state_form/index.ts | 8 + .../edit_drilldown_form.tsx | 75 +++ .../containers/edit_drilldown_form/index.ts | 8 + .../create_drilldown_form.tsx | 45 ++ .../edit_drilldown_form.tsx | 65 +++ .../form_drilldown_wizard.tsx | 29 ++ .../containers/form_drilldown_wizard}/i18n.ts | 14 - .../form_drilldown_wizard/index.ts} | 0 .../containers/hello_bar/hello_bar.tsx | 24 + .../containers/hello_bar/index.ts | 8 + .../drilldown_manager/containers/index.ts | 8 + .../containers/tabs/index.ts | 8 + .../containers/tabs/tabs.tsx | 66 +++ .../containers/template_picker}/i18n.ts | 7 +- .../containers/template_picker/index.ts | 8 + .../template_picker/template_list.tsx | 63 +++ .../template_picker/template_picker.tsx | 20 + .../hooks/use_sync_observable.ts | 39 ++ .../drilldowns/drilldown_manager/index.ts | 9 + .../state/drilldown_manager_state.test.tsx | 319 ++++++++++++ .../state/drilldown_manager_state.ts | 481 ++++++++++++++++++ .../state/drilldown_state.ts | 242 +++++++++ .../state}/i18n.ts | 28 + .../drilldown_manager/state/index.ts | 9 + .../drilldowns/drilldown_manager/types.ts | 162 ++++++ ...le_action_factories_for_current_context.ts | 36 -- .../hooks/use_drilldown_state_manager.tsx | 86 ---- .../drilldowns/hooks/use_welcome_message.ts | 23 - .../public/drilldowns/index.ts | 2 +- .../public/dynamic_actions/action_factory.ts | 24 +- .../dynamic_actions/dynamic_action_manager.ts | 5 + .../ui_actions_enhanced/public/index.ts | 5 +- .../ui_actions_enhanced/public/mocks.ts | 2 +- .../ui_actions_enhanced/public/plugin.ts | 6 +- .../dashboard_to_dashboard_drilldown.ts | 6 +- .../drilldowns/dashboard_to_url_drilldown.ts | 3 +- .../services/dashboard/drilldowns_manage.ts | 22 - 131 files changed, 3930 insertions(+), 1881 deletions(-) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/action_factory_picker.tsx rename x-pack/plugins/ui_actions_enhanced/public/{drilldowns/components/flyout_drilldown_wizard => components/action_factory_picker}/index.ts (85%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/i18n.ts rename x-pack/plugins/ui_actions_enhanced/public/{drilldowns/components/flyout_list_manage_drilldowns => components/presentable_picker}/index.ts (83%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.stories.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker_item.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/styles.scss delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/test_data.ts delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.stories.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.stories.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/i18n.ts delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.stories.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/types.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/README.md create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/action_factory.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/connected_flyout_manage_drilldowns => drilldown_manager/components/action_factory}/index.ts (82%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/button_submit.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.stories.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/list_manage_drilldowns => drilldown_manager/components/drilldown_form}/index.tsx (85%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/drilldown_hello_bar/drilldown_hello_bar.stories.tsx (100%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/drilldown_hello_bar/drilldown_hello_bar.tsx (84%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/drilldown_hello_bar/i18n.ts (100%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/drilldown_hello_bar/index.tsx (100%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.stories.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/list_manage_drilldowns/list_manage_drilldowns.test.tsx => drilldown_manager/components/drilldown_table/drilldown_table.test.tsx} (74%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/list_manage_drilldowns/list_manage_drilldowns.tsx => drilldown_manager/components/drilldown_table/drilldown_table.tsx} (51%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/i18n.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/index.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/drilldown_template_table.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/i18n.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/index.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/flyout_frame/flyout_frame.stories.tsx (100%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/flyout_frame/flyout_frame.test.tsx (100%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/flyout_frame/flyout_frame.tsx (100%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/flyout_frame/i18n.ts (100%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{ => drilldown_manager}/components/flyout_frame/index.tsx (100%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/index.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/text_with_icon.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/index.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/trigger_line_item.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.stories.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker_item.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/types.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/action_factory_picker.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/action_factory_view.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/context.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/create_drilldown_form.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/cloning_notification.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/drilldown_list.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/create_public_drilldown_manager.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager_content.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components => drilldown_manager/containers/drilldown_manager}/index.ts (74%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/drilldown_manager_footer.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/drilldown_manager_title.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/drilldown_state_form.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/edit_drilldown_form.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/create_drilldown_form.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/edit_drilldown_form.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/form_drilldown_wizard.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/flyout_drilldown_wizard => drilldown_manager/containers/form_drilldown_wizard}/i18n.ts (68%) rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/form_drilldown_wizard/index.tsx => drilldown_manager/containers/form_drilldown_wizard/index.ts} (100%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/hello_bar.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/tabs.tsx rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{components/flyout_list_manage_drilldowns => drilldown_manager/containers/template_picker}/i18n.ts (57%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_list.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_picker.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/hooks/use_sync_observable.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.test.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_state.ts rename x-pack/plugins/ui_actions_enhanced/public/drilldowns/{hooks => drilldown_manager/state}/i18n.ts (76%) create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/index.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/types.ts delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx delete mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.container.children.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.container.children.md index e8f140219ed9c..a334f37ba3e7d 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.container.children.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.container.children.md @@ -7,7 +7,7 @@ Signature: ```typescript -protected readonly children: { +readonly children: { [key: string]: IEmbeddable | ErrorEmbeddable; }; ``` diff --git a/docs/development/plugins/ui_actions/public/kibana-plugin-plugins-ui_actions-public.uiactionspresentable.getdisplaynametooltip.md b/docs/development/plugins/ui_actions/public/kibana-plugin-plugins-ui_actions-public.uiactionspresentable.getdisplaynametooltip.md index 8fc859d5713e6..a35f455f7af25 100644 --- a/docs/development/plugins/ui_actions/public/kibana-plugin-plugins-ui_actions-public.uiactionspresentable.getdisplaynametooltip.md +++ b/docs/development/plugins/ui_actions/public/kibana-plugin-plugins-ui_actions-public.uiactionspresentable.getdisplaynametooltip.md @@ -9,7 +9,7 @@ Returns tooltip text which should be displayed when user hovers this object. Sho Signature: ```typescript -getDisplayNameTooltip(context: Context): string; +getDisplayNameTooltip?(context: Context): string; ``` ## Parameters diff --git a/src/plugins/embeddable/public/lib/containers/container.ts b/src/plugins/embeddable/public/lib/containers/container.ts index 24af29d0cee56..fabe3cd32f34b 100644 --- a/src/plugins/embeddable/public/lib/containers/container.ts +++ b/src/plugins/embeddable/public/lib/containers/container.ts @@ -32,7 +32,7 @@ export abstract class Container< extends Embeddable implements IContainer { public readonly isContainer: boolean = true; - protected readonly children: { + public readonly children: { [key: string]: IEmbeddable | ErrorEmbeddable; } = {}; diff --git a/src/plugins/embeddable/public/public.api.md b/src/plugins/embeddable/public/public.api.md index d522a4e5fa8e8..2a577e6167be5 100644 --- a/src/plugins/embeddable/public/public.api.md +++ b/src/plugins/embeddable/public/public.api.md @@ -160,7 +160,7 @@ export abstract class Container = { // (undocumented) addNewEmbeddable = IEmbeddable>(type: string, explicitInput: Partial): Promise; // (undocumented) - protected readonly children: { + readonly children: { [key: string]: IEmbeddable | ErrorEmbeddable; }; // (undocumented) diff --git a/src/plugins/ui_actions/public/public.api.md b/src/plugins/ui_actions/public/public.api.md index 44d911d336b19..f8c473a3e2c0a 100644 --- a/src/plugins/ui_actions/public/public.api.md +++ b/src/plugins/ui_actions/public/public.api.md @@ -138,7 +138,7 @@ export interface UiActionsActionDefinition exte // @public export interface UiActionsPresentable { getDisplayName(context: Context): string; - getDisplayNameTooltip(context: Context): string; + getDisplayNameTooltip?(context: Context): string; getHref?(context: Context): Promise; getIconType(context: Context): string | undefined; readonly grouping?: UiActionsPresentableGrouping; diff --git a/src/plugins/ui_actions/public/util/presentable.ts b/src/plugins/ui_actions/public/util/presentable.ts index 319a271ceb726..9e690b9ef3c08 100644 --- a/src/plugins/ui_actions/public/util/presentable.ts +++ b/src/plugins/ui_actions/public/util/presentable.ts @@ -43,7 +43,7 @@ export interface Presentable { * Returns tooltip text which should be displayed when user hovers this object. * Should return empty string if tooltip should not be displayed. */ - getDisplayNameTooltip(context: Context): string; + getDisplayNameTooltip?(context: Context): string; /** * This method should return a link if this item can be clicked on. The link diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx index e6351ec401d88..792b978c99241 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx @@ -46,7 +46,7 @@ export const DrilldownsWithEmbeddableExample: React.FC = () => { ); const [showManager, setShowManager] = React.useState(false); const [openPopup, setOpenPopup] = React.useState(false); - const viewRef = React.useRef<'create' | 'manage'>('create'); + const viewRef = React.useRef<'/create' | '/manage'>('/create'); const panels: EuiContextMenuPanelDescriptor[] = [ { @@ -57,7 +57,7 @@ export const DrilldownsWithEmbeddableExample: React.FC = () => { icon: 'plusInCircle', onClick: () => { setOpenPopup(false); - viewRef.current = 'create'; + viewRef.current = '/create'; setShowManager((x) => !x); }, }, @@ -66,7 +66,7 @@ export const DrilldownsWithEmbeddableExample: React.FC = () => { icon: 'list', onClick: () => { setOpenPopup(false); - viewRef.current = 'manage'; + viewRef.current = '/manage'; setShowManager((x) => !x); }, }, @@ -122,12 +122,13 @@ export const DrilldownsWithEmbeddableExample: React.FC = () => { {showManager && ( setShowManager(false)} aria-labelledby="Drilldown Manager"> - setShowManager(false)} - viewMode={viewRef.current} + setShowManager(false)} /> )} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx index d46c146b49916..a0e1f38543c29 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx @@ -32,7 +32,7 @@ export const DrilldownsWithoutEmbeddableExample: React.FC = () => { const { plugins, managerWithoutEmbeddable } = useUiActions(); const [showManager, setShowManager] = React.useState(false); const [openPopup, setOpenPopup] = React.useState(false); - const viewRef = React.useRef<'create' | 'manage'>('create'); + const viewRef = React.useRef<'/create' | '/manage'>('/create'); const panels: EuiContextMenuPanelDescriptor[] = [ { @@ -43,7 +43,7 @@ export const DrilldownsWithoutEmbeddableExample: React.FC = () => { icon: 'plusInCircle', onClick: () => { setOpenPopup(false); - viewRef.current = 'create'; + viewRef.current = '/create'; setShowManager((x) => !x); }, }, @@ -52,7 +52,7 @@ export const DrilldownsWithoutEmbeddableExample: React.FC = () => { icon: 'list', onClick: () => { setOpenPopup(false); - viewRef.current = 'manage'; + viewRef.current = '/manage'; setShowManager((x) => !x); }, }, @@ -116,11 +116,12 @@ export const DrilldownsWithoutEmbeddableExample: React.FC = () => { {showManager && ( setShowManager(false)} aria-labelledby="Drilldown Manager"> - setShowManager(false)} - viewMode={viewRef.current} + setShowManager(false)} /> )} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx index 7c19b091a8948..2d877eea7ce1f 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx @@ -13,7 +13,6 @@ import { sampleApp2ClickContext, SAMPLE_APP2_CLICK_TRIGGER } from '../../trigger export const DrilldownsWithoutEmbeddableSingleButtonExample: React.FC = () => { const { plugins, managerWithoutEmbeddableSingleButton } = useUiActions(); const [showManager, setShowManager] = React.useState(false); - const viewRef = React.useRef<'create' | 'manage'>('create'); return ( <> @@ -50,11 +49,11 @@ export const DrilldownsWithoutEmbeddableSingleButtonExample: React.FC = () => { {showManager && ( setShowManager(false)} aria-labelledby="Drilldown Manager"> - setShowManager(false)} - viewMode={viewRef.current} + setShowManager(false)} /> )} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts index 7ab3b1feb0672..8496450745190 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts +++ b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts @@ -86,9 +86,9 @@ export class UiActionsEnhancedExamplesPlugin const { core: coreStart, plugins: pluginsStart, self } = start(); const handle = coreStart.overlays.openFlyout( toMountPoint( - h(pluginsStart.uiActionsEnhanced.FlyoutManageDrilldowns, { + h(pluginsStart.uiActionsEnhanced.DrilldownManager, { onClose: () => handle.close(), - viewMode: 'create', + initialRoute: '/create', dynamicActionManager: self.managerWithoutEmbeddableSingleButton, triggers: [SAMPLE_APP2_CLICK_TRIGGER], placeContext: {}, @@ -111,9 +111,9 @@ export class UiActionsEnhancedExamplesPlugin const { core: coreStart, plugins: pluginsStart, self } = start(); const handle = coreStart.overlays.openFlyout( toMountPoint( - h(pluginsStart.uiActionsEnhanced.FlyoutManageDrilldowns, { + h(pluginsStart.uiActionsEnhanced.DrilldownManager, { onClose: () => handle.close(), - viewMode: 'manage', + initialRoute: '/manage', dynamicActionManager: self.managerWithoutEmbeddableSingleButton, triggers: [SAMPLE_APP2_CLICK_TRIGGER], placeContext: { sampleApp2ClickContext }, diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts index c42bbde22ce31..ce96b3497e9ff 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts @@ -9,7 +9,11 @@ import { APPLY_FILTER_TRIGGER } from '../../../../../../../src/plugins/data/publ import { SELECT_RANGE_TRIGGER, VALUE_CLICK_TRIGGER, + IEmbeddable, + Container as EmbeddableContainer, } from '../../../../../../../src/plugins/embeddable/public'; +import { isEnhancedEmbeddable } from '../../../../../embeddable_enhanced/public'; +import { UiActionsEnhancedDrilldownTemplate as DrilldownTemplate } from '../../../../../ui_actions_enhanced/public'; /** * We know that VALUE_CLICK_TRIGGER and SELECT_RANGE_TRIGGER are also triggering APPLY_FILTER_TRIGGER. @@ -31,3 +35,47 @@ export function ensureNestedTriggers(triggers: string[]): string[] { return triggers; } + +const isEmbeddableContainer = (x: unknown): x is EmbeddableContainer => + x instanceof EmbeddableContainer; + +/** + * Given a dashboard panel embeddable, it will find the parent (dashboard + * container embeddable), then iterate through all the dashboard panels and + * generate DrilldownTemplate for each existing drilldown. + */ +export const createDrilldownTemplatesFromSiblings = ( + embeddable: IEmbeddable +): DrilldownTemplate[] => { + const templates: DrilldownTemplate[] = []; + const embeddableId = embeddable.id; + + const container = embeddable.getRoot(); + + if (!container) return templates; + if (!isEmbeddableContainer(container)) return templates; + + const childrenIds = (container as EmbeddableContainer).getChildIds(); + + for (const childId of childrenIds) { + const child = (container as EmbeddableContainer).getChild(childId); + if (child.id === embeddableId) continue; + if (!isEnhancedEmbeddable(child)) continue; + const events = child.enhancements.dynamicActions.state.get().events; + + for (const event of events) { + const template: DrilldownTemplate = { + id: event.eventId, + name: event.action.name, + icon: 'dashboardApp', + description: child.getTitle() || child.id, + config: event.action.config, + factoryId: event.action.factoryId, + triggers: event.triggers, + }; + templates.push(template); + } + } + + return templates; +}; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx index 2f91cdc71581c..4c0db8f317e51 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx @@ -9,17 +9,17 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { Action } from '../../../../../../../../src/plugins/ui_actions/public'; import { toMountPoint } from '../../../../../../../../src/plugins/kibana_react/public'; -import { - isEnhancedEmbeddable, - embeddableEnhancedDrilldownGrouping, -} from '../../../../../../embeddable_enhanced/public'; import { CONTEXT_MENU_TRIGGER, EmbeddableContext, } from '../../../../../../../../src/plugins/embeddable/public'; +import { + isEnhancedEmbeddable, + embeddableEnhancedDrilldownGrouping, +} from '../../../../../../embeddable_enhanced/public'; import { StartDependencies } from '../../../../plugin'; import { StartServicesGetter } from '../../../../../../../../src/plugins/kibana_utils/public'; -import { ensureNestedTriggers } from '../drilldown_shared'; +import { ensureNestedTriggers, createDrilldownTemplatesFromSiblings } from '../drilldown_shared'; export const OPEN_FLYOUT_ADD_DRILLDOWN = 'OPEN_FLYOUT_ADD_DRILLDOWN'; @@ -81,14 +81,18 @@ export class FlyoutCreateDrilldownAction implements Action { ); } + const templates = createDrilldownTemplatesFromSiblings(embeddable); + const handle = core.overlays.openFlyout( toMountPoint( - handle.close()} - viewMode={'create'} + handle.close()} /> ), { diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx index e3a4ef7ac0830..44eb63bbc504b 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx @@ -24,7 +24,7 @@ import { } from '../../../../../../embeddable_enhanced/public'; import { StartDependencies } from '../../../../plugin'; import { StartServicesGetter } from '../../../../../../../../src/plugins/kibana_utils/public'; -import { ensureNestedTriggers } from '../drilldown_shared'; +import { createDrilldownTemplatesFromSiblings, ensureNestedTriggers } from '../drilldown_shared'; export const OPEN_FLYOUT_EDIT_DRILLDOWN = 'OPEN_FLYOUT_EDIT_DRILLDOWN'; @@ -66,14 +66,17 @@ export class FlyoutEditDrilldownAction implements Action { ); } + const templates = createDrilldownTemplatesFromSiblings(embeddable); + const handle = core.overlays.openFlyout( toMountPoint( - handle.close()} - viewMode={'manage'} + handle.close()} /> ), { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index d1d58755d6daa..74803fda8df5c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -22527,10 +22527,8 @@ "xpack.uiActionsEnhanced.drilldowns.components.DrilldownHelloBar.helpText": "ドリルダウンにより、パネルと連携する新しい動作を定義できます。複数のアクションを追加し、デフォルトフィルターを無効化できます。", "xpack.uiActionsEnhanced.drilldowns.components.DrilldownHelloBar.hideHelpButtonLabel": "非表示", "xpack.uiActionsEnhanced.drilldowns.components.DrilldownHelloBar.viewDocsLinkLabel": "ドキュメントを表示", - "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.createDrilldownButtonLabel": "ドリルダウンを作成", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.createDrilldownTitle": "ドリルダウンを作成", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.deleteDrilldownButtonLabel": "ドリルダウンを削除", - "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.editDrilldownButtonLabel": "保存", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.editDrilldownTitle": "ドリルダウンを編集", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.insufficientLicenseLevelError": "不十分なライセンスレベル", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.invalidDrilldownType": "ドリルダウンタイプ{type}が存在しません", @@ -22545,15 +22543,6 @@ "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle": "{n}個のドリルダウンが削除されました", "xpack.uiActionsEnhanced.drilldowns.components.FlyoutFrame.BackButtonLabel": "戻る", "xpack.uiActionsEnhanced.drilldowns.components.FlyoutFrame.CloseButtonLabel": "閉じる", - "xpack.uiActionsEnhanced.drilldowns.components.FlyoutListManageDrilldowns.manageDrilldownsTitle": "ドリルダウンを管理", - "xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.drilldownAction": "アクション", - "xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.nameOfDrilldown": "名前", - "xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.untitledDrilldown": "無題のドリルダウン", - "xpack.uiActionsEnhanced.drilldowns.components.FormDrilldownWizard.getMoreActionsLinkLabel": "さらにアクションを表示", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.createDrilldownButtonLabel": "新規作成", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.deleteDrilldownsButtonLabel": "削除 ({count}) ", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.editDrilldownButtonLabel": "編集", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.selectThisDrilldownCheckboxLabel": "このドリルダウンを選択", "xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.additionalOptions": "その他のオプション", "xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.addVariableButtonTitle": "変数を追加", "xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.encodeDescription": "有効な場合、URLはパーセントエンコーディングを使用してエスケープされます", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 30da649ff153c..ef6d8f9707553 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -22885,10 +22885,8 @@ "xpack.uiActionsEnhanced.drilldowns.components.DrilldownHelloBar.helpText": "向下钻取允许您定义与面板交互的新行为。您可以添加多个操作并覆盖默认筛选。", "xpack.uiActionsEnhanced.drilldowns.components.DrilldownHelloBar.hideHelpButtonLabel": "隐藏", "xpack.uiActionsEnhanced.drilldowns.components.DrilldownHelloBar.viewDocsLinkLabel": "查看文档", - "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.createDrilldownButtonLabel": "创建向下钻取", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.createDrilldownTitle": "创建向下钻取", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.deleteDrilldownButtonLabel": "删除向下钻取", - "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.editDrilldownButtonLabel": "保存", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.editDrilldownTitle": "编辑向下钻取", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.insufficientLicenseLevelError": "许可证级别不够", "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.invalidDrilldownType": "向下钻取类型 {type} 不存在", @@ -22903,15 +22901,6 @@ "xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle": "{n} 个向下钻取已删除", "xpack.uiActionsEnhanced.drilldowns.components.FlyoutFrame.BackButtonLabel": "返回", "xpack.uiActionsEnhanced.drilldowns.components.FlyoutFrame.CloseButtonLabel": "关闭", - "xpack.uiActionsEnhanced.drilldowns.components.FlyoutListManageDrilldowns.manageDrilldownsTitle": "管理向下钻取", - "xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.drilldownAction": "操作", - "xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.nameOfDrilldown": "名称", - "xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.untitledDrilldown": "未命名向下钻取", - "xpack.uiActionsEnhanced.drilldowns.components.FormDrilldownWizard.getMoreActionsLinkLabel": "获取更多的操作", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.createDrilldownButtonLabel": "新建", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.deleteDrilldownsButtonLabel": "删除 ({count})", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.editDrilldownButtonLabel": "编辑", - "xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.selectThisDrilldownCheckboxLabel": "选择此向下钻取", "xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.additionalOptions": "其他选项", "xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.addVariableButtonTitle": "添加变量", "xpack.uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.encodeDescription": "如果启用,将使用百分比编码转义 URL", diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/action_factory_picker.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/action_factory_picker.tsx new file mode 100644 index 0000000000000..dcf99d4001797 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/action_factory_picker.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ActionFactory, BaseActionFactoryContext } from '../../dynamic_actions'; +import { PresentablePicker, Item } from '../presentable_picker'; + +export interface ActionFactoryPickerProps { + actionFactories: ActionFactory[]; + context: unknown; + onSelect: (actionFactory: ActionFactory) => void; +} + +export const ActionFactoryPicker: React.FC = ({ + actionFactories, + context, + onSelect, +}) => { + const items = React.useMemo(() => { + return actionFactories.map((actionFactory) => { + const item: Item = { + id: actionFactory.id, + order: actionFactory.order, + getDisplayName: (ctx: unknown) => + actionFactory.getDisplayName(ctx as BaseActionFactoryContext), + getIconType: (ctx: unknown) => actionFactory.getIconType(ctx as BaseActionFactoryContext), + getDisplayNameTooltip: () => '', + isCompatible: (ctx: unknown) => actionFactory.isCompatible(ctx as BaseActionFactoryContext), + MenuItem: actionFactory.MenuItem, + isBeta: actionFactory.isBeta, + isLicenseCompatible: actionFactory.isCompatibleLicense(), + }; + return item; + }); + }, [actionFactories]); + + const handleSelect = React.useCallback( + (id: string) => { + if (!onSelect) return; + const actionFactory = actionFactories.find((af) => af.id === id); + if (!actionFactory) return; + onSelect(actionFactory); + }, + [onSelect, actionFactories] + ); + + return ; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/index.ts b/x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/index.ts similarity index 85% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/index.ts rename to x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/index.ts index 8c6527e90c709..3d7ffed301859 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/index.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/components/action_factory_picker/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './flyout_drilldown_wizard'; +export * from './action_factory_picker'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx index 1caef68b7e5e8..049adbd09e84e 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx @@ -99,23 +99,29 @@ export const ActionWizard: React.FC = ({ triggerPickerDocsLink, }) => { // auto pick action factory if there is only 1 available - if ( - !currentActionFactory && - actionFactories.length === 1 && - actionFactories[0].isCompatibleLicense() - ) { - onActionFactoryChange(actionFactories[0]); - } + React.useEffect(() => { + if ( + !currentActionFactory && + actionFactories.length === 1 && + actionFactories[0].isCompatibleLicense() + ) { + onActionFactoryChange(actionFactories[0]); + } + }, [currentActionFactory, actionFactories, actionFactories.length, onActionFactoryChange]); // auto pick selected trigger if none is picked - if (currentActionFactory && !((context.triggers?.length ?? 0) > 0)) { - const actionTriggers = getTriggersForActionFactory(currentActionFactory, triggers); - if (actionTriggers.length > 0) { - onSelectedTriggersChange([actionTriggers[0]]); + React.useEffect(() => { + if (currentActionFactory && !((context.triggers?.length ?? 0) > 0)) { + const actionTriggers = getTriggersForActionFactory(currentActionFactory, triggers); + if (actionTriggers.length > 0) { + onSelectedTriggersChange([actionTriggers[0]]); + } } - } + }, [currentActionFactory, triggers, context.triggers?.length, onSelectedTriggersChange]); + + if (currentActionFactory) { + if (!config) return null; - if (currentActionFactory && config) { const allTriggers = getTriggersForActionFactory(currentActionFactory, triggers); return ( = ({ { - onActionFactoryChange(actionFactory); - }} + onActionFactorySelected={onActionFactoryChange} /> ); }; diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/i18n.ts new file mode 100644 index 0000000000000..36ca55901950f --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/i18n.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const txtBetaActionFactoryLabel = i18n.translate( + 'xpack.uiActionsEnhanced.components.actionWizard.betaActionLabel', + { + defaultMessage: `Beta`, + } +); + +export const txtBetaActionFactoryTooltip = i18n.translate( + 'xpack.uiActionsEnhanced.components.actionWizard.betaActionTooltip', + { + defaultMessage: `This action is in beta and is subject to change. The design and code is less mature than official GA features and is being provided as-is with no warranties. Beta features are not subject to the support SLA of official GA features. Please help us by reporting any bugs or providing other feedback.`, + } +); + +export const txtInsufficientLicenseLevel = i18n.translate( + 'xpack.uiActionsEnhanced.components.actionWizard.insufficientLicenseLevelTooltip', + { + defaultMessage: 'Insufficient license level', + } +); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/index.ts b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/index.ts similarity index 83% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/index.ts rename to x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/index.ts index cd324619b79b0..0259ac6556e64 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/index.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './flyout_list_manage_drilldowns'; +export * from './presentable_picker'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.stories.tsx new file mode 100644 index 0000000000000..521d16ad579c1 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.stories.tsx @@ -0,0 +1,152 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { PresentablePicker } from './presentable_picker'; + +storiesOf('components/PresentablePicker', module) + .add('One item', () => ( + 'Go to URL', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 10, + isCompatible: async (context?: object) => true, + }, + ]} + context={{}} + onSelect={action('onSelect')} + /> + )) + .add('Items are sorted', () => ( + 'Item 2', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 1, + isCompatible: async (context?: object) => true, + }, + { + id: 'item1', + getDisplayName: () => 'Item 1', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 2, + isCompatible: async (context?: object) => true, + }, + ]} + context={{}} + onSelect={action('onSelect')} + /> + )) + .add('Items are sorted - 2', () => ( + 'Item 1', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 2, + isCompatible: async (context?: object) => true, + }, + { + id: 'item2', + getDisplayName: () => 'Item 2', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 1, + isCompatible: async (context?: object) => true, + }, + ]} + context={{}} + onSelect={action('onSelect')} + /> + )) + .add('Two items', () => ( + 'Go to URL', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 2, + isCompatible: async (context?: object) => true, + }, + { + id: 'DASHBOARD', + getDisplayName: () => 'Go to Dashboard', + getIconType: () => 'dashboardApp', + getDisplayNameTooltip: () => '', + order: 1, + isCompatible: async (context?: object) => true, + }, + ]} + context={{}} + onSelect={action('onSelect')} + /> + )) + .add('Beta badge', () => ( + 'Go to URL', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 2, + isCompatible: async (context?: object) => true, + isBeta: true, + }, + { + id: 'DASHBOARD', + getDisplayName: () => 'Go to Dashboard', + getIconType: () => 'dashboardApp', + getDisplayNameTooltip: () => '', + order: 1, + isCompatible: async (context?: object) => true, + }, + ]} + context={{}} + onSelect={action('onSelect')} + /> + )) + .add('Incompatible license', () => ( + 'Go to URL', + getIconType: () => 'link', + getDisplayNameTooltip: () => '', + order: 2, + isCompatible: async (context?: object) => true, + isBeta: true, + isLicenseCompatible: false, + }, + { + id: 'DASHBOARD', + getDisplayName: () => 'Go to Dashboard', + getIconType: () => 'dashboardApp', + getDisplayNameTooltip: () => '', + order: 1, + isCompatible: async (context?: object) => true, + }, + ]} + context={{}} + onSelect={action('onSelect')} + /> + )); diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.tsx new file mode 100644 index 0000000000000..72f9e5aa0bd4a --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFlexGroup } from '@elastic/eui'; +import { PresentablePickerItem, Item } from './presentable_picker_item'; + +export { Item } from './presentable_picker_item'; + +export interface PresentablePickerProps { + items: Item[]; + context: unknown; + onSelect: (itemId: string) => void; +} + +export const TEST_SUBJ_ACTION_FACTORY_ITEM = 'actionFactoryItem'; + +// The below style is applied to fix Firefox rendering bug. +// See: https://github.com/elastic/kibana/pull/61219/#pullrequestreview-402903330 +const firefoxBugFix = { + willChange: 'opacity', +}; + +const sort = (f1: Item, f2: Item): number => f2.order - f1.order; + +export const PresentablePicker: React.FC = ({ + items, + context, + onSelect, +}) => { + /** + * Make sure items with incompatible license are at the end. + */ + const itemsSorted = React.useMemo(() => { + const compatible = items.filter((f) => f.isLicenseCompatible ?? true); + const incompatible = items.filter((f) => !(f.isLicenseCompatible ?? true)); + return [...compatible.sort(sort), ...incompatible.sort(sort)]; + }, [items]); + + if (items.length === 0) { + // This is not user facing, as it would be impossible to get into this state + // just leaving for dev purposes for troubleshooting. + return
No action factories to pick from.
; + } + + return ( + + {itemsSorted.map((item) => ( + + ))} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker_item.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker_item.tsx new file mode 100644 index 0000000000000..7d9232dc793ef --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/presentable_picker_item.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFlexItem, EuiIcon, EuiKeyPadMenuItem, EuiToolTip } from '@elastic/eui'; +import { + txtBetaActionFactoryLabel, + txtBetaActionFactoryTooltip, + txtInsufficientLicenseLevel, +} from './i18n'; +import { UiActionsPresentable as Presentable } from '../../../../../../src/plugins/ui_actions/public'; + +import './styles.scss'; + +export interface Item extends Presentable { + isLicenseCompatible?: boolean; + isBeta?: boolean; +} + +export interface PresentablePickerItemProps { + item: Item; + context: unknown; + onSelect: (itemId: string) => void; +} + +export const TEST_SUBJ_PRESENTABLE_ITEM = 'actionFactoryItem'; + +export const PresentablePickerItem: React.FC = ({ + item, + context, + onSelect, +}) => { + const isLicenseCompatible = item.isLicenseCompatible ?? true; + const showTooltip = !isLicenseCompatible; + + let content = ( + onSelect(item.id)} + disabled={!isLicenseCompatible} + betaBadgeLabel={item.isBeta ? txtBetaActionFactoryLabel : undefined} + betaBadgeTooltipContent={item.isBeta ? txtBetaActionFactoryTooltip : undefined} + > + {item.getIconType(context) && } + + ); + + if (showTooltip) { + content = {content}; + } + + return ( + + {content} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/styles.scss b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/styles.scss new file mode 100644 index 0000000000000..01f05ffd53576 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/components/presentable_picker/styles.scss @@ -0,0 +1,5 @@ +.auaPresentablePicker__item { + .euiKeyPadMenuItem__label { + height: #{$euiSizeXL}; + } +} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx deleted file mode 100644 index 4249e108e5f5b..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as React from 'react'; -import { EuiFlyout } from '@elastic/eui'; -import { storiesOf } from '@storybook/react'; -import { StubBrowserStorage } from '@kbn/test/jest'; -import { createFlyoutManageDrilldowns } from './connected_flyout_manage_drilldowns'; -import { mockActionFactories } from '../../../components/action_wizard/test_data'; -import { Storage } from '../../../../../../../src/plugins/kibana_utils/public'; -import { mockDynamicActionManager } from './test_data'; - -const FlyoutManageDrilldowns = createFlyoutManageDrilldowns({ - actionFactories: mockActionFactories, - storage: new Storage(new StubBrowserStorage()), - toastService: { - addError: (...args: any[]) => { - alert(JSON.stringify(args)); - }, - addSuccess: (...args: any[]) => { - alert(JSON.stringify(args)); - }, - } as any, - getTrigger: (triggerId) => ({ - id: triggerId, - }), -}); - -storiesOf('components/FlyoutManageDrilldowns', module) - .add('default (3 triggers)', () => ( - {}}> - - - )) - .add('Only filter is supported', () => ( - {}}> - - - )); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx deleted file mode 100644 index 12e9b86117a11..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { fireEvent, render, waitFor, cleanup } from '@testing-library/react'; -import { createFlyoutManageDrilldowns } from './connected_flyout_manage_drilldowns'; -import { - mockGetTriggerInfo, - mockSupportedTriggers, - mockActionFactories, -} from '../../../components/action_wizard/test_data'; -import { StubBrowserStorage } from '@kbn/test/jest'; -import { Storage } from '../../../../../../../src/plugins/kibana_utils/public'; -import { mockDynamicActionManager } from './test_data'; -import { TEST_SUBJ_DRILLDOWN_ITEM } from '../list_manage_drilldowns'; -import { WELCOME_MESSAGE_TEST_SUBJ } from '../drilldown_hello_bar'; -import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { NotificationsStart } from 'kibana/public'; -import { toastDrilldownsCRUDError } from '../../hooks/i18n'; - -jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ - htmlIdGenerator: () => () => `id-${Math.random()}`, -})); - -const storage = new Storage(new StubBrowserStorage()); -const toasts = coreMock.createStart().notifications.toasts; -const FlyoutManageDrilldowns = createFlyoutManageDrilldowns({ - actionFactories: mockActionFactories, - storage: new Storage(new StubBrowserStorage()), - toastService: toasts, - getTrigger: mockGetTriggerInfo, -}); - -beforeEach(() => { - storage.clear(); - mockDynamicActionManager.state.set({ ...mockDynamicActionManager.state.get(), events: [] }); - (toasts as jest.Mocked).addSuccess.mockClear(); - (toasts as jest.Mocked).addError.mockClear(); -}); - -test('Allows to manage drilldowns', async () => { - const screen = render( - - ); - - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); - - // no drilldowns in the list - expect(screen.queryAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM)).toHaveLength(0); - - fireEvent.click(screen.getByText(/Create new/i)); - - let [createHeading] = screen.getAllByText(/Create Drilldown/i); - let createButton = screen.getByRole('button', { name: /Create Drilldown/i }); - expect(createHeading).toBeVisible(); - expect(screen.getByLabelText(/Back/i)).toBeVisible(); - - expect(createButton).toBeDisabled(); - - // input drilldown name - const name = 'Test name'; - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: name }, - }); - - // select URL one - fireEvent.click(screen.getByText(/Go to URL/i)); - - // Input url - const URL = 'https://elastic.co'; - fireEvent.change(screen.getByLabelText(/url/i), { - target: { value: URL }, - }); - - [createHeading] = screen.getAllByText(/Create Drilldown/i); - createButton = screen.getByRole('button', { name: /Create Drilldown/i }); - - expect(createButton).toBeEnabled(); - fireEvent.click(createButton); - - expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible(); - - await waitFor(() => expect(screen.queryAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM)).toHaveLength(1)); - expect(screen.getByText(name)).toBeVisible(); - const editButton = screen.getByText(/edit/i); - fireEvent.click(editButton); - - expect(screen.getByText(/Edit Drilldown/i)).toBeVisible(); - // check that wizard is prefilled with current drilldown values - expect(screen.getByLabelText(/name/i)).toHaveValue(name); - expect(screen.getByLabelText(/url/i)).toHaveValue(URL); - - // input new drilldown name - const newName = 'New drilldown name'; - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: newName }, - }); - fireEvent.click(screen.getByText(/save/i)); - - expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible(); - await waitFor(() => screen.getByText(newName)); - - // delete drilldown from edit view - fireEvent.click(screen.getByText(/edit/i)); - fireEvent.click(screen.getByText(/delete/i)); - - expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible(); - await waitFor(() => expect(screen.queryAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM)).toHaveLength(0)); -}); - -test('Can delete multiple drilldowns', async () => { - const screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); - - const createDrilldown = async () => { - const oldCount = screen.queryAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM).length; - fireEvent.click(screen.getByText(/Create new/i)); - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: 'test' }, - }); - fireEvent.click(screen.getByText(/Go to URL/i)); - fireEvent.change(screen.getByLabelText(/url/i), { - target: { value: 'https://elastic.co' }, - }); - fireEvent.click(screen.getAllByText(/Create Drilldown/i)[1]); - await waitFor(() => - expect(screen.queryAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM)).toHaveLength(oldCount + 1) - ); - }; - - await createDrilldown(); - await createDrilldown(); - await createDrilldown(); - - const checkboxes = screen.getAllByLabelText(/Select this drilldown/i); - expect(checkboxes).toHaveLength(3); - checkboxes.forEach((checkbox) => fireEvent.click(checkbox)); - expect(screen.queryByText(/Create/i)).not.toBeInTheDocument(); - fireEvent.click(screen.getByText(/Delete \(3\)/i)); - - await waitFor(() => expect(screen.queryAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM)).toHaveLength(0)); -}); - -test('Create only mode', async () => { - const onClose = jest.fn(); - const screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getAllByText(/Create/i).length).toBeGreaterThan(0)); - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: 'test' }, - }); - fireEvent.click(screen.getByText(/Go to URL/i)); - fireEvent.change(screen.getByLabelText(/url/i), { - target: { value: 'https://elastic.co' }, - }); - fireEvent.click(screen.getAllByText(/Create Drilldown/i)[1]); - - await waitFor(() => expect(toasts.addSuccess).toBeCalled()); - expect(onClose).toBeCalled(); - expect(await mockDynamicActionManager.state.get().events.length).toBe(1); -}); - -test('After switching between action factories state is restored', async () => { - const screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getAllByText(/Create/i).length).toBeGreaterThan(0)); - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: 'test' }, - }); - fireEvent.click(screen.getByText(/Go to URL/i)); - fireEvent.change(screen.getByLabelText(/url/i), { - target: { value: 'https://elastic.co' }, - }); - - // change to dashboard - fireEvent.click(screen.getByText(/change/i)); - fireEvent.click(screen.getByText(/Go to Dashboard/i)); - - // change back to url - fireEvent.click(screen.getByText(/change/i)); - fireEvent.click(screen.getByText(/Go to URL/i)); - - expect(screen.getByLabelText(/url/i)).toHaveValue('https://elastic.co'); - expect(screen.getByLabelText(/name/i)).toHaveValue('test'); - - fireEvent.click(screen.getAllByText(/Create Drilldown/i)[1]); - await waitFor(() => expect(toasts.addSuccess).toBeCalled()); - expect(await (mockDynamicActionManager.state.get().events[0].action.config as any).url).toBe( - 'https://elastic.co' - ); -}); - -test.todo("Error when can't fetch drilldown list"); - -test("Error when can't save drilldown changes", async () => { - const error = new Error('Oops'); - jest.spyOn(mockDynamicActionManager, 'createEvent').mockImplementationOnce(async () => { - throw error; - }); - const screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); - fireEvent.click(screen.getByText(/Create new/i)); - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: 'test' }, - }); - fireEvent.click(screen.getByText(/Go to URL/i)); - fireEvent.change(screen.getByLabelText(/url/i), { - target: { value: 'https://elastic.co' }, - }); - fireEvent.click(screen.getAllByText(/Create Drilldown/i)[1]); - await waitFor(() => - expect(toasts.addError).toBeCalledWith(error, { title: toastDrilldownsCRUDError }) - ); -}); - -test('Should show drilldown welcome message. Should be able to dismiss it', async () => { - let screen = render( - - ); - - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); - - expect(screen.getByTestId(WELCOME_MESSAGE_TEST_SUBJ)).toBeVisible(); - fireEvent.click(screen.getByText(/hide/i)); - expect(screen.queryByTestId(WELCOME_MESSAGE_TEST_SUBJ)).toBeNull(); - cleanup(); - - screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); - expect(screen.queryByTestId(WELCOME_MESSAGE_TEST_SUBJ)).toBeNull(); -}); - -test('Drilldown type is not shown if no supported trigger', async () => { - const screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getAllByText(/Create/i).length).toBeGreaterThan(0)); - expect(screen.queryByText(/Go to Dashboard/i)).not.toBeInTheDocument(); // dashboard action is not visible, because APPLY_FILTER_TRIGGER not supported - expect(screen.getByTestId('selectedActionFactory-Url')).toBeInTheDocument(); -}); - -test('Can pick a trigger', async () => { - const screen = render( - - ); - // wait for initial render. It is async because resolving compatible action factories is async - await waitFor(() => expect(screen.getAllByText(/Create/i).length).toBeGreaterThan(0)); - - // input drilldown name - const name = 'Test name'; - fireEvent.change(screen.getByLabelText(/name/i), { - target: { value: name }, - }); - - // select URL one - fireEvent.click(screen.getByText(/Go to URL/i)); - - // Input url - const URL = 'https://elastic.co'; - fireEvent.change(screen.getByLabelText(/url/i), { - target: { value: URL }, - }); - - fireEvent.click(screen.getByTestId('triggerPicker-SELECT_RANGE_TRIGGER').querySelector('input')!); - - const [, createButton] = screen.getAllByText(/Create Drilldown/i); - - expect(createButton).toBeEnabled(); - fireEvent.click(createButton); - await waitFor(() => expect(toasts.addSuccess).toBeCalled()); - expect(mockDynamicActionManager.state.get().events[0].triggers).toEqual(['SELECT_RANGE_TRIGGER']); -}); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx deleted file mode 100644 index 9eed7cd428bdb..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useState, useMemo } from 'react'; -import { ToastsStart } from 'kibana/public'; -import { intersection } from 'lodash'; -import { DrilldownWizardConfig, FlyoutDrilldownWizard } from '../flyout_drilldown_wizard'; -import { FlyoutListManageDrilldowns } from '../flyout_list_manage_drilldowns'; -import { IStorageWrapper } from '../../../../../../../src/plugins/kibana_utils/public'; -import { Trigger } from '../../../../../../../src/plugins/ui_actions/public'; -import { DrilldownListItem } from '../list_manage_drilldowns'; -import { insufficientLicenseLevel, invalidDrilldownType } from './i18n'; -import { - ActionFactory, - BaseActionConfig, - BaseActionFactoryContext, - DynamicActionManager, - SerializedEvent, -} from '../../../dynamic_actions'; -import { useWelcomeMessage } from '../../hooks/use_welcome_message'; -import { useCompatibleActionFactoriesForCurrentContext } from '../../hooks/use_compatible_action_factories_for_current_context'; -import { useDrilldownsStateManager } from '../../hooks/use_drilldown_state_manager'; -import { ActionFactoryPlaceContext } from '../types'; - -interface ConnectedFlyoutManageDrilldownsProps< - ActionFactoryContext extends BaseActionFactoryContext = BaseActionFactoryContext -> { - dynamicActionManager: DynamicActionManager; - viewMode?: 'create' | 'manage'; - onClose?: () => void; - - /** - * List of possible triggers in current context - */ - triggers: string[]; - - /** - * Extra action factory context passed into action factories CollectConfig, getIconType, getDisplayName and etc... - */ - placeContext?: ActionFactoryPlaceContext; -} - -/** - * Represent current state (route) of FlyoutManageDrilldowns - */ -enum Routes { - Manage = 'manage', - Create = 'create', - Edit = 'edit', -} - -export function createFlyoutManageDrilldowns({ - actionFactories: allActionFactories, - storage, - toastService, - docsLink, - triggerPickerDocsLink, - getTrigger, -}: { - actionFactories: ActionFactory[]; - getTrigger: (triggerId: string) => Trigger; - storage: IStorageWrapper; - toastService: ToastsStart; - docsLink?: string; - triggerPickerDocsLink?: string; -}): React.FC { - const allActionFactoriesById = allActionFactories.reduce((acc, next) => { - acc[next.id] = next; - return acc; - }, {} as Record); - - return (props: ConnectedFlyoutManageDrilldownsProps) => { - const isCreateOnly = props.viewMode === 'create'; - - const factoryContext: BaseActionFactoryContext = useMemo( - () => ({ ...props.placeContext, triggers: props.triggers }), - [props.placeContext, props.triggers] - ); - const actionFactories = useCompatibleActionFactoriesForCurrentContext( - allActionFactories, - factoryContext - ); - - const [route, setRoute] = useState( - () => (isCreateOnly ? Routes.Create : Routes.Manage) // initial state is different depending on `viewMode` - ); - const [currentEditId, setCurrentEditId] = useState(null); - - const [shouldShowWelcomeMessage, onHideWelcomeMessage] = useWelcomeMessage(storage); - - const { - drilldowns, - createDrilldown, - editDrilldown, - deleteDrilldown, - } = useDrilldownsStateManager(props.dynamicActionManager, toastService); - - /** - * isCompatible promise is not yet resolved. - * Skip rendering until it is resolved - */ - if (!actionFactories) return null; - /** - * Drilldowns are not fetched yet or error happened during fetching - * In case of error user is notified with toast - */ - if (!drilldowns) return null; - - /** - * Needed for edit mode to prefill wizard fields with data from current edited drilldown - */ - function resolveInitialDrilldownWizardConfig(): DrilldownWizardConfig | undefined { - if (route !== Routes.Edit) return undefined; - if (!currentEditId) return undefined; - const drilldownToEdit = drilldowns?.find((d) => d.eventId === currentEditId); - if (!drilldownToEdit) return undefined; - - return { - actionFactory: allActionFactoriesById[drilldownToEdit.action.factoryId], - actionConfig: drilldownToEdit.action.config as BaseActionConfig, - name: drilldownToEdit.action.name, - selectedTriggers: (drilldownToEdit.triggers ?? []) as string[], - }; - } - - /** - * Maps drilldown to list item view model - */ - function mapToDrilldownToDrilldownListItem(drilldown: SerializedEvent): DrilldownListItem { - const actionFactory = allActionFactoriesById[drilldown.action.factoryId]; - const drilldownFactoryContext: BaseActionFactoryContext = { - ...props.placeContext, - triggers: drilldown.triggers as string[], - }; - return { - id: drilldown.eventId, - drilldownName: drilldown.action.name, - actionName: - actionFactory?.getDisplayName(drilldownFactoryContext) ?? drilldown.action.factoryId, - icon: actionFactory?.getIconType(drilldownFactoryContext), - error: !actionFactory - ? invalidDrilldownType(drilldown.action.factoryId) // this shouldn't happen for the end user, but useful during development - : !actionFactory.isCompatibleLicense() - ? insufficientLicenseLevel - : undefined, - triggers: drilldown.triggers.map((trigger) => getTrigger(trigger as string)), - }; - } - - switch (route) { - case Routes.Create: - case Routes.Edit: - return ( - setRoute(Routes.Manage)} - onSubmit={({ actionConfig, actionFactory, name, selectedTriggers }) => { - if (route === Routes.Create) { - createDrilldown( - { - name, - config: actionConfig, - factoryId: actionFactory.id, - }, - selectedTriggers - ); - } else { - editDrilldown( - currentEditId!, - { - name, - config: actionConfig, - factoryId: actionFactory.id, - }, - selectedTriggers - ); - } - - if (isCreateOnly) { - if (props.onClose) { - props.onClose(); - } - } else { - setRoute(Routes.Manage); - } - - setCurrentEditId(null); - }} - onDelete={() => { - deleteDrilldown(currentEditId!); - setRoute(Routes.Manage); - setCurrentEditId(null); - }} - actionFactoryPlaceContext={props.placeContext} - initialDrilldownWizardConfig={resolveInitialDrilldownWizardConfig()} - supportedTriggers={props.triggers} - getTrigger={getTrigger} - /> - ); - - case Routes.Manage: - default: - // show trigger column in case if there is more then 1 possible trigger in current context - const showTriggerColumn = - intersection( - props.triggers, - actionFactories - .map((factory) => factory.supportedTriggers()) - .reduce((res, next) => res.concat(next), []) - ).length > 1; - return ( - { - setCurrentEditId(null); - deleteDrilldown(ids); - }} - onEdit={(id) => { - setCurrentEditId(id); - setRoute(Routes.Edit); - }} - onCreate={() => { - setCurrentEditId(null); - setRoute(Routes.Create); - }} - onClose={props.onClose} - showTriggerColumn={showTriggerColumn} - /> - ); - } - }; -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts deleted file mode 100644 index e93ff84e709d7..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const insufficientLicenseLevel = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.insufficientLicenseLevelError', - { - defaultMessage: 'Insufficient license level', - description: - 'User created drilldown with higher license type, but then downgraded the license. This error is shown in the list near created drilldown', - } -); - -export const invalidDrilldownType = (type: string) => - i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.invalidDrilldownType', - { - defaultMessage: "Drilldown type {type} doesn't exist", - values: { - type, - }, - } - ); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/test_data.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/test_data.ts deleted file mode 100644 index cb039587b5b08..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/test_data.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import uuid from 'uuid'; -import type { PublicMethodsOf } from '@kbn/utility-types'; -import { - UiActionsEnhancedDynamicActionManager as DynamicActionManager, - UiActionsEnhancedDynamicActionManagerState as DynamicActionManagerState, - UiActionsEnhancedSerializedAction, -} from '../../../index'; -import { createStateContainer } from '../../../../../../../src/plugins/kibana_utils/common'; - -class MockDynamicActionManager implements PublicMethodsOf { - public readonly state = createStateContainer({ - isFetchingEvents: false, - fetchCount: 0, - events: [], - }); - - async count() { - return this.state.get().events.length; - } - - async list() { - return this.state.get().events; - } - - async createEvent(action: UiActionsEnhancedSerializedAction, triggers: string[]) { - const event = { - action, - triggers, - eventId: uuid(), - }; - const state = this.state.get(); - this.state.set({ - ...state, - events: [...state.events, event], - }); - } - - async deleteEvents(eventIds: string[]) { - const state = this.state.get(); - let events = state.events; - - eventIds.forEach((id) => { - events = events.filter((e) => e.eventId !== id); - }); - - this.state.set({ - ...state, - events, - }); - } - - async updateEvent( - eventId: string, - action: UiActionsEnhancedSerializedAction, - triggers: string[] - ) { - const state = this.state.get(); - const events = state.events; - const idx = events.findIndex((e) => e.eventId === eventId); - const event = { - eventId, - action, - triggers, - }; - - this.state.set({ - ...state, - events: [...events.slice(0, idx), event, ...events.slice(idx + 1)], - }); - } - - async deleteEvent() { - throw new Error('not implemented'); - } - - async start() {} - async stop() {} -} - -export const mockDynamicActionManager = (new MockDynamicActionManager() as unknown) as DynamicActionManager; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.stories.tsx deleted file mode 100644 index b339fac85ba61..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.stories.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as React from 'react'; -import { EuiFlyout } from '@elastic/eui'; -import { storiesOf } from '@storybook/react'; -import { FlyoutDrilldownWizard } from './index'; -import { mockActionFactories } from '../../../components/action_wizard/test_data'; -import { Trigger } from '../../../../../../../src/plugins/ui_actions/public'; - -const otherProps = { - supportedTriggers: ['VALUE_CLICK_TRIGGER', 'SELECT_RANGE_TRIGGER', 'FILTER_TRIGGER'] as string[], - onClose: () => {}, - getTrigger: (id: string) => ({ id } as Trigger), -}; - -storiesOf('components/FlyoutDrilldownWizard', module) - .add('default', () => { - return ; - }) - .add('open in flyout - create', () => { - return ( - {}}> - - - ); - }) - .add('open in flyout - edit', () => { - return ( - {}}> - - - ); - }) - .add('open in flyout - edit, just 1 action type', () => { - return ( - {}}> - - - ); - }); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx deleted file mode 100644 index daa895de9e46b..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo, useState } from 'react'; -import { EuiButton, EuiSpacer } from '@elastic/eui'; -import { FormDrilldownWizard } from '../form_drilldown_wizard'; -import { FlyoutFrame } from '../flyout_frame'; -import { - txtCreateDrilldownButtonLabel, - txtCreateDrilldownTitle, - txtDeleteDrilldownButtonLabel, - txtEditDrilldownButtonLabel, - txtEditDrilldownTitle, -} from './i18n'; -import { DrilldownHelloBar } from '../drilldown_hello_bar'; -import { - ActionFactory, - BaseActionConfig, - BaseActionFactoryContext, -} from '../../../dynamic_actions'; -import { Trigger } from '../../../../../../../src/plugins/ui_actions/public'; -import { ActionFactoryPlaceContext } from '../types'; - -export interface DrilldownWizardConfig { - name: string; - actionFactory?: ActionFactory; - actionConfig?: ActionConfig; - selectedTriggers?: string[]; -} - -export interface FlyoutDrilldownWizardProps< - CurrentActionConfig extends BaseActionConfig = BaseActionConfig, - ActionFactoryContext extends BaseActionFactoryContext = BaseActionFactoryContext -> { - drilldownActionFactories: ActionFactory[]; - - onSubmit?: (drilldownWizardConfig: Required) => void; - onDelete?: () => void; - onClose?: () => void; - onBack?: () => void; - - mode?: 'create' | 'edit'; - initialDrilldownWizardConfig?: DrilldownWizardConfig; - - showWelcomeMessage?: boolean; - onWelcomeHideClick?: () => void; - - actionFactoryPlaceContext?: ActionFactoryPlaceContext; - - /** - * General overview of drilldowns - */ - docsLink?: string; - - /** - * Link that explains different triggers - */ - triggerPickerDocsLink?: string; - - getTrigger: (triggerId: string) => Trigger; - - /** - * List of possible triggers in current context - */ - supportedTriggers: string[]; -} - -function useWizardConfigState( - actionFactoryContext: BaseActionFactoryContext, - initialDrilldownWizardConfig?: DrilldownWizardConfig -): [ - DrilldownWizardConfig, - { - setName: (name: string) => void; - setActionConfig: (actionConfig: BaseActionConfig) => void; - setActionFactory: (actionFactory?: ActionFactory) => void; - setSelectedTriggers: (triggers?: string[]) => void; - } -] { - const [wizardConfig, setWizardConfig] = useState( - () => - initialDrilldownWizardConfig ?? { - name: '', - } - ); - const [actionConfigCache, setActionConfigCache] = useState>( - initialDrilldownWizardConfig?.actionFactory - ? { - [initialDrilldownWizardConfig.actionFactory - .id]: initialDrilldownWizardConfig.actionConfig!, - } - : {} - ); - - return [ - wizardConfig, - { - setName: (name: string) => { - setWizardConfig({ - ...wizardConfig, - name, - }); - }, - setActionConfig: (actionConfig: BaseActionConfig) => { - setWizardConfig({ - ...wizardConfig, - actionConfig, - }); - }, - setActionFactory: (actionFactory?: ActionFactory) => { - if (actionFactory) { - const actionConfig = (actionConfigCache[actionFactory.id] ?? - actionFactory.createConfig(actionFactoryContext)) as BaseActionConfig; - setWizardConfig({ - ...wizardConfig, - actionFactory, - actionConfig, - selectedTriggers: [], - }); - } else { - if (wizardConfig.actionFactory?.id) { - setActionConfigCache({ - ...actionConfigCache, - [wizardConfig.actionFactory.id]: wizardConfig.actionConfig!, - }); - } - - setWizardConfig({ - ...wizardConfig, - actionFactory: undefined, - actionConfig: undefined, - }); - } - }, - setSelectedTriggers: (selectedTriggers: string[] = []) => { - setWizardConfig({ - ...wizardConfig, - selectedTriggers, - }); - }, - }, - ]; -} - -export function FlyoutDrilldownWizard< - CurrentActionConfig extends BaseActionConfig = BaseActionConfig ->({ - onClose, - onBack, - onSubmit = () => {}, - initialDrilldownWizardConfig, - mode = 'create', - onDelete = () => {}, - showWelcomeMessage = true, - onWelcomeHideClick, - drilldownActionFactories, - actionFactoryPlaceContext, - docsLink, - triggerPickerDocsLink, - getTrigger, - supportedTriggers, -}: FlyoutDrilldownWizardProps) { - const [ - wizardConfig, - { setActionFactory, setActionConfig, setName, setSelectedTriggers }, - ] = useWizardConfigState( - { ...actionFactoryPlaceContext, triggers: supportedTriggers }, - initialDrilldownWizardConfig - ); - - const actionFactoryContext: BaseActionFactoryContext = useMemo( - () => ({ - ...actionFactoryPlaceContext, - triggers: wizardConfig.selectedTriggers ?? [], - }), - [actionFactoryPlaceContext, wizardConfig.selectedTriggers] - ); - - const isActionValid = ( - config: DrilldownWizardConfig - ): config is Required => { - if (!wizardConfig.name) return false; - if (!wizardConfig.actionFactory) return false; - if (!wizardConfig.actionConfig) return false; - if (!wizardConfig.selectedTriggers || wizardConfig.selectedTriggers.length === 0) return false; - - return wizardConfig.actionFactory.isConfigValid( - wizardConfig.actionConfig, - actionFactoryContext - ); - }; - - const footer = ( - { - if (isActionValid(wizardConfig)) { - onSubmit(wizardConfig); - } - }} - fill - isDisabled={!isActionValid(wizardConfig)} - data-test-subj={'drilldownWizardSubmit'} - > - {mode === 'edit' ? txtEditDrilldownButtonLabel : txtCreateDrilldownButtonLabel} - - ); - - return ( - - ) - } - > - - {mode === 'edit' && ( - <> - - - {txtDeleteDrilldownButtonLabel} - - - )} - - ); -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.stories.tsx deleted file mode 100644 index 9a27dfad431b1..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.stories.tsx +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as React from 'react'; -import { EuiFlyout } from '@elastic/eui'; -import { storiesOf } from '@storybook/react'; -import { FlyoutListManageDrilldowns } from './flyout_list_manage_drilldowns'; - -storiesOf('components/FlyoutListManageDrilldowns', module).add('default', () => ( - {}}> - - -)); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.tsx deleted file mode 100644 index af5b687fb56a9..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/flyout_list_manage_drilldowns.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { FlyoutFrame } from '../flyout_frame'; -import { DrilldownListItem, ListManageDrilldowns } from '../list_manage_drilldowns'; -import { txtManageDrilldowns } from './i18n'; -import { DrilldownHelloBar } from '../drilldown_hello_bar'; - -export interface FlyoutListManageDrilldownsProps { - docsLink?: string; - drilldowns: DrilldownListItem[]; - onClose?: () => void; - onCreate?: () => void; - onEdit?: (drilldownId: string) => void; - onDelete?: (drilldownIds: string[]) => void; - showWelcomeMessage?: boolean; - onWelcomeHideClick?: () => void; - showTriggerColumn?: boolean; -} - -export function FlyoutListManageDrilldowns({ - docsLink, - drilldowns, - onClose = () => {}, - onCreate, - onDelete, - onEdit, - showWelcomeMessage = true, - onWelcomeHideClick, - showTriggerColumn, -}: FlyoutListManageDrilldownsProps) { - return ( - - ) - } - > - - - ); -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx deleted file mode 100644 index e5af260733bb4..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as React from 'react'; -import { storiesOf } from '@storybook/react'; -import { FormDrilldownWizard } from './index'; -import { Trigger } from '../../../../../../../src/plugins/ui_actions/public'; - -const otherProps = { - triggers: ['VALUE_CLICK_TRIGGER', 'SELECT_RANGE_TRIGGER', 'FILTER_TRIGGER'], - getTriggerInfo: (id: string) => ({ id } as Trigger), - onSelectedTriggersChange: () => {}, - actionFactoryContext: { triggers: [] as string[] }, -}; - -const DemoEditName: React.FC = () => { - const [name, setName] = React.useState(''); - - return ( - <> - {' '} -
name: {name}
- - ); -}; - -storiesOf('components/FormDrilldownWizard', module) - .add('default', () => { - return ; - }) - .add('[name=foobar]', () => { - return ; - }) - .add('can edit name', () => ); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx deleted file mode 100644 index 2bcfc42c865c1..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { render } from 'react-dom'; -import { FormDrilldownWizard } from './form_drilldown_wizard'; -import { render as renderTestingLibrary, fireEvent } from '@testing-library/react'; -import { txtNameOfDrilldown } from './i18n'; -import { Trigger } from '../../../../../../../src/plugins/ui_actions/public'; - -const otherProps = { - actionFactoryContext: { triggers: [] as string[] }, - triggers: ['VALUE_CLICK_TRIGGER', 'SELECT_RANGE_TRIGGER', 'FILTER_TRIGGER'] as string[], - getTriggerInfo: (id: string) => ({ id } as Trigger), - onSelectedTriggersChange: () => {}, -}; - -describe('', () => { - test('renders without crashing', () => { - const div = document.createElement('div'); - render( {}} {...otherProps} />, div); - }); - - describe('[name=]', () => { - test('if name not provided, uses to empty string', () => { - const div = document.createElement('div'); - - render(, div); - - const input = div.querySelector('[data-test-subj="drilldownNameInput"]') as HTMLInputElement; - - expect(input?.value).toBe(''); - }); - - test('can set initial name input field value', () => { - const div = document.createElement('div'); - - render(, div); - - const input = div.querySelector('[data-test-subj="drilldownNameInput"]') as HTMLInputElement; - - expect(input?.value).toBe('foo'); - - render(, div); - - expect(input?.value).toBe('bar'); - }); - - test('fires onNameChange callback on name change', () => { - const onNameChange = jest.fn(); - const utils = renderTestingLibrary( - - ); - const input = utils.getByLabelText(txtNameOfDrilldown); - - expect(onNameChange).toHaveBeenCalledTimes(0); - - fireEvent.change(input, { target: { value: 'qux' } }); - - expect(onNameChange).toHaveBeenCalledTimes(1); - expect(onNameChange).toHaveBeenCalledWith('qux'); - - fireEvent.change(input, { target: { value: 'quxx' } }); - - expect(onNameChange).toHaveBeenCalledTimes(2); - expect(onNameChange).toHaveBeenCalledWith('quxx'); - }); - }); -}); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx deleted file mode 100644 index 68cf6509d0059..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiFieldText, EuiForm, EuiFormRow, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; -import { EuiCallOut } from '@elastic/eui'; -import { EuiCode } from '@elastic/eui'; -import { txtDrilldownAction, txtNameOfDrilldown, txtUntitledDrilldown } from './i18n'; -import { - ActionFactory, - BaseActionConfig, - BaseActionFactoryContext, -} from '../../../dynamic_actions'; -import { ActionWizard } from '../../../components/action_wizard'; -import { Trigger } from '../../../../../../../src/plugins/ui_actions/public'; -import { txtGetMoreActions } from './i18n'; - -const GET_MORE_ACTIONS_LINK = 'https://www.elastic.co/subscriptions'; - -const noopFn = () => {}; - -export interface FormDrilldownWizardProps< - ActionFactoryContext extends BaseActionFactoryContext = BaseActionFactoryContext -> { - name?: string; - onNameChange?: (name: string) => void; - - currentActionFactory?: ActionFactory; - onActionFactoryChange?: (actionFactory?: ActionFactory) => void; - actionFactoryContext: ActionFactoryContext; - - actionConfig?: BaseActionConfig; - onActionConfigChange?: (config: BaseActionConfig) => void; - - actionFactories?: ActionFactory[]; - - /** - * Trigger selection has changed - * @param triggers - */ - onSelectedTriggersChange: (triggers?: string[]) => void; - - getTriggerInfo: (triggerId: string) => Trigger; - - /** - * List of possible triggers in current context - */ - triggers: string[]; - - triggerPickerDocsLink?: string; -} - -export const FormDrilldownWizard: React.FC = ({ - name = '', - actionConfig, - currentActionFactory, - onNameChange = noopFn, - onActionConfigChange = noopFn, - onActionFactoryChange = noopFn, - actionFactories = [], - actionFactoryContext, - onSelectedTriggersChange, - getTriggerInfo, - triggers, - triggerPickerDocsLink, -}) => { - if (!triggers || !triggers.length) { - // Below callout is not translated, because this message is only for developers. - return ( - -

- No triggers provided in trigger prop. -

-
- ); - } - - const nameFragment = ( - - onNameChange(event.target.value)} - data-test-subj="drilldownNameInput" - /> - - ); - - const hasNotCompatibleLicenseFactory = () => - actionFactories?.some((f) => !f.isCompatibleLicense()); - - const renderGetMoreActionsLink = () => ( - - - {txtGetMoreActions} - - - ); - - const actionWizard = ( - 1 ? txtDrilldownAction : undefined} - fullWidth={true} - labelAppend={ - !currentActionFactory && hasNotCompatibleLicenseFactory() && renderGetMoreActionsLink() - } - > - onActionFactoryChange(actionFactory)} - onConfigChange={(config) => onActionConfigChange(config)} - context={actionFactoryContext} - onSelectedTriggersChange={onSelectedTriggersChange} - getTriggerInfo={getTriggerInfo} - triggers={triggers} - triggerPickerDocsLink={triggerPickerDocsLink} - /> - - ); - - return ( - <> - - {nameFragment} - - {actionWizard} - - - ); -}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts deleted file mode 100644 index 9b817917ba0e2..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const txtNameOfDrilldown = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.nameOfDrilldown', - { - defaultMessage: 'Name', - } -); - -export const txtUntitledDrilldown = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.untitledDrilldown', - { - defaultMessage: 'Untitled drilldown', - } -); - -export const txtDrilldownAction = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.FormCreateDrilldown.drilldownAction', - { - defaultMessage: 'Action', - } -); - -export const txtGetMoreActions = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.FormDrilldownWizard.getMoreActionsLinkLabel', - { - defaultMessage: 'Get more actions', - } -); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/i18n.ts deleted file mode 100644 index 5985c3208c684..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/i18n.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const txtCreateDrilldown = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.createDrilldownButtonLabel', - { - defaultMessage: 'Create new', - } -); - -export const txtEditDrilldown = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.editDrilldownButtonLabel', - { - defaultMessage: 'Edit', - } -); - -export const txtDeleteDrilldowns = (count: number) => - i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.deleteDrilldownsButtonLabel', - { - defaultMessage: 'Delete ({count})', - values: { - count, - }, - } - ); - -export const txtSelectDrilldown = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.ListManageDrilldowns.selectThisDrilldownCheckboxLabel', - { - defaultMessage: 'Select this drilldown', - } -); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.stories.tsx deleted file mode 100644 index ad19ee7797e78..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.stories.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as React from 'react'; -import { storiesOf } from '@storybook/react'; -import { ListManageDrilldowns } from './list_manage_drilldowns'; - -storiesOf('components/ListManageDrilldowns', module).add('default', () => ( - -)); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/types.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/types.ts deleted file mode 100644 index a6134b4bb45bd..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { BaseActionFactoryContext } from '../../dynamic_actions'; - -/** - * Interface used as piece of ActionFactoryContext that is passed in from drilldown wizard component to action factories - * Omitted values are added inside the wizard and then full {@link BaseActionFactoryContext} passed into action factory methods - */ -export type ActionFactoryPlaceContext< - ActionFactoryContext extends BaseActionFactoryContext = BaseActionFactoryContext -> = Omit; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/README.md b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/README.md new file mode 100644 index 0000000000000..7d3916302b29d --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/README.md @@ -0,0 +1,12 @@ +# Drilldown Manager + +Drilldown Manager is the flyout that opens where drilldowns can be managed using +a CRUD UI. (It does not necessarily need to be a flyout, you can also embed it +directly on a page.) + +The main React component that this folder exports is ``, which +should normally be rendered in a flyout. + +A new instance of Drilldown Manager is rendered for every place where drilldowns +are used. For example, for each panel on the dashboard a separate new Drilldown +Manager is rendered in the flyout. diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/action_factory.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/action_factory.tsx new file mode 100644 index 0000000000000..4391254d0a8aa --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/action_factory.tsx @@ -0,0 +1,132 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiBetaBadge, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiIcon, + EuiLink, + EuiText, +} from '@elastic/eui'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; + +const txtDrilldownAction = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.drilldownAction', + { + defaultMessage: 'Action', + } +); + +const txtGetMoreActions = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.getMoreActionsLinkLabel', + { + defaultMessage: 'Get more actions', + } +); + +const txtBetaActionFactoryLabel = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.betaActionLabel', + { + defaultMessage: `Beta`, + } +); + +const txtBetaActionFactoryTooltip = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.betaActionTooltip', + { + defaultMessage: `This action is in beta and is subject to change. The design and code is less mature than official GA features and is being provided as-is with no warranties. Beta features are not subject to the support SLA of official GA features. Please help us by reporting any bugs or providing other feedback.`, + } +); + +const txtChangeButton = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.changeButton', + { + defaultMessage: 'Change', + } +); + +const GET_MORE_ACTIONS_LINK = 'https://www.elastic.co/subscriptions'; + +const moreActions = ( + + + {txtGetMoreActions} + + +); + +export interface ActionFactoryProps { + /** Action factory name. */ + name?: string; + + /** ID of EUI icon. */ + icon?: string; + + /** Whether the current drilldown type is in beta. */ + beta?: boolean; + + /** Whether to show "Get more actions" link to upgrade license. */ + showMoreLink?: boolean; + + /** On drilldown type change click. */ + onChange?: () => void; +} + +export const ActionFactory: React.FC = ({ + name, + icon, + beta, + showMoreLink, + onChange, +}) => { + return ( + +
+ + {!!icon && ( + + + + )} + + +

+ {name}{' '} + {beta && ( + + )} +

+
+
+ {!!onChange && ( + + + {txtChangeButton} + + + )} +
+
+
+ ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/index.ts similarity index 82% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/index.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/index.ts index a9d957c985287..25aabcf7e6d2f 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/index.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/action_factory/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './connected_flyout_manage_drilldowns'; +export * from './action_factory'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/button_submit.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/button_submit.tsx new file mode 100644 index 0000000000000..bf7dfcadd5ef7 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/button_submit.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { EuiButton } from '@elastic/eui'; + +export interface ButtonSubmitProps { + disabled?: boolean; + onClick: () => void; +} + +export const ButtonSubmit: React.FC = ({ disabled, onClick, children }) => { + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/index.ts new file mode 100644 index 0000000000000..770c32648591d --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/button_submit/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './button_submit'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.stories.tsx new file mode 100644 index 0000000000000..634436ed40185 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.stories.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { storiesOf } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { DrilldownForm } from '.'; +import type { TriggerPickerProps } from '../trigger_picker'; + +const triggers: TriggerPickerProps = { + items: [ + { + id: 'RANGE_SELECT_TRIGGER', + title: 'Range selected', + description: 'On chart brush.', + }, + { + id: 'VALUE_CLICK_TRIGGER', + title: 'Value click', + description: 'On point click in chart', + }, + ], + selected: ['RANGE_SELECT_TRIGGER'], + docs: 'http://example.com', + onChange: () => {}, +}; + +storiesOf('components/DrilldownForm', module) + .add('Default', () => { + return ( + + children... + + ); + }) + .add('With license link', () => { + return ( + + children... + + ); + }) + .add('No triggers', () => { + return ( + {}, + }} + onNameChange={action('onNameChange')} + > + children... + + ); + }); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.tsx new file mode 100644 index 0000000000000..a4dd8f853b16c --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/drilldown_form.tsx @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFieldText, EuiForm, EuiFormRow, EuiSpacer, EuiCallOut, EuiCode } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { TriggerPicker, TriggerPickerProps } from '../trigger_picker'; + +const txtNameOfDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.nameOfDrilldown', + { + defaultMessage: 'Name', + } +); + +const txtUntitledDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownForm.untitledDrilldown', + { + defaultMessage: 'Untitled drilldown', + } +); + +const txtTrigger = i18n.translate('xpack.uiActionsEnhanced.components.DrilldownForm.trigger', { + defaultMessage: 'Trigger', +}); + +export interface FormDrilldownWizardProps { + /** Value of name field. */ + name?: string; + + /** Callback called on name change. */ + onNameChange?: (name: string) => void; + + /** Trigger picker props. */ + triggers?: TriggerPickerProps; + + /** Whether the form elements should be disabled. */ + disabled?: boolean; +} + +export const DrilldownForm: React.FC = ({ + name = '', + onNameChange, + triggers, + disabled, + children, +}) => { + if (!!triggers && !triggers.items.length) { + // Below callout is not translated, because this message is only for developers. + return ( + +

+ No triggers provided in triggers prop. +

+
+ ); + } + + const nameFragment = ( + + onNameChange(event.target.value) : undefined} + data-test-subj="drilldownNameInput" + /> + + ); + + const triggersFragment = !!triggers && triggers.items.length > 1 && ( + + + + ); + + return ( + + + {nameFragment} + + {triggersFragment} + +
{children}
+
+ ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/index.tsx similarity index 85% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/index.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/index.tsx index 242fb44f2e235..e17aca73a6d4d 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/index.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_form/index.tsx @@ -5,4 +5,4 @@ * 2.0. */ -export * from './list_manage_drilldowns'; +export * from './drilldown_form'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/drilldown_hello_bar.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/drilldown_hello_bar.stories.tsx similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/drilldown_hello_bar.stories.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/drilldown_hello_bar.stories.tsx diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/drilldown_hello_bar.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/drilldown_hello_bar.tsx similarity index 84% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/drilldown_hello_bar.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/drilldown_hello_bar.tsx index 01aad0ae37f3f..af9c78c9a5484 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/drilldown_hello_bar.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/drilldown_hello_bar.tsx @@ -26,10 +26,7 @@ export interface DrilldownHelloBarProps { export const WELCOME_MESSAGE_TEST_SUBJ = 'drilldownsWelcomeMessage'; -export const DrilldownHelloBar: React.FC = ({ - docsLink, - onHideClick = () => {}, -}) => { +export const DrilldownHelloBar: React.FC = ({ docsLink, onHideClick }) => { return ( @@ -49,11 +46,13 @@ export const DrilldownHelloBar: React.FC = ({ )} - - - {txtHideHelpButtonLabel} - - + {!!onHideClick && ( + + + {txtHideHelpButtonLabel} + + + )} ); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/i18n.ts similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/i18n.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/i18n.ts diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/index.tsx similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/drilldown_hello_bar/index.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_hello_bar/index.tsx diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.stories.tsx new file mode 100644 index 0000000000000..57e2e04807a6a --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.stories.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { storiesOf } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { DrilldownTable } from './drilldown_table'; +import { FlyoutFrame } from '../flyout_frame'; + +storiesOf('components/ListManageDrilldowns', module) + .add('Default', () => ( + + )) + .add('Empty list', () => ( + + )) + .add('A single drilldown', () => ( + + )) + .add('Inside a flyout frame', () => ( + + + + )); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.test.tsx similarity index 74% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.test.tsx index d4c497c4a3e4e..ee485f8aee0c0 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.test.tsx @@ -7,26 +7,22 @@ import React from 'react'; import { fireEvent, render } from '@testing-library/react'; -import { - DrilldownListItem, - ListManageDrilldowns, - TEST_SUBJ_DRILLDOWN_ITEM, -} from './list_manage_drilldowns'; +import { DrilldownTable, DrilldownTableItem, TEST_SUBJ_DRILLDOWN_ITEM } from './drilldown_table'; -const drilldowns: DrilldownListItem[] = [ +const drilldowns: DrilldownTableItem[] = [ { id: '1', actionName: 'Dashboard', drilldownName: 'Drilldown 1' }, { id: '2', actionName: 'Dashboard', drilldownName: 'Drilldown 2' }, { id: '3', actionName: 'Dashboard', drilldownName: 'Drilldown 3', error: 'an error' }, ]; test('Render list of drilldowns', () => { - const screen = render(); + const screen = render(); expect(screen.getAllByTestId(TEST_SUBJ_DRILLDOWN_ITEM)).toHaveLength(drilldowns.length); }); test('Emit onEdit() when clicking on edit drilldown', () => { const fn = jest.fn(); - const screen = render(); + const screen = render(); const editButtons = screen.getAllByText('Edit'); expect(editButtons).toHaveLength(drilldowns.length); @@ -36,21 +32,21 @@ test('Emit onEdit() when clicking on edit drilldown', () => { test('Emit onCreate() when clicking on create drilldown', () => { const fn = jest.fn(); - const screen = render(); + const screen = render(); fireEvent.click(screen.getByText('Create new')); expect(fn).toBeCalled(); }); test('Delete button is not visible when non is selected', () => { const fn = jest.fn(); - const screen = render(); + const screen = render(); expect(screen.queryByText(/Delete/i)).not.toBeInTheDocument(); expect(screen.queryByText(/Create/i)).toBeInTheDocument(); }); test('Can delete drilldowns', () => { const fn = jest.fn(); - const screen = render(); + const screen = render(); const checkboxes = screen.getAllByLabelText(/Select this drilldown/i); expect(checkboxes).toHaveLength(3); @@ -66,6 +62,6 @@ test('Can delete drilldowns', () => { }); test('Error is displayed', () => { - const screen = render(); + const screen = render(); expect(screen.getByLabelText('an error')).toBeInTheDocument(); }); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.tsx similarity index 51% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.tsx index 207c4f5037354..2cf4745cbbec4 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/list_manage_drilldowns/list_manage_drilldowns.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/drilldown_table.tsx @@ -6,32 +6,36 @@ */ import { - EuiBasicTable, + EuiInMemoryTable, EuiBasicTableColumn, EuiButton, EuiButtonEmpty, - EuiFlexGroup, - EuiFlexItem, EuiIcon, EuiSpacer, - EuiTextColor, EuiToolTip, } from '@elastic/eui'; import React, { useState } from 'react'; +import { TextWithIcon } from '../text_with_icon'; +import { TriggerLineItem } from '../trigger_line_item'; import { txtCreateDrilldown, txtDeleteDrilldowns, txtEditDrilldown, + txtCloneDrilldown, txtSelectDrilldown, + txtName, + txtAction, + txtTrigger, } from './i18n'; -export interface DrilldownListItem { +export interface DrilldownTableItem { id: string; actionName: string; drilldownName: string; icon?: string; error?: string; triggers?: Trigger[]; + triggerIncompatible?: boolean; } interface Trigger { @@ -39,36 +43,34 @@ interface Trigger { description?: string; } -export interface ListManageDrilldownsProps { - drilldowns: DrilldownListItem[]; +export const TEST_SUBJ_DRILLDOWN_ITEM = 'listManageDrilldownsItem'; - onEdit?: (id: string) => void; +export interface DrilldownTableProps { + items: DrilldownTableItem[]; onCreate?: () => void; onDelete?: (ids: string[]) => void; - - showTriggerColumn?: boolean; + onEdit?: (id: string) => void; + onCopy?: (id: string) => void; } -const noop = () => {}; - -export const TEST_SUBJ_DRILLDOWN_ITEM = 'listManageDrilldownsItem'; - -export function ListManageDrilldowns({ - drilldowns, - onEdit = noop, - onCreate = noop, - onDelete = noop, - showTriggerColumn = true, -}: ListManageDrilldownsProps) { +export const DrilldownTable: React.FC = ({ + items: drilldowns, + onCreate, + onDelete, + onEdit, + onCopy, +}) => { const [selectedDrilldowns, setSelectedDrilldowns] = useState([]); - const columns: Array> = [ + const columns: Array> = [ { - name: 'Name', + field: 'drilldownName', + name: txtName, + sortable: true, 'data-test-subj': 'drilldownListItemName', - render: (drilldown: DrilldownListItem) => ( + render: (drilldownName: string, drilldown: DrilldownTableItem) => (
- {drilldown.drilldownName}{' '} + {drilldownName}{' '} {drilldown.error && ( ( - - {drilldown.icon && ( - - - - )} - - {drilldown.actionName} - - + name: txtAction, + render: (drilldown: DrilldownTableItem) => ( + + {drilldown.actionName} + ), }, - showTriggerColumn && { - name: 'Trigger', + { + field: 'triggers', + name: txtTrigger, textOnly: true, - render: (drilldown: DrilldownListItem) => - drilldown.triggers?.map((trigger, idx) => - trigger.description ? ( - - {trigger.title ?? 'unknown'} - - ) : ( - - {trigger.title ?? 'unknown'} - - ) - ), + sortable: (drilldown: DrilldownTableItem) => + drilldown.triggers ? drilldown.triggers[0].title : '', + render: (triggers: unknown, drilldown: DrilldownTableItem) => { + if (!drilldown.triggers) return null; + const trigger = drilldown.triggers[0]; + return ( + + {trigger.title ?? 'unknown'} + + ); + }, }, { align: 'right', - width: '64px', - render: (drilldown: DrilldownListItem) => ( - onEdit(drilldown.id)}> - {txtEditDrilldown} - + render: (drilldown: DrilldownTableItem) => ( + <> + {!!onEdit && ( + onEdit(drilldown.id)} + > + {txtEditDrilldown} + + )} + {!!onCopy && ( + onCopy(drilldown.id)} + > + {txtCloneDrilldown} + + )} + ), }, - ].filter(Boolean) as Array>; + ].filter(Boolean) as Array>; return ( <> - - {selectedDrilldowns.length === 0 ? ( + {!!onCreate && !selectedDrilldowns.length && ( onCreate()}> {txtCreateDrilldown} - ) : ( + )} + {!!onDelete && selectedDrilldowns.length > 0 && ( ); -} +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/i18n.ts new file mode 100644 index 0000000000000..d465167555c31 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/i18n.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const txtCreateDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.createDrilldownButtonLabel', + { + defaultMessage: 'Create new', + } +); + +export const txtEditDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.editDrilldownButtonLabel', + { + defaultMessage: 'Edit', + } +); + +export const txtCloneDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.copyDrilldownButtonLabel', + { + defaultMessage: 'Copy', + } +); + +export const txtDeleteDrilldowns = (count: number) => + i18n.translate('xpack.uiActionsEnhanced.components.DrilldownTable.deleteDrilldownsButtonLabel', { + defaultMessage: 'Delete ({count})', + values: { + count, + }, + }); + +export const txtSelectDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.selectThisDrilldownCheckboxLabel', + { + defaultMessage: 'Select this drilldown', + } +); + +export const txtName = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.nameColumnTitle', + { + defaultMessage: 'Name', + } +); + +export const txtAction = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.actionColumnTitle', + { + defaultMessage: 'Action', + } +); + +export const txtTrigger = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTable.triggerColumnTitle', + { + defaultMessage: 'Trigger', + } +); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/index.tsx new file mode 100644 index 0000000000000..1600cd63f4768 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_table/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_table'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/drilldown_template_table.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/drilldown_template_table.tsx new file mode 100644 index 0000000000000..85d629dae9a1b --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/drilldown_template_table.tsx @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { + EuiInMemoryTable, + EuiBasicTableColumn, + EuiButtonEmpty, + EuiSpacer, + EuiButton, + EuiText, + EuiSearchBarProps, +} from '@elastic/eui'; +import { + txtNameColumnTitle, + txtSelectableMessage, + txtCopyButtonLabel, + txtSingleItemCopyActionLabel, + txtActionColumnTitle, + txtTriggerColumnTitle, +} from './i18n'; +import { TextWithIcon } from '../text_with_icon'; +import { TriggerLineItem } from '../trigger_line_item'; + +export interface DrilldownTemplateTableItem { + id: string; + name: string; + icon?: string; + description?: string; + actionName?: string; + actionIcon?: string; + trigger?: string; + triggerIncompatible?: boolean; +} + +export interface DrilldownTemplateTableProps { + items: DrilldownTemplateTableItem[]; + onCreate?: (id: string) => void; + onClone?: (ids: string[]) => void; +} + +export const DrilldownTemplateTable: React.FC = ({ + items, + onCreate, + onClone, +}) => { + const [selected, setSelected] = useState([]); + + const columns: Array> = [ + { + field: 'name', + name: txtNameColumnTitle, + sortable: true, + render: (omit, item: DrilldownTemplateTableItem) => ( +
+
{item.name}
+ + {item.description} + +
+ ), + }, + { + name: txtActionColumnTitle, + render: (item: DrilldownTemplateTableItem) => ( + + {item.actionName} + + ), + }, + { + field: 'trigger', + name: txtTriggerColumnTitle, + sortable: true, + render: (omit, item: DrilldownTemplateTableItem) => ( + {item.trigger} + ), + }, + { + align: 'right', + render: (drilldown: DrilldownTemplateTableItem) => + !!onCreate && ( + onCreate(drilldown.id)} + > + {txtSingleItemCopyActionLabel} + + ), + }, + ]; + + const search: EuiSearchBarProps = { + box: { + incremental: true, + }, + defaultQuery: '', + }; + + return ( + <> + { + setSelected(selection.map((drilldown) => drilldown.id)); + }, + selectableMessage: () => txtSelectableMessage, + }} + hasActions={true} + /> + + {!!onClone && !!selected.length && ( + onClone(selected)}> + {txtCopyButtonLabel(selected.length)} + + )} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/i18n.ts new file mode 100644 index 0000000000000..cfdc5b99f338d --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/i18n.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const txtSelectableMessage = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTemplateTable.selectableMessage', + { + defaultMessage: 'Select this template', + } +); + +export const txtNameColumnTitle = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTemplateTable.nameColumnTitle', + { + defaultMessage: 'Name', + description: 'Title of the first column in drilldown template cloning table.', + } +); + +export const txtSourceColumnTitle = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTemplateTable.sourceColumnTitle', + { + defaultMessage: 'Panel', + description: 'Column title which describes from where the drilldown is cloned.', + } +); + +export const txtActionColumnTitle = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTemplateTable.actionColumnTitle', + { + defaultMessage: 'Action', + } +); + +export const txtTriggerColumnTitle = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTemplateTable.triggerColumnTitle', + { + defaultMessage: 'Trigger', + } +); + +export const txtSingleItemCopyActionLabel = i18n.translate( + 'xpack.uiActionsEnhanced.components.DrilldownTemplateTable.singleItemCopyAction', + { + defaultMessage: 'Copy', + description: '"Copy" action button label in drilldown template cloning table last column.', + } +); + +export const txtCopyButtonLabel = (count: number) => + i18n.translate('xpack.uiActionsEnhanced.components.DrilldownTemplateTable.copyButtonLabel', { + defaultMessage: 'Copy ({count})', + description: 'Label of drilldown template table bottom copy button.', + values: { + count, + }, + }); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/index.tsx new file mode 100644 index 0000000000000..0753e03a44e6f --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/drilldown_template_table/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_template_table'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/flyout_frame.stories.tsx similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.stories.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/flyout_frame.stories.tsx diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/flyout_frame.test.tsx similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.test.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/flyout_frame.test.tsx diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/flyout_frame.tsx similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/flyout_frame.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/flyout_frame.tsx diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/i18n.ts similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/i18n.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/i18n.ts diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/index.tsx similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_frame/index.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/flyout_frame/index.tsx diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/index.tsx new file mode 100644 index 0000000000000..bf312643597f0 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './text_with_icon'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/text_with_icon.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/text_with_icon.tsx new file mode 100644 index 0000000000000..9b7fe346547b1 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/text_with_icon/text_with_icon.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { + EuiTextColor, + EuiTextColorProps, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiToolTip, +} from '@elastic/eui'; + +export interface TextWithIconProps { + color?: EuiTextColorProps['color']; + tooltip?: React.ReactNode; + icon?: string; + iconColor?: string; + iconTooltip?: React.ReactNode; +} + +export const TextWithIcon: React.FC = ({ + color, + tooltip, + icon, + iconColor, + iconTooltip, + children, +}) => { + return ( + + {!!icon && ( + + {!!iconTooltip ? ( + + + + ) : ( + + )} + + )} + {!!children && ( + + {tooltip ? ( + + {children} + + ) : ( + {children} + )} + + )} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/index.tsx new file mode 100644 index 0000000000000..12a55d19d8fa1 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './trigger_line_item'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/trigger_line_item.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/trigger_line_item.tsx new file mode 100644 index 0000000000000..c8f4ccdd2fbf3 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_line_item/trigger_line_item.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { i18n } from '@kbn/i18n'; +import { TextWithIcon } from '../text_with_icon'; + +export const txtIncompatibleTooltip = i18n.translate( + 'xpack.uiActionsEnhanced.components.TriggerLineItem.incompatibleTooltip', + { + defaultMessage: 'This trigger type not supported by this panel', + } +); + +export interface TriggerLineItemProps { + tooltip?: React.ReactNode; + incompatible?: boolean; +} + +export const TriggerLineItem: React.FC = ({ + tooltip, + incompatible, + children, +}) => { + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/index.ts new file mode 100644 index 0000000000000..cdb6fbe54698d --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { TriggerPickerItemDescription } from './trigger_picker_item'; +export * from './trigger_picker'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.stories.tsx new file mode 100644 index 0000000000000..77f3eadcc0bca --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.stories.tsx @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { storiesOf } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { TriggerPicker } from '.'; + +const Demo: React.FC = () => { + const [triggers, setTriggers] = React.useState(['RANGE_SELECT_TRIGGER']); + + return ( + + ); +}; + +storiesOf('components/TriggerPicker', module) + .add('Default', () => { + return ( + + ); + }) + .add('With docs', () => { + return ( + + ); + }) + .add('Selected trigger', () => { + return ( + + ); + }) + .add('Interactive', () => { + return ; + }); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.tsx new file mode 100644 index 0000000000000..728b144b4db0e --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiText, EuiToolTip, EuiFormFieldset, EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { TriggerPickerItemDescription, TriggerPickerItem } from './trigger_picker_item'; + +const txtTriggerPickerLabel = i18n.translate( + 'xpack.uiActionsEnhanced.components.actionWizard.triggerPickerLabel', + { + defaultMessage: 'Show option on:', + } +); + +const txtTriggerPickerHelpText = i18n.translate( + 'xpack.uiActionsEnhanced.components.actionWizard.triggerPickerHelpText', + { + defaultMessage: "What's this?", + } +); + +const txtTriggerPickerHelpTooltip = i18n.translate( + 'xpack.uiActionsEnhanced.components.actionWizard.triggerPickerHelpTooltip', + { + defaultMessage: 'Determines when the drilldown appears in context menu', + } +); + +export interface TriggerPickerProps { + /** List of available triggers. */ + items: TriggerPickerItemDescription[]; + + /** List of IDs of selected triggers. */ + selected?: string[]; + + /** Link to documentation. */ + docs?: string; + + /** Whether user interactions should be disabled. */ + disabled?: boolean; + + /** Called on trigger selection change. */ + onChange: (selected: string[]) => void; +} + +export const TriggerPicker: React.FC = ({ + items, + selected = [], + docs, + disabled, + onChange, +}) => { + return ( + +
+ {txtTriggerPickerLabel}{' '} + + + {txtTriggerPickerHelpText} + + +
+ + ), + }} + style={{ maxWidth: `80%` }} + > + {items.map((trigger) => ( + onChange([id])} + /> + ))} +
+ ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker_item.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker_item.tsx new file mode 100644 index 0000000000000..70ab08d20f0c1 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/trigger_picker/trigger_picker_item.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiSpacer, EuiText, EuiCheckableCard, EuiTextColor, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +const txtUnknown = i18n.translate('xpack.uiActionsEnhanced.components.TriggerPickerItem.unknown', { + defaultMessage: 'Unknown', +}); + +export interface TriggerPickerItemDescription { + id: string; + title?: string; + description?: string; +} + +export interface TriggerPickerItemProps extends TriggerPickerItemDescription { + /** Whether the item is selected. */ + checked?: boolean; + + /** Whether to disable user interaction. */ + disabled?: boolean; + + /** Called when item is selected by user. */ + onSelect: (id: string) => void; +} + +export const TriggerPickerItem: React.FC = ({ + id, + title = txtUnknown, + description, + checked, + disabled, + onSelect, +}) => { + const descriptionFragment = !!description && ( +
+ + {description} + +
+ ); + + const label = ( + <> + + {title} + + {descriptionFragment} + + ); + + return ( + <> + onSelect(id)} + data-test-subj={`triggerPicker-${id}`} + /> + + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/types.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/types.ts new file mode 100644 index 0000000000000..4d6e5354604a1 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/components/types.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { ActionFactoryPlaceContext } from '../types'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/action_factory_picker.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/action_factory_picker.tsx new file mode 100644 index 0000000000000..db9951f235dfc --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/action_factory_picker.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ActionFactoryPicker as ActionFactoryPickerUi } from '../../../../components/action_factory_picker'; +import { useDrilldownManager } from '../context'; +import { ActionFactoryView } from '../action_factory_view'; + +export const ActionFactoryPicker: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const factory = drilldowns.useActionFactory(); + const context = React.useMemo(() => drilldowns.getActionFactoryContext(), [drilldowns]); + + if (!!factory) { + return ; + } + + return ( + { + drilldowns.setActionFactory(actionFactory); + }} + /> + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/index.ts new file mode 100644 index 0000000000000..3d7ffed301859 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_picker/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './action_factory_picker'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/action_factory_view.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/action_factory_view.tsx new file mode 100644 index 0000000000000..0a389d6f1f615 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/action_factory_view.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ActionFactory as ActionFactoryUi } from '../../components/action_factory'; +import { ActionFactory, BaseActionFactoryContext } from '../../../../dynamic_actions'; +import { useDrilldownManager } from '../context'; + +export interface ActionFactoryViewProps { + factory: ActionFactory; + context: BaseActionFactoryContext; + constant?: boolean; +} + +export const ActionFactoryView: React.FC = ({ + factory, + context, + constant, +}) => { + const drilldowns = useDrilldownManager(); + const name = React.useMemo(() => factory.getDisplayName(context), [factory, context]); + const icon = React.useMemo(() => factory.getIconType(context), [factory, context]); + const handleChange = React.useMemo(() => { + if (constant) return undefined; + return () => drilldowns.setActionFactory(undefined); + }, [drilldowns, constant]); + + return ; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/index.ts new file mode 100644 index 0000000000000..d56fb06510fff --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/action_factory_view/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './action_factory_view'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/context.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/context.tsx new file mode 100644 index 0000000000000..cc0434b86bdcb --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/context.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { DrilldownManagerState, DrilldownManagerStateDeps } from '../../state'; + +const context = React.createContext(null); + +export const useDrilldownManager = () => React.useContext(context)!; + +export type DrilldownManagerProviderProps = DrilldownManagerStateDeps; + +export const DrilldownManagerProvider: React.FC = ({ + children, + ...deps +}) => { + // eslint-disable-next-line react-hooks/exhaustive-deps + const value = React.useMemo(() => new DrilldownManagerState(deps), []); + + return {children}; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/index.ts new file mode 100644 index 0000000000000..e9a2f3ab7be99 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/context/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './context'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/create_drilldown_form.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/create_drilldown_form.tsx new file mode 100644 index 0000000000000..bd4a4fd3d051b --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/create_drilldown_form.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { i18n } from '@kbn/i18n'; +import useMountedState from 'react-use/lib/useMountedState'; +import { DrilldownManagerTitle } from '../drilldown_manager_title'; +import { useDrilldownManager } from '../context'; +import { ActionFactoryPicker } from '../action_factory_picker'; +import { DrilldownManagerFooter } from '../drilldown_manager_footer'; +import { DrilldownStateForm } from '../drilldown_state_form'; +import { ButtonSubmit } from '../../components/button_submit'; + +const txtCreateDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.createDrilldownForm.title', + { + defaultMessage: 'Create Drilldown', + description: 'Drilldowns flyout title for new drilldown form.', + } +); + +const txtCreateDrilldownButton = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.createDrilldownForm.primaryButton', + { + defaultMessage: 'Create drilldown', + description: 'Primary button on new drilldown creation form.', + } +); + +export const CreateDrilldownForm: React.FC = () => { + const isMounted = useMountedState(); + const drilldowns = useDrilldownManager(); + const drilldownState = drilldowns.getDrilldownState()!; + const error = drilldownState.useError(); + const [disabled, setDisabled] = React.useState(false); + + const handleCreate = () => { + setDisabled(true); + drilldowns.createDrilldown().finally(() => { + if (!isMounted()) return; + setDisabled(false); + }); + }; + + return ( + <> + {txtCreateDrilldown} + + {!!drilldownState && } + {!!drilldownState && ( + + + {txtCreateDrilldownButton} + + + )} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/index.ts new file mode 100644 index 0000000000000..0f5fcbca00fe0 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/create_drilldown_form/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './create_drilldown_form'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/cloning_notification.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/cloning_notification.tsx new file mode 100644 index 0000000000000..3c292fcb49ff3 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/cloning_notification.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiCallOut, EuiSpacer, EuiLink } from '@elastic/eui'; +import * as React from 'react'; +import { i18n } from '@kbn/i18n'; + +const txtDismiss = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.dismiss', + { + defaultMessage: 'Dismiss', + description: 'Dismiss button in cloning notification callout.', + } +); + +const txtBody = (count: number) => + i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.body', + { + defaultMessage: '{count, number} {count, plural, one {drilldown} other {drilldowns}} copied.', + description: 'Title of notification show when one or more drilldowns were copied.', + values: { + count, + }, + } + ); + +export interface CloningNotificationProps { + count?: number; +} + +export const CloningNotification: React.FC = ({ count = 1 }) => { + const [dismissed, setDismissed] = React.useState(false); + + if (dismissed) return null; + + const title = ( + <> + {txtBody(count)} setDismissed(true)}>{txtDismiss} + + ); + + return ( + <> + + + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/drilldown_list.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/drilldown_list.tsx new file mode 100644 index 0000000000000..41f062ae87327 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/drilldown_list.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { DrilldownTable } from '../../components/drilldown_table'; +import { useDrilldownManager } from '../context'; +import { CloningNotification } from './cloning_notification'; + +const FIVE_SECONDS = 5e3; + +export const DrilldownList: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const events = drilldowns.useEvents(); + const cloningNotificationCount = React.useMemo( + () => + !!drilldowns.lastCloneRecord && drilldowns.lastCloneRecord.time > Date.now() - FIVE_SECONDS + ? drilldowns.lastCloneRecord.templateIds.length + : 0, + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + React.useEffect(() => { + drilldowns.lastCloneRecord = null; + }); + + const notification = !!cloningNotificationCount && ( + + ); + + return ( + <> + {notification} + { + drilldowns.setRoute(['manage', id]); + }} + onCopy={drilldowns.onCreateFromDrilldown} + /> + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/index.ts new file mode 100644 index 0000000000000..40e01173d1cca --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_list/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_list'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/create_public_drilldown_manager.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/create_public_drilldown_manager.tsx new file mode 100644 index 0000000000000..6b7d8a7a19360 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/create_public_drilldown_manager.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { DrilldownManagerDependencies, PublicDrilldownManagerProps } from '../../types'; +import { DrilldownManagerProvider } from '../context'; +import { DrilldownManager } from './drilldown_manager'; + +export type PublicDrilldownManagerComponent = React.FC; + +/** + * This HOC creates a "public" `` component `PublicDrilldownManagerComponent`, + * which can be exported from plugin contract for other plugins to consume. + */ +export const createPublicDrilldownManager = ( + dependencies: DrilldownManagerDependencies +): PublicDrilldownManagerComponent => { + const PublicDrilldownManager: PublicDrilldownManagerComponent = (drilldownManagerProps) => { + return ( + + + + ); + }; + + return PublicDrilldownManager; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager.tsx new file mode 100644 index 0000000000000..a09411a14d83f --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { useDrilldownManager } from '../context'; +import { FlyoutFrame } from '../../components/flyout_frame'; +import { DrilldownManagerContent } from './drilldown_manager_content'; +import { RenderDrilldownManagerTitle } from '../drilldown_manager_title'; +import { RenderDrilldownManagerFooter } from '../drilldown_manager_footer'; +import { HelloBar } from '../hello_bar'; + +export const DrilldownManager: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const route = drilldowns.useRoute(); + + const handleBack = + route.length < 2 ? undefined : () => drilldowns.setRoute(route.slice(0, route.length - 1)); + + return ( + } + banner={} + footer={} + onClose={drilldowns.close} + onBack={handleBack} + > + + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager_content.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager_content.tsx new file mode 100644 index 0000000000000..a0a7d94080ea0 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/drilldown_manager_content.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { CreateDrilldownForm } from '../create_drilldown_form'; +import { Tabs } from '../tabs'; +import { useDrilldownManager } from '../context'; +import { EditDrilldownForm } from '../edit_drilldown_form'; + +export const DrilldownManagerContent: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const route = drilldowns.useRoute(); + + if (route[0] === 'new' && !!route[1]) return ; + if (route[0] === 'manage' && !!route[1]) return ; + + return ; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/index.ts similarity index 74% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/index.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/index.ts index 8c69e44a90a63..fd2b7adf3e4bc 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/index.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager/index.ts @@ -5,4 +5,5 @@ * 2.0. */ -export { createFlyoutManageDrilldowns } from './connected_flyout_manage_drilldowns'; +export * from './drilldown_manager'; +export * from './create_public_drilldown_manager'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/drilldown_manager_footer.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/drilldown_manager_footer.tsx new file mode 100644 index 0000000000000..5cd5c712a1493 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/drilldown_manager_footer.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { useDrilldownManager } from '../context'; + +export const DrilldownManagerFooter: React.FC = ({ children }) => { + const drilldowns = useDrilldownManager(); + React.useEffect(() => { + drilldowns.setFooter(children); + return () => { + drilldowns.setFooter(null); + }; + }); + return null; +}; + +export const RenderDrilldownManagerFooter: React.FC = () => { + const drilldowns = useDrilldownManager(); + const footer = drilldowns.useFooter(); + return <>{footer}; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/index.ts new file mode 100644 index 0000000000000..61e6d642515c8 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_footer/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_manager_footer'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/drilldown_manager_title.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/drilldown_manager_title.tsx new file mode 100644 index 0000000000000..63a02f65df939 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/drilldown_manager_title.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { useDrilldownManager } from '../context'; + +export const DrilldownManagerTitle: React.FC = ({ children }) => { + const drilldowns = useDrilldownManager(); + React.useEffect(() => { + drilldowns.setTitle(children); + return () => { + drilldowns.resetTitle(); + }; + }); + return null; +}; + +export const RenderDrilldownManagerTitle: React.FC = () => { + const drilldowns = useDrilldownManager(); + const title = drilldowns.useTitle(); + return <>{title}; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/index.ts new file mode 100644 index 0000000000000..8e015bd7bca06 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_manager_title/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_manager_title'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/drilldown_state_form.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/drilldown_state_form.tsx new file mode 100644 index 0000000000000..44b9cf60916fb --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/drilldown_state_form.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { useDrilldownManager } from '../context'; +import { DrilldownForm } from '../../components/drilldown_form'; +import type { DrilldownState } from '../../state'; +import type { TriggerPickerProps } from '../../components/trigger_picker'; + +export interface DrilldownStateFormProps { + state: DrilldownState; + disabled?: boolean; +} + +export const DrilldownStateForm: React.FC = ({ state, disabled }) => { + const drilldowns = useDrilldownManager(); + const name = state.useName(); + const triggers = state.useTriggers(); + const config = state.useConfig(); + const triggerPickerProps: TriggerPickerProps = React.useMemo( + () => ({ + items: state.uiTriggers.map((id) => { + const trigger = drilldowns.deps.getTrigger(id); + return trigger; + }), + selected: triggers, + onChange: state.setTriggers, + }), + [drilldowns, triggers, state] + ); + const context = state.getFactoryContext(); + + return ( + + {} : state.setConfig} + context={context} + /> + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/index.ts new file mode 100644 index 0000000000000..e06cb66ff99bc --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/drilldown_state_form/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_state_form'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/edit_drilldown_form.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/edit_drilldown_form.tsx new file mode 100644 index 0000000000000..421547c8210dd --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/edit_drilldown_form.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { i18n } from '@kbn/i18n'; +import useMountedState from 'react-use/lib/useMountedState'; +import { DrilldownManagerTitle } from '../drilldown_manager_title'; +import { useDrilldownManager } from '../context'; +import { ActionFactoryView } from '../action_factory_view'; +import { DrilldownManagerFooter } from '../drilldown_manager_footer'; +import { DrilldownStateForm } from '../drilldown_state_form'; +import { ButtonSubmit } from '../../components/button_submit'; + +const txtEditDrilldown = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.editDrilldownForm.title', + { + defaultMessage: 'Edit Drilldown', + description: 'Drilldowns flyout title for edit drilldown form.', + } +); + +const txtEditDrilldownButton = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.editDrilldownForm.primaryButton', + { + defaultMessage: 'Save', + description: 'Primary button on new drilldown edit form.', + } +); + +export interface EditDrilldownFormProps { + eventId: string; +} + +export const EditDrilldownForm: React.FC = ({ eventId }) => { + const isMounted = useMountedState(); + const drilldowns = useDrilldownManager(); + const drilldownState = React.useMemo(() => drilldowns.createEventDrilldownState(eventId), [ + drilldowns, + eventId, + ]); + const [disabled, setDisabled] = React.useState(false); + + if (!drilldownState) return null; + + const handleSave = () => { + setDisabled(true); + drilldowns.updateEvent(eventId, drilldownState).finally(() => { + if (!isMounted()) return; + setDisabled(false); + }); + }; + + return ( + <> + {txtEditDrilldown} + + {!!drilldownState && } + {!!drilldownState && ( + + + {txtEditDrilldownButton} + + + )} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/index.ts new file mode 100644 index 0000000000000..ec10df49a727d --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/edit_drilldown_form/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './edit_drilldown_form'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/create_drilldown_form.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/create_drilldown_form.tsx new file mode 100644 index 0000000000000..3382a5dd82fbb --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/create_drilldown_form.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { useDrilldownManager } from '../context'; +import { DrilldownForm } from '../../components/drilldown_form'; +import { DrilldownState } from '../../state'; +import { TriggerPickerProps } from '../../components/trigger_picker'; + +export interface CreateDrilldownFormProps { + state: DrilldownState; +} + +export const CreateDrilldownForm: React.FC = ({ state }) => { + const drilldowns = useDrilldownManager(); + const name = state.useName(); + const triggers = state.useTriggers(); + const config = state.useConfig(); + const triggerPickerProps: TriggerPickerProps = React.useMemo( + () => ({ + items: state.uiTriggers.map((id) => { + const trigger = drilldowns.deps.getTrigger(id); + return trigger; + }), + selected: triggers, + onChange: state.setTriggers, + }), + [drilldowns, triggers, state] + ); + const context = state.getFactoryContext(); + + return ( + + + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/edit_drilldown_form.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/edit_drilldown_form.tsx new file mode 100644 index 0000000000000..1ee8291b30774 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/edit_drilldown_form.tsx @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiButton, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useDrilldownManager } from '../context'; +import { DrilldownForm } from '../../components/drilldown_form'; +import { DrilldownState } from '../../state'; +import { TriggerPickerProps } from '../../components/trigger_picker'; + +export const txtDeleteDrilldownButtonLabel = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.deleteDrilldownButtonLabel', + { + defaultMessage: 'Delete drilldown', + } +); + +export interface EditDrilldownFormProps { + state: DrilldownState; +} + +export const EditDrilldownForm: React.FC = ({ state }) => { + const drilldowns = useDrilldownManager(); + const name = state.useName(); + const triggers = state.useTriggers(); + const config = state.useConfig(); + const triggerPickerProps: TriggerPickerProps = React.useMemo( + () => ({ + items: state.uiTriggers.map((id) => { + const trigger = drilldowns.deps.getTrigger(id); + return trigger; + }), + selected: triggers, + onChange: state.setTriggers, + }), + [drilldowns, triggers, state] + ); + const context = state.getFactoryContext(); + + return ( + <> + + + + + { + alert('DELETE!'); + }} + color={'danger'} + > + {txtDeleteDrilldownButtonLabel} + + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/form_drilldown_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/form_drilldown_wizard.tsx new file mode 100644 index 0000000000000..ddb08ee407118 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/form_drilldown_wizard.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ActionFactoryPicker } from '../action_factory_picker'; +import { useDrilldownManager } from '../context'; +import { CreateDrilldownForm } from './create_drilldown_form'; + +export const FormDrilldownWizard: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const actionFactory = drilldowns.useActionFactory(); + + const drilldownState = drilldowns.getDrilldownState(); + let content: React.ReactNode = null; + + if (!actionFactory) content = null; + if (drilldownState) content = ; + + return ( + <> + + {content} + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/i18n.ts similarity index 68% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/i18n.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/i18n.ts index 36f3ee6cc2393..28ebe53e05f87 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/i18n.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/i18n.ts @@ -21,20 +21,6 @@ export const txtEditDrilldownTitle = i18n.translate( } ); -export const txtCreateDrilldownButtonLabel = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.createDrilldownButtonLabel', - { - defaultMessage: 'Create drilldown', - } -); - -export const txtEditDrilldownButtonLabel = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.editDrilldownButtonLabel', - { - defaultMessage: 'Save', - } -); - export const txtDeleteDrilldownButtonLabel = i18n.translate( 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.deleteDrilldownButtonLabel', { diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/index.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/index.ts similarity index 100% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/index.tsx rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/form_drilldown_wizard/index.ts diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/hello_bar.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/hello_bar.tsx new file mode 100644 index 0000000000000..08fbcb4ad2421 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/hello_bar.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { useDrilldownManager } from '../context'; +import { DrilldownHelloBar } from '../../components/drilldown_hello_bar'; + +export const HelloBar: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const hideWelcomeMessage = drilldowns.useWelcomeMessage(); + + if (hideWelcomeMessage) return null; + + return ( + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/index.ts new file mode 100644 index 0000000000000..54c7f1a8b131b --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/hello_bar/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './hello_bar'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/index.ts new file mode 100644 index 0000000000000..85ee586367406 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { createPublicDrilldownManager, PublicDrilldownManagerComponent } from './drilldown_manager'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/index.ts new file mode 100644 index 0000000000000..dde0170c6f13b --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './tabs'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/tabs.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/tabs.tsx new file mode 100644 index 0000000000000..c8514d91a343b --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/tabs/tabs.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { EuiSpacer, EuiTabbedContent, EuiTabbedContentProps } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useDrilldownManager } from '../context'; +import { FormDrilldownWizard } from '../form_drilldown_wizard'; +import { DrilldownList } from '../drilldown_list'; +import { TemplatePicker } from '../template_picker'; + +export const txtCreateNew = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.DrilldownManager.createNew', + { + defaultMessage: 'Create new', + } +); + +export const txtManage = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.containers.DrilldownManager.manage', + { + defaultMessage: 'Manage', + } +); + +const tabs: EuiTabbedContentProps['tabs'] = [ + { + id: 'create', + name: txtCreateNew, + content: ( + <> + + + + + + ), + }, + { + id: 'manage', + name: txtManage, + content: ( + <> + + + + ), + }, +]; + +export const Tabs: React.FC = ({}) => { + const drilldowns = useDrilldownManager(); + const route = drilldowns.useRoute(); + + return ( + id === route[0])} + onTabClick={({ id }) => drilldowns.setRoute([id])} + /> + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/i18n.ts similarity index 57% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/i18n.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/i18n.ts index b6139d02fe508..e947e246081d5 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_list_manage_drilldowns/i18n.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/i18n.ts @@ -7,9 +7,10 @@ import { i18n } from '@kbn/i18n'; -export const txtManageDrilldowns = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.FlyoutListManageDrilldowns.manageDrilldownsTitle', +export const txtLabel = i18n.translate( + 'xpack.uiActionsEnhanced.drilldownManager.containers.TemplatePicker.label', { - defaultMessage: 'Manage Drilldowns', + defaultMessage: 'Copy existing drilldown', + description: 'Label above template picker table.', } ); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/index.ts new file mode 100644 index 0000000000000..98b9cf637cf9e --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './template_picker'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_list.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_list.tsx new file mode 100644 index 0000000000000..85422370e88c2 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_list.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiTitle, EuiSpacer } from '@elastic/eui'; +import * as React from 'react'; +import { + DrilldownTemplateTable, + DrilldownTemplateTableItem, +} from '../../components/drilldown_template_table'; +import { DrilldownTemplate } from '../../types'; +import { useDrilldownManager } from '../context'; +import { txtLabel } from './i18n'; + +export interface TemplateListProps { + items: DrilldownTemplate[]; +} + +export const TemplateList: React.FC = ({ items }) => { + const drilldowns = useDrilldownManager(); + const tableItems: DrilldownTemplateTableItem[] = React.useMemo< + DrilldownTemplateTableItem[] + >(() => { + return items.map((item) => { + const factory = drilldowns.deps.actionFactories.find(({ id }) => id === item.factoryId); + const trigger = drilldowns.deps.getTrigger(item.triggers[0]); + const tableItem: DrilldownTemplateTableItem = { + id: item.id, + name: item.name, + icon: item.icon, + description: item.description, + triggerIncompatible: !drilldowns.deps.triggers.find((t) => t === trigger.id), + }; + + if (factory) { + const context = drilldowns.getActionFactoryContext(); + tableItem.actionName = factory.getDisplayName(context); + tableItem.actionIcon = factory.getIconType(context); + } + if (trigger) { + tableItem.trigger = trigger.title; + } + return tableItem; + }); + }, [drilldowns, items]); + + return ( + <> + +

{txtLabel}

+
+ + + + ); +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_picker.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_picker.tsx new file mode 100644 index 0000000000000..d6004e71ec60a --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/containers/template_picker/template_picker.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as React from 'react'; +import { useDrilldownManager } from '../context'; +import { TemplateList } from './template_list'; + +export const TemplatePicker: React.FC = () => { + const drilldowns = useDrilldownManager(); + + const { templates } = drilldowns.deps; + + if (!templates || !templates.length) return null; + + return ; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/hooks/use_sync_observable.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/hooks/use_sync_observable.ts new file mode 100644 index 0000000000000..d5c7bda0377f9 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/hooks/use_sync_observable.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useRef, useMemo } from 'react'; +import { Observable, Subscription } from 'rxjs'; +import useIsomorphicLayoutEffect from 'react-use/lib/useIsomorphicLayoutEffect'; +import useUpdate from 'react-use/lib/useUpdate'; + +export const useSyncObservable = (observable: Observable): T => { + const firstRef = useRef(true); + const valueRef = useRef(); + const update = useUpdate(); + const subscriptionRef = useRef(undefined); + subscriptionRef.current = useMemo(() => { + if (subscriptionRef.current) { + subscriptionRef.current.unsubscribe(); + subscriptionRef.current = undefined; + firstRef.current = true; + } + return observable.subscribe((value) => { + valueRef.current = value; + if (firstRef.current) firstRef.current = false; + update(); + }); + }, [observable, update]); + useIsomorphicLayoutEffect( + () => () => { + if (subscriptionRef.current) { + subscriptionRef.current.unsubscribe(); + } + }, + [] + ); + return valueRef.current!; +}; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/index.ts new file mode 100644 index 0000000000000..b00fcf5f33959 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './types'; +export * from './containers'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.test.tsx new file mode 100644 index 0000000000000..5d0642ec80ced --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.test.tsx @@ -0,0 +1,319 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ActionFactory, MemoryActionStorage } from '../../../dynamic_actions'; +import { DrilldownManagerState, DrilldownManagerStateDeps } from './drilldown_manager_state'; +import { DynamicActionManager } from '../../../dynamic_actions/dynamic_action_manager'; +import { uiActionsEnhancedPluginMock } from '../../../mocks'; +import { Trigger } from 'src/plugins/ui_actions/public'; +import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; +import { notificationServiceMock } from 'src/core/public/mocks'; +import { DrilldownState } from './drilldown_state'; + +class StorageWrapperMock implements IStorageWrapper { + public _data = new Map(); + + get = (key: string) => { + if (!this._data.has(key)) return null; + return this._data.get(key); + }; + + set = (key: string, value: unknown) => { + this._data.set(key, value); + }; + + remove = (key: string) => { + this._data.delete(key); + }; + + clear = () => {}; +} + +const createDrilldownManagerState = () => { + const factory1 = new ActionFactory( + { + id: 'FACTORY1', + CollectConfig: () => ({ render: () => {} }), + supportedTriggers: () => ['TRIGGER1', 'TRIGGER2'], + isConfigValid: () => true, + createConfig: () => ({}), + create: () => ({ + id: 'FACTOR1_ACTION', + execute: async () => {}, + }), + }, + {} + ); + const factory2 = new ActionFactory( + { + id: 'FACTORY2', + CollectConfig: () => ({ render: () => {} }), + supportedTriggers: () => ['TRIGGER2', 'TRIGGER3'], + isConfigValid: () => true, + createConfig: () => ({}), + create: () => ({ + id: 'FACTOR2_ACTION', + execute: async () => {}, + }), + }, + {} + ); + const factory3 = new ActionFactory( + { + id: 'FACTORY3', + CollectConfig: () => ({ render: () => {} }), + supportedTriggers: () => ['TRIGGER_MISSING'], + isConfigValid: () => true, + createConfig: () => ({}), + create: () => ({ + id: 'FACTOR3_ACTION', + execute: async () => {}, + }), + }, + {} + ); + const trigger1: Trigger = { + id: 'TRIGGER1', + }; + const trigger2: Trigger = { + id: 'TRIGGER2', + }; + const trigger3: Trigger = { + id: 'TRIGGER3', + }; + const uiActions = uiActionsEnhancedPluginMock.createPlugin(); + const uiActionsStart = uiActions.doStart(); + (uiActionsStart as any).attachAction = () => {}; + (uiActionsStart as any).detachAction = () => {}; + (uiActionsStart as any).hasActionFactory = (actionFactoryId: string): boolean => { + switch (actionFactoryId) { + case 'FACTORY1': + case 'FACTORY2': + case 'FACTORY3': + return true; + } + return false; + }; + (uiActionsStart as any).getActionFactory = (actionFactoryId: string): ActionFactory => { + switch (actionFactoryId) { + case 'FACTORY1': + return factory1; + case 'FACTORY2': + return factory2; + case 'FACTORY3': + return factory3; + } + throw new Error('Action factory not found.'); + }; + const dynamicActionManager = new DynamicActionManager({ + storage: new MemoryActionStorage(), + isCompatible: async () => true, + uiActions: uiActionsStart, + }); + const storage = new StorageWrapperMock(); + const toastService = notificationServiceMock.createStartContract().toasts; + const deps: DrilldownManagerStateDeps = { + actionFactories: [factory1, factory2, factory3], + dynamicActionManager, + getTrigger: (triggerId: string): Trigger => { + if (triggerId === trigger1.id) return trigger1; + if (triggerId === trigger2.id) return trigger2; + if (triggerId === trigger3.id) return trigger3; + throw new Error('Trigger not found'); + }, + onClose: () => {}, + storage, + toastService, + triggers: ['TRIGGER2', 'TRIGGER3'], + }; + const state = new DrilldownManagerState(deps); + + return { + state, + deps, + factory1, + factory2, + factory3, + trigger1, + trigger2, + trigger3, + uiActionsStart, + dynamicActionManager, + storage, + }; +}; + +test('can select action factory', () => { + const { state, factory1, factory2 } = createDrilldownManagerState(); + expect(state.actionFactory$.getValue()).toBe(undefined); + state.setActionFactory(factory1); + expect(state.actionFactory$.getValue()!.id).toBe(factory1.id); + state.setActionFactory(factory2); + expect(state.actionFactory$.getValue()!.id).toBe(factory2.id); +}); + +test('can edit drilldown draft once action factory is selected', () => { + const { state, factory1 } = createDrilldownManagerState(); + expect(state.getDrilldownState()).toBe(undefined); + state.setActionFactory(factory1); + expect(state.getDrilldownState()).toBeInstanceOf(DrilldownState); + const drilldownState = state.getDrilldownState()!; + expect(drilldownState.factory).toBe(factory1); + expect(drilldownState.name$.getValue()).toBe(''); + drilldownState.setName('My name'); + expect(drilldownState.name$.getValue()).toBe('My name'); +}); + +test('selects intersection of triggers for a drilldown', () => { + const { state, factory1, factory2 } = createDrilldownManagerState(); + state.setActionFactory(factory1); + expect(state.getDrilldownState()!.uiTriggers).toEqual(['TRIGGER2']); + state.setActionFactory(factory2); + expect(state.getDrilldownState()!.uiTriggers).toEqual(['TRIGGER2', 'TRIGGER3']); +}); + +test('when drilldown has only one possible trigger, that trigger is automatically selected', () => { + const { state, factory1 } = createDrilldownManagerState(); + state.setActionFactory(factory1); + const drilldownState = state.getDrilldownState()!; + expect(drilldownState.uiTriggers).toEqual(['TRIGGER2']); + expect(drilldownState.triggers$.getValue()).toEqual(['TRIGGER2']); +}); + +test('when drilldown has more than one possible trigger, the trigger should be selected', () => { + const { state, factory2 } = createDrilldownManagerState(); + state.setActionFactory(factory2); + const drilldownState = state.getDrilldownState()!; + expect(drilldownState.uiTriggers).toEqual(['TRIGGER2', 'TRIGGER3']); + expect(drilldownState.triggers$.getValue()).toEqual([]); + drilldownState.setTriggers(['TRIGGER3']); + expect(drilldownState.triggers$.getValue()).toEqual(['TRIGGER3']); +}); + +test('can change drilldown config', () => { + const { state, factory2 } = createDrilldownManagerState(); + state.setActionFactory(factory2); + const drilldownState = state.getDrilldownState()!; + expect(drilldownState.config$.getValue()).toEqual({}); + drilldownState.setConfig({ foo: 'bar' }); + expect(drilldownState.config$.getValue()).toEqual({ foo: 'bar' }); +}); + +test('can create a drilldown', async () => { + const { state, factory2 } = createDrilldownManagerState(); + state.setActionFactory(factory2); + const drilldownState = state.getDrilldownState()!; + drilldownState.setName('my drill'); + drilldownState.setTriggers(['TRIGGER3']); + drilldownState.setConfig({ foo: 'bar' }); + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(0); + await state.createDrilldown(); + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(1); + expect(state.deps.dynamicActionManager.state.get().events[0]).toEqual({ + eventId: expect.any(String), + triggers: ['TRIGGER3'], + action: { + factoryId: 'FACTORY2', + name: 'my drill', + config: { foo: 'bar' }, + }, + }); +}); + +test('can delete delete a drilldown', async () => { + const { state, factory2 } = createDrilldownManagerState(); + state.setActionFactory(factory2); + const drilldownState = state.getDrilldownState()!; + drilldownState.setName('my drill'); + drilldownState.setTriggers(['TRIGGER3']); + drilldownState.setConfig({ foo: 'bar' }); + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(0); + await state.createDrilldown(); + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(1); + const eventId = state.deps.dynamicActionManager.state.get().events[0].eventId; + await state.onDelete([eventId]); + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(0); +}); + +test('can delete multiple drilldowns', async () => { + const { state, factory1, factory2 } = createDrilldownManagerState(); + + state.setActionFactory(factory2); + const drilldownState1 = state.getDrilldownState()!; + drilldownState1.setName('my drill 1'); + drilldownState1.setTriggers(['TRIGGER3']); + drilldownState1.setConfig({ foo: 'bar-1' }); + await state.createDrilldown(); + + state.setActionFactory(factory2); + const drilldownState2 = state.getDrilldownState()!; + drilldownState2.setName('my drill 2'); + drilldownState2.setTriggers(['TRIGGER2']); + drilldownState2.setConfig({ foo: 'bar-2' }); + await state.createDrilldown(); + + state.setActionFactory(factory1); + const drilldownState3 = state.getDrilldownState()!; + drilldownState3.setName('my drill 0'); + drilldownState3.setTriggers(['TRIGGER2']); + drilldownState3.setConfig({ foo: 'bar-3' }); + await state.createDrilldown(); + + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(3); + const id1 = state.deps.dynamicActionManager.state.get().events[0].eventId; + const id2 = state.deps.dynamicActionManager.state.get().events[1].eventId; + const id3 = state.deps.dynamicActionManager.state.get().events[2].eventId; + await state.onDelete([id1, id3]); + expect(state.deps.dynamicActionManager.state.get().events.length).toBe(1); + expect(state.deps.dynamicActionManager.state.get().events[0]).toEqual({ + eventId: id2, + triggers: ['TRIGGER2'], + action: { + factoryId: 'FACTORY2', + name: 'my drill 2', + config: { foo: 'bar-2' }, + }, + }); +}); + +test('after switching between action factories state is restored', async () => { + const { state, factory1, factory2 } = createDrilldownManagerState(); + + state.setActionFactory(factory2); + const drilldownState1 = state.getDrilldownState()!; + drilldownState1.setName('my drill 1'); + drilldownState1.setTriggers(['TRIGGER3']); + drilldownState1.setConfig({ foo: 'bar-1' }); + + state.setActionFactory(factory1); + const drilldownState2 = state.getDrilldownState()!; + drilldownState2.setName('my drill 2'); + drilldownState2.setTriggers(['TRIGGER2']); + drilldownState2.setConfig({ foo: 'bar-2' }); + + state.setActionFactory(factory2); + const drilldownState3 = state.getDrilldownState()!; + expect(drilldownState3.name$.getValue()).toBe('my drill 1'); + expect(drilldownState3.triggers$.getValue()).toEqual(['TRIGGER3']); + expect(drilldownState3.config$.getValue()).toEqual({ foo: 'bar-1' }); +}); + +describe('welcome message', () => { + test('should show welcome message by default', async () => { + const { state } = createDrilldownManagerState(); + expect(state.hideWelcomeMessage$.getValue()).toBe(false); + }); + + test('can hide welcome message', async () => { + const { state, storage } = createDrilldownManagerState(); + state.hideWelcomeMessage(); + expect(state.hideWelcomeMessage$.getValue()).toBe(true); + expect(storage.get('drilldowns:hidWelcomeMessage')).toBe(true); + }); +}); + +test.todo('drilldown type is not shown if no supported triggers can be picked'); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.ts new file mode 100644 index 0000000000000..0e374010139f0 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_manager_state.ts @@ -0,0 +1,481 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import useObservable from 'react-use/lib/useObservable'; +import { BehaviorSubject } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { SerializableState } from 'src/plugins/kibana_utils/common'; +import { + PublicDrilldownManagerProps, + DrilldownManagerDependencies, + DrilldownTemplate, +} from '../types'; +import { + ActionFactory, + BaseActionFactoryContext, + SerializedAction, + SerializedEvent, +} from '../../../dynamic_actions'; +import { DrilldownState } from './drilldown_state'; +import { + toastDrilldownCreated, + toastDrilldownsCRUDError, + insufficientLicenseLevel, + invalidDrilldownType, + txtDefaultTitle, + toastDrilldownDeleted, + toastDrilldownsDeleted, + toastDrilldownEdited, +} from './i18n'; +import { DrilldownTableItem } from '../components/drilldown_table'; + +const helloMessageStorageKey = `drilldowns:hidWelcomeMessage`; + +export interface DrilldownManagerStateDeps + extends DrilldownManagerDependencies, + PublicDrilldownManagerProps {} + +/** + * An instance of this class holds all the state necessary for Drilldown + * Manager. It also holds all the necessary controllers to change the state. + * + * `` and other container components access this state using + * the `useDrilldownManager()` React hook: + * + * ```ts + * const state = useDrilldownManager(); + * ``` + */ +export class DrilldownManagerState { + /** + * Title displayed at the top of flyout. + */ + private readonly title$ = new BehaviorSubject(txtDefaultTitle); + + /** + * Footer displayed at the bottom of flyout. + */ + private readonly footer$ = new BehaviorSubject(null); + + /** + * Route inside Drilldown Manager flyout that is displayed to the user. Some + * available routes are: + * + * - `['create']` + * - `['new']` + * - `['new', 'DASHBOARD_TO_DASHBOARD_DRILLDOWN']` + * - `['manage']` + * - `['manage', 'yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy']` + */ + public readonly route$: BehaviorSubject; + + /** + * Whether a drilldowns welcome message should be displayed to the user at + * the very top of the drilldowns manager flyout. + */ + public readonly hideWelcomeMessage$: BehaviorSubject; + + /** + * Currently selected action factory (drilldown type). + */ + public readonly actionFactory$: BehaviorSubject; + + private readonly mapEventToDrilldownItem = (event: SerializedEvent): DrilldownTableItem => { + const actionFactory = this.deps.actionFactories.find( + (factory) => factory.id === event.action.factoryId + ); + const drilldownFactoryContext: BaseActionFactoryContext = { + ...this.deps.placeContext, + triggers: event.triggers as string[], + }; + const firstTrigger = event.triggers[0]; + return { + id: event.eventId, + drilldownName: event.action.name, + actionName: actionFactory?.getDisplayName(drilldownFactoryContext) ?? event.action.factoryId, + icon: actionFactory?.getIconType(drilldownFactoryContext), + error: !actionFactory + ? invalidDrilldownType(event.action.factoryId) // this shouldn't happen for the end user, but useful during development + : !actionFactory.isCompatibleLicense() + ? insufficientLicenseLevel + : undefined, + triggers: event.triggers.map((trigger) => this.deps.getTrigger(trigger as string)), + triggerIncompatible: !this.deps.triggers.find((t) => t === firstTrigger), + }; + }; + public readonly events$ = new BehaviorSubject( + this.deps.dynamicActionManager.state.get().events.map(this.mapEventToDrilldownItem) + ); + + /** + * State for each drilldown type used for new drilldown creation, so when user + * switched between drilldown types the configuration of the previous + * drilldown is preserved. + */ + public readonly drilldownStateByFactoryId = new Map(); + + /** + * Whether user can unlock more drilldown types if they subscribe to a higher + * license tier. + */ + public readonly canUnlockMoreDrilldowns: boolean; + + /** + * Used to show cloning success notification. + */ + public lastCloneRecord: null | { time: number; templateIds: string[] } = null; + + constructor(public readonly deps: DrilldownManagerStateDeps) { + const hideWelcomeMessage = deps.storage.get(helloMessageStorageKey); + this.hideWelcomeMessage$ = new BehaviorSubject(hideWelcomeMessage ?? false); + this.canUnlockMoreDrilldowns = deps.actionFactories.some( + (factory) => !factory.isCompatibleLicense + ); + + deps.dynamicActionManager.state.state$ + .pipe(map((state) => state.events.map(this.mapEventToDrilldownItem))) + .subscribe(this.events$); + + let { initialRoute = '' } = deps; + if (!initialRoute) initialRoute = 'manage'; + else if (initialRoute[0] === '/') initialRoute = initialRoute.substr(1); + this.route$ = new BehaviorSubject(initialRoute.split('/')); + + this.actionFactory$ = new BehaviorSubject( + this.getActiveActionFactory() + ); + this.route$.pipe(map(() => this.getActiveActionFactory())).subscribe(this.actionFactory$); + } + + /** + * Set flyout main heading text. + * @param title New title. + */ + public setTitle(title: React.ReactNode) { + this.title$.next(title); + } + + /** + * Set the new flyout footer that renders at the very bottom of the Drilldown + * Manager flyout. + * @param footer New title. + */ + public setFooter(footer: React.ReactNode) { + this.footer$.next(footer); + } + + /** + * Set the flyout main heading back to its default state. + */ + public resetTitle() { + this.setTitle(txtDefaultTitle); + } + + /** + * Change the screen of Drilldown Manager. + */ + public setRoute(route: string[]): void { + if (route[0] === 'manage') this.deps.closeAfterCreate = false; + this.route$.next(route); + } + + /** + * Callback called to hide drilldowns welcome message, and remember in local + * storage that user opted to hide this message. + */ + public readonly hideWelcomeMessage = (): void => { + this.hideWelcomeMessage$.next(true); + this.deps.storage.set(helloMessageStorageKey, true); + }; + + /** + * Select a different action factory. + */ + public setActionFactory(actionFactory: undefined | ActionFactory): void { + if (!actionFactory) { + const route = this.route$.getValue(); + if (route[0] === 'new' && route.length > 1) this.setRoute(['new']); + return; + } + + if (!this.drilldownStateByFactoryId.has(actionFactory.id)) { + const oldActionFactory = this.getActiveActionFactory(); + const oldDrilldownState = !!oldActionFactory + ? this.drilldownStateByFactoryId.get(oldActionFactory.id) + : undefined; + const context = this.getActionFactoryContext(); + const drilldownState = new DrilldownState({ + factory: actionFactory, + placeTriggers: this.deps.triggers, + placeContext: this.deps.placeContext || {}, + name: this.pickName( + !!oldDrilldownState + ? oldDrilldownState.name$.getValue() + : actionFactory.getDisplayName(this.getActionFactoryContext()) + ), + triggers: [], + config: actionFactory.createConfig(context), + }); + this.drilldownStateByFactoryId.set(actionFactory.id, drilldownState); + } + + this.route$.next(['new', actionFactory.id]); + } + + public getActiveActionFactory(): undefined | ActionFactory { + const [step1, id] = this.route$.getValue(); + if (step1 !== 'new' || !id) return undefined; + return this.deps.actionFactories.find((factory) => factory.id === id); + } + + /** + * Close the drilldown flyout. + */ + public readonly close = (): void => { + this.deps.onClose(); + }; + + /** + * Get action factory context, which also contains a custom place context + * provided by the user who triggered rendering of the . + */ + public getActionFactoryContext(): BaseActionFactoryContext { + const placeContext = this.deps.placeContext ?? []; + const context: BaseActionFactoryContext = { + ...placeContext, + triggers: [], + }; + + return context; + } + + /** + * Get state object of the drilldown which is currently being created. + */ + public getDrilldownState(): undefined | DrilldownState { + const actionFactory = this.getActiveActionFactory(); + if (!actionFactory) return undefined; + const drilldownState = this.drilldownStateByFactoryId.get(actionFactory.id); + return drilldownState; + } + + /** + * Called when user presses "Create drilldown" button to save the + * currently edited drilldown. + */ + public async createDrilldown(): Promise { + const { dynamicActionManager, toastService } = this.deps; + const drilldownState = this.getDrilldownState(); + + if (!drilldownState) return; + + try { + const event = drilldownState.serialize(); + const triggers = drilldownState.triggers$.getValue(); + + await dynamicActionManager.createEvent(event, triggers); + toastService.addSuccess({ + title: toastDrilldownCreated.title(drilldownState.name$.getValue()), + text: toastDrilldownCreated.text, + }); + this.drilldownStateByFactoryId.delete(drilldownState.factory.id); + if (this.deps.closeAfterCreate) { + this.deps.onClose(); + } else { + this.setRoute(['manage']); + } + } catch (error) { + toastService.addError(error, { + title: toastDrilldownsCRUDError, + }); + throw error; + } + } + + /** + * Deletes a list of drilldowns and shows toast notifications to the user. + * + * @param ids Drilldown IDs. + */ + public readonly onDelete = (ids: string[]) => { + (async () => { + const { dynamicActionManager, toastService } = this.deps; + try { + await dynamicActionManager.deleteEvents(ids); + this.deps.toastService.addSuccess( + ids.length === 1 + ? { + title: toastDrilldownDeleted.title, + text: toastDrilldownDeleted.text, + } + : { + title: toastDrilldownsDeleted.title(ids.length), + text: toastDrilldownsDeleted.text, + } + ); + } catch (error) { + toastService.addError(error, { + title: toastDrilldownsCRUDError, + }); + } + })().catch(console.error); // eslint-disable-line + }; + + /** + * Clone a list of selected templates. + */ + public readonly onClone = async (templateIds: string[]) => { + const { templates } = this.deps; + if (!templates) return; + const templatesToClone: DrilldownTemplate[] = templateIds + .map((templateId) => templates.find(({ id }) => id === templateId)) + .filter(Boolean) as DrilldownTemplate[]; + + for (const template of templatesToClone) { + await this.cloneTemplate(template); + } + + this.lastCloneRecord = { + time: Date.now(), + templateIds, + }; + this.setRoute(['manage']); + }; + + private async cloneTemplate(template: DrilldownTemplate) { + const { dynamicActionManager } = this.deps; + const name = this.pickName(template.name); + const action: SerializedAction = { + factoryId: template.factoryId, + name, + config: (template.config || {}) as SerializableState, + }; + await dynamicActionManager.createEvent(action, template.triggers); + } + + /** + * Checks if drilldown with such a name already exists. + */ + private hasDrilldownWithName(name: string): boolean { + const { events } = this.deps.dynamicActionManager.state.get(); + for (const event of events) if (event.action.name === name) return true; + return false; + } + + /** + * Picks a unique name for the cloned drilldown. Adds "(copy)", "(copy 1)", + * "(copy 2)", etc. if drilldown with such name already exists. + */ + private pickName(name: string): string { + if (this.hasDrilldownWithName(name)) { + const matches = name.match(/(.*) (\(copy[^\)]*\))/); + if (matches) name = matches[1]; + for (let i = 0; i < 100; i++) { + const proposedName = !i ? `${name} (copy)` : `${name} (copy ${i})`; + const exists = this.hasDrilldownWithName(proposedName); + if (!exists) return proposedName; + } + } + return name; + } + + public readonly onCreateFromTemplate = async (templateId: string) => { + const { templates } = this.deps; + if (!templates) return; + const template = templates.find(({ id }) => id === templateId); + if (!template) return; + const actionFactory = this.deps.actionFactories.find(({ id }) => id === template.factoryId); + if (!actionFactory) return; + this.setActionFactory(actionFactory); + const drilldownState = this.getDrilldownState(); + if (drilldownState) { + drilldownState.setName(this.pickName(template.name)); + drilldownState.setTriggers(template.triggers); + drilldownState.setConfig(template.config as SerializableState); + } + }; + + public readonly onCreateFromDrilldown = async (eventId: string) => { + const { dynamicActionManager } = this.deps; + const { events } = dynamicActionManager.state.get(); + const event = events.find((ev) => ev.eventId === eventId); + if (!event) return; + const actionFactory = this.deps.actionFactories.find(({ id }) => id === event.action.factoryId); + if (!actionFactory) return; + this.setActionFactory(actionFactory); + const drilldownState = this.getDrilldownState(); + if (drilldownState) { + drilldownState.setName(this.pickName(event.action.name)); + drilldownState.setTriggers(event.triggers); + drilldownState.setConfig(event.action.config); + } + }; + + /** + * Returns the state object of an existing drilldown for editing purposes. + * + * @param eventId ID of the saved dynamic action event. + */ + public createEventDrilldownState(eventId: string): null | DrilldownState { + const { dynamicActionManager, actionFactories, triggers: placeTriggers } = this.deps; + const { events } = dynamicActionManager.state.get(); + const event = events.find((ev) => ev.eventId === eventId); + if (!event) return null; + const factory = actionFactories.find(({ id }) => id === event.action.factoryId); + if (!factory) return null; + const { action, triggers } = event; + const { name, config } = action; + const state = new DrilldownState({ + factory, + placeContext: this.getActionFactoryContext(), + placeTriggers, + name, + config, + triggers, + }); + return state; + } + + /** + * Save edits to an existing drilldown. + * + * @param eventId ID of the saved dynamic action event. + * @param drilldownState Latest state of the drilldown as edited by the user. + */ + public async updateEvent(eventId: string, drilldownState: DrilldownState): Promise { + const { dynamicActionManager, toastService } = this.deps; + const action = drilldownState.serialize(); + + try { + await dynamicActionManager.updateEvent(eventId, action, drilldownState.triggers$.getValue()); + toastService.addSuccess({ + title: toastDrilldownEdited.title(action.name), + text: toastDrilldownEdited.text, + }); + this.setRoute(['manage']); + } catch (error) { + toastService.addError(error, { + title: toastDrilldownsCRUDError, + }); + throw error; + } + } + + // Below are convenience React hooks for consuming observables in connected + // React components. + + /* eslint-disable react-hooks/rules-of-hooks */ + public readonly useTitle = () => useObservable(this.title$, this.title$.getValue()); + public readonly useFooter = () => useObservable(this.footer$, this.footer$.getValue()); + public readonly useRoute = () => useObservable(this.route$, this.route$.getValue()); + public readonly useWelcomeMessage = () => + useObservable(this.hideWelcomeMessage$, this.hideWelcomeMessage$.getValue()); + public readonly useActionFactory = () => + useObservable(this.actionFactory$, this.actionFactory$.getValue()); + public readonly useEvents = () => useObservable(this.events$, this.events$.getValue()); + /* eslint-enable react-hooks/rules-of-hooks */ +} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_state.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_state.ts new file mode 100644 index 0000000000000..f80ad30d34bb8 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/drilldown_state.ts @@ -0,0 +1,242 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import useObservable from 'react-use/lib/useObservable'; +import { Observable, BehaviorSubject, combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { + ActionFactory, + BaseActionConfig, + BaseActionFactoryContext, + SerializedAction, +} from '../../../dynamic_actions'; +import { useSyncObservable } from '../hooks/use_sync_observable'; +import { ActionFactoryPlaceContext } from '../types'; + +export interface DrilldownStateDeps { + /** + * Action factory, i.e. drilldown, which we are creating. + */ + factory: ActionFactory; + + /** + * List of all triggers the current place supports. + */ + placeTriggers: string[]; + + /** + * Special opaque context object provided by the place from where the + * Drilldown Manager was opened. + */ + placeContext: ActionFactoryPlaceContext; + + /** + * Initial name of the drilldown instance. + */ + name?: string; + + /** + * Initially selected triggers of the drilldown instance. + */ + triggers?: string[]; + + /** + * Initial config of the drilldown instance. + */ + config?: BaseActionConfig; +} + +/** + * An instance of this class represents UI states of a single drilldown which + * is currently being created or edited. + */ +export class DrilldownState { + /** + * Drilldown type used to configure this drilldown. + */ + public readonly factory: ActionFactory; + + /** + * Opaque action factory context object excluding the `triggers` attribute. + */ + public readonly placeContext: ActionFactoryPlaceContext; + + /** + * User entered name of this drilldown. + */ + public readonly name$: BehaviorSubject; + + /** + * Whether the `name$` is valid or is in an error state. + */ + public readonly nameError$: Observable; + + /** + * List of all triggers the place which opened the Drilldown Manager supports. + */ + public readonly placeTriggers: string[]; + + /** + * List of all triggers from which the user can pick in UI for this specific + * drilldown. This is the selection list we show to the user. It is an + * intersection of all triggers supported by current place with the triggers + * that the action factory supports. + */ + public readonly uiTriggers: string[]; + + /** + * User selected triggers. (Currently in UI we support user picking just one trigger). + */ + public readonly triggers$: BehaviorSubject; + + /** + * Error identifier, in case `triggers$` is in an error state. + */ + public readonly triggersError$: Observable; + + /** + * Current action factory (drilldown) configuration, i.e. drilldown + * configuration object, which will be serialized and persisted in storage. + */ + public readonly config$: BehaviorSubject; + + /** + * Error identifier, in case `config$` is in an error state. + */ + public readonly configError$: Observable; + + /** + * Whether the drilldown state is in an error and should not be saved. I value + * is `undefined`, there is no error. + */ + public readonly error$: Observable; + + constructor({ + factory, + placeTriggers, + placeContext, + name = '', + triggers = [], + config = {}, + }: DrilldownStateDeps) { + this.factory = factory; + this.placeTriggers = placeTriggers; + this.placeContext = placeContext; + this.name$ = new BehaviorSubject(name); + this.triggers$ = new BehaviorSubject(triggers); + this.config$ = new BehaviorSubject(config); + + const triggersFactorySupports = this.factory.supportedTriggers(); + this.uiTriggers = triggersFactorySupports.filter((trigger) => + this.placeTriggers.includes(trigger) + ); + + // Pre-select a trigger if there is only one trigger for user to choose from. + // In case there is only one possible trigger, UI will not display a trigger picker. + if (this.uiTriggers.length === 1) this.triggers$.next([this.uiTriggers[0]]); + + this.nameError$ = this.name$.pipe( + map((currentName) => { + if (!currentName) return 'NAME_EMPTY'; + return undefined; + }) + ); + + this.triggersError$ = this.triggers$.pipe( + map((currentTriggers) => { + if (!currentTriggers.length) return 'NO_TRIGGERS_SELECTED'; + return undefined; + }) + ); + + this.configError$ = this.config$.pipe( + map((conf) => { + if (!this.factory.isConfigValid(conf, this.getFactoryContext())) return 'INVALID_CONFIG'; + return undefined; + }) + ); + + this.error$ = combineLatest([this.nameError$, this.triggersError$, this.configError$]).pipe( + map( + ([nameError, configError, triggersError]) => + nameError || triggersError || configError || undefined + ) + ); + } + + /** + * Change the name of the drilldown. + */ + public readonly setName = (name: string): void => { + this.name$.next(name); + }; + + /** + * Change the list of user selected triggers. + */ + public readonly setTriggers = (triggers: string[]): void => { + this.triggers$.next(triggers); + }; + + /** + * Update the current drilldown configuration. + */ + public readonly setConfig = (config: BaseActionConfig): void => { + this.config$.next(config); + }; + + public getFactoryContext(): BaseActionFactoryContext { + return { + ...this.placeContext, + triggers: this.triggers$.getValue(), + }; + } + + /** + * Serialize the current drilldown draft into a serializable action which + * is persisted to disk. + */ + public serialize(): SerializedAction { + return { + factoryId: this.factory.id, + name: this.name$.getValue(), + config: this.config$.getValue(), + }; + } + + /** + * Returns a list of all triggers from which user can pick in UI, for this + * specific drilldown. + */ + public getAllDrilldownTriggers(): string[] { + const triggersFactorySupports = this.factory.supportedTriggers(); + const uiTriggers = triggersFactorySupports.filter((trigger) => + this.placeTriggers.includes(trigger) + ); + return uiTriggers; + } + + public isValid(): boolean { + if (!this.name$.getValue()) return false; + const config = this.config$.getValue(); + if (!config) return false; + const triggers = this.triggers$.getValue(); + if (triggers.length < 1) return false; + if (!this.factory.isConfigValid(config, this.getFactoryContext())) return false; + return true; + } + + // Below are convenience React hooks for consuming observables in connected + // React components. + + /* eslint-disable react-hooks/rules-of-hooks */ + public readonly useName = () => useObservable(this.name$, this.name$.getValue()); + public readonly useTriggers = () => useObservable(this.triggers$, this.triggers$.getValue()); + public readonly useConfig = () => useObservable(this.config$, this.config$.getValue()); + public readonly useError = () => useSyncObservable(this.error$); + /* eslint-enable react-hooks/rules-of-hooks */ +} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/i18n.ts similarity index 76% rename from x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts rename to x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/i18n.ts index b95f69e875ebc..c9b49b5ff9346 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/i18n.ts @@ -87,3 +87,31 @@ export const toastDrilldownsCRUDError = i18n.translate( description: 'Title for generic error toast when persisting drilldown updates failed', } ); + +export const insufficientLicenseLevel = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.insufficientLicenseLevelError', + { + defaultMessage: 'Insufficient license level', + description: + 'User created drilldown with higher license type, but then downgraded the license. This error is shown in the list near created drilldown', + } +); + +export const invalidDrilldownType = (type: string) => + i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.invalidDrilldownType', + { + defaultMessage: "Drilldown type {type} doesn't exist", + values: { + type, + }, + } + ); + +export const txtDefaultTitle = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.drilldownManager.state.defaultTitle', + { + defaultMessage: 'Drilldowns', + description: 'Drilldowns flyout title.', + } +); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/index.ts new file mode 100644 index 0000000000000..42dcc4510622a --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/state/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './drilldown_state'; +export * from './drilldown_manager_state'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/types.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/types.ts new file mode 100644 index 0000000000000..1ff6053126e1c --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/drilldown_manager/types.ts @@ -0,0 +1,162 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ToastsStart } from 'kibana/public'; +import { IStorageWrapper } from '../../../../../../src/plugins/kibana_utils/public'; +import { Trigger } from '../../../../../../src/plugins/ui_actions/public'; +import { + ActionFactory, + BaseActionFactoryContext, + DynamicActionManager, +} from '../../dynamic_actions'; + +/** + * Interface used as piece of ActionFactoryContext that is passed in from + * drilldown wizard component to action factories. Omitted values are added + * inside the wizard and then full {@link BaseActionFactoryContext} passed into + * action factory methods + */ +export type ActionFactoryPlaceContext< + ActionFactoryContext extends BaseActionFactoryContext = BaseActionFactoryContext +> = Omit; + +/** + * This are props of the public React component which is + * exposed from this plugin's contract, user can change these props every time + * the public is re-rendered. + */ +export interface PublicDrilldownManagerProps { + /** + * Implementation of reactive storage interface for drilldowns. Dynamic action + * manager is responsible for permanently persisting drilldowns, i.e. + * drilldown name, type, and config. It exposes observables for reactive UI + * updates. + */ + dynamicActionManager: DynamicActionManager; + + /** + * Initial screen which Drilldown Manager should display when it first opens. + * Afterwards the state of the currently visible screen is controlled by the + * Drilldown Manager. + * + * Possible values of the route: + * + * - `/create` --- opens with "Create new" tab selected. + * - `/new` --- opens with the "Create new" tab selected showing new drilldown form. + * - `/manage` --- opens with selected "Manage" tab. + * - `/manage/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` --- opens in edit mode where + * drilldown with ID `yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy` is being edited. + */ + initialRoute?: string; + + /** + * Callback called when drilldown flyout should be closed. + */ + onClose: () => void; + + /** + * List of possible triggers in current context + */ + triggers: string[]; + + /** + * Extra action factory context passed into action factories CollectConfig, getIconType, getDisplayName and etc... + */ + placeContext?: ActionFactoryPlaceContext; + + /** + * List of drilldown templates, which will be displayed to user for fast + * drilldown creation flow. + */ + templates?: DrilldownTemplate[]; + + /** + * Whether to close the drilldown flyout after a drilldown was created + */ + closeAfterCreate?: boolean; +} + +/** + * Template for a pre-configured new drilldown, this gives ability to create a + * drilldown from a template instead of user creating a drilldown from scratch. + * This is used in "drilldown cloning" functionality, where drilldowns can be + * cloned from one dashboard panel to another. + */ +export interface DrilldownTemplate { + /** + * Any string that uniquely identifies this item in a list of `DrilldownTemplate[]`. + */ + id: string; + + /** + * EUI icon display next to the description. + */ + icon?: string; + + /** + * A user facing text that provides information about the source of this template. + */ + description: string; + + /** + * Drilldown type, dynamic action factory ID. + */ + factoryId: string; + + /** + * Suggested new name of the cloned drilldown. If a drilldown with such suggested + * name already exists at current place, a suffix like " (copy 1)" will be added. + */ + name: string; + + /** + * Pre-selected triggers. + */ + triggers: string[]; + + /** + * Preliminary configuration of the new drilldown, to be used in the dynamicaction factory. + */ + config: unknown; +} + +/** + * These are static global dependencies of the wired in + * during the setup life-cycle of the plugin. + */ +export interface DrilldownManagerDependencies { + /** + * List of registered UI Actions action factories, i.e. drilldowns. + */ + actionFactories: ActionFactory[]; + + /** + * Trigger getter from UI Actions trigger registry. + */ + getTrigger: (triggerId: string) => Trigger; + + /** + * Implementation of local storage interface for persisting user preferences, + * e.g. user can dismiss the welcome message. + */ + storage: IStorageWrapper; + + /** + * Services for displaying user toast notifications. + */ + toastService: ToastsStart; + + /** + * Link to drilldowns user facing docs on corporate website. + */ + docsLink?: string; + + /** + * Link to trigger picker user facing docs on corporate website. + */ + triggerPickerDocsLink?: string; +} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts deleted file mode 100644 index edb598ba179a3..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useEffect, useState } from 'react'; -import { ActionFactory, BaseActionFactoryContext } from '../../dynamic_actions'; - -export function useCompatibleActionFactoriesForCurrentContext< - Context extends BaseActionFactoryContext = BaseActionFactoryContext ->(actionFactories: ActionFactory[], context: Context) { - const [compatibleActionFactories, setCompatibleActionFactories] = useState(); - useEffect(() => { - let canceled = false; - async function updateCompatibleFactoriesForContext() { - const compatibility = await Promise.all( - actionFactories.map((factory) => factory.isCompatible(context)) - ); - if (canceled) return; - - const compatibleFactories = actionFactories.filter((_, i) => compatibility[i]); - const triggerSupportedFactories = compatibleFactories.filter((factory) => - factory.supportedTriggers().some((trigger) => context.triggers.includes(trigger)) - ); - setCompatibleActionFactories(triggerSupportedFactories); - } - updateCompatibleFactoriesForContext(); - return () => { - canceled = true; - }; - }, [context, actionFactories, context.triggers]); - - return compatibleActionFactories; -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx deleted file mode 100644 index 6a9dc5fcc34fa..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState } from 'react'; -import { ToastsStart } from 'kibana/public'; -import useMountedState from 'react-use/lib/useMountedState'; -import { useContainerState } from '../../../../../../src/plugins/kibana_utils/public'; -import { - toastDrilldownCreated, - toastDrilldownDeleted, - toastDrilldownEdited, - toastDrilldownsCRUDError, - toastDrilldownsDeleted, -} from './i18n'; -import { DynamicActionManager, SerializedAction } from '../../dynamic_actions'; - -export function useDrilldownsStateManager( - actionManager: DynamicActionManager, - toastService: ToastsStart -) { - const { events: drilldowns } = useContainerState(actionManager.state); - const [isLoading, setIsLoading] = useState(false); - const isMounted = useMountedState(); - - async function run(op: () => Promise) { - setIsLoading(true); - try { - await op(); - } catch (e) { - toastService.addError(e, { - title: toastDrilldownsCRUDError, - }); - if (!isMounted) return; - setIsLoading(false); - return; - } - } - - async function createDrilldown(action: SerializedAction, selectedTriggers: string[]) { - await run(async () => { - await actionManager.createEvent(action, selectedTriggers); - toastService.addSuccess({ - title: toastDrilldownCreated.title(action.name), - text: toastDrilldownCreated.text, - }); - }); - } - - async function editDrilldown( - drilldownId: string, - action: SerializedAction, - selectedTriggers: string[] - ) { - await run(async () => { - await actionManager.updateEvent(drilldownId, action, selectedTriggers); - toastService.addSuccess({ - title: toastDrilldownEdited.title(action.name), - text: toastDrilldownEdited.text, - }); - }); - } - - async function deleteDrilldown(drilldownIds: string | string[]) { - await run(async () => { - drilldownIds = Array.isArray(drilldownIds) ? drilldownIds : [drilldownIds]; - await actionManager.deleteEvents(drilldownIds); - toastService.addSuccess( - drilldownIds.length === 1 - ? { - title: toastDrilldownDeleted.title, - text: toastDrilldownDeleted.text, - } - : { - title: toastDrilldownsDeleted.title(drilldownIds.length), - text: toastDrilldownsDeleted.text, - } - ); - }); - } - - return { drilldowns, isLoading, createDrilldown, editDrilldown, deleteDrilldown }; -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts deleted file mode 100644 index 324c3b94aa8c2..0000000000000 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useState } from 'react'; -import { IStorageWrapper } from '../../../../../../src/plugins/kibana_utils/public'; - -export function useWelcomeMessage(storage: IStorageWrapper): [boolean, () => void] { - const key = `drilldowns:hidWelcomeMessage`; - const [hideWelcomeMessage, setHideWelcomeMessage] = useState(storage.get(key) ?? false); - - return [ - !hideWelcomeMessage, - () => { - if (hideWelcomeMessage) return; - setHideWelcomeMessage(true); - storage.set(key, true); - }, - ]; -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/index.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/index.ts index b876202068a01..ebaa845409e2a 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/index.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/index.ts @@ -6,4 +6,4 @@ */ export * from './drilldown_definition'; -export * from './components'; +export * from './drilldown_manager'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/action_factory.ts b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/action_factory.ts index 0c67fa807ef03..bd5dc5794cb59 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/action_factory.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/action_factory.ts @@ -6,23 +6,23 @@ */ import { uiToReactComponent } from '../../../../../src/plugins/kibana_react/public'; -import { UiActionsPresentable as Presentable } from '../../../../../src/plugins/ui_actions/public'; -import { ActionFactoryDefinition } from './action_factory_definition'; -import { Configurable } from '../../../../../src/plugins/kibana_utils/public'; -import { +import type { UiActionsPresentable as Presentable } from '../../../../../src/plugins/ui_actions/public'; +import type { ActionFactoryDefinition } from './action_factory_definition'; +import type { Configurable } from '../../../../../src/plugins/kibana_utils/public'; +import type { BaseActionConfig, BaseActionFactoryContext, SerializedAction, SerializedEvent, } from './types'; -import { ILicense, LicensingPluginStart } from '../../../licensing/public'; -import { UiActionsActionDefinition as ActionDefinition } from '../../../../../src/plugins/ui_actions/public'; -import { SavedObjectReference } from '../../../../../src/core/types'; -import { PersistableState } from '../../../../../src/plugins/kibana_utils/common'; +import type { ILicense, LicensingPluginStart } from '../../../licensing/public'; +import type { UiActionsActionDefinition as ActionDefinition } from '../../../../../src/plugins/ui_actions/public'; +import type { SavedObjectReference } from '../../../../../src/core/types'; +import type { PersistableState } from '../../../../../src/plugins/kibana_utils/common'; export interface ActionFactoryDeps { - readonly getLicense: () => ILicense; - readonly getFeatureUsageStart: () => LicensingPluginStart['featureUsage']; + readonly getLicense?: () => ILicense; + readonly getFeatureUsageStart?: () => LicensingPluginStart['featureUsage']; } export class ActionFactory< @@ -82,7 +82,7 @@ export class ActionFactory< * compatible with current license? */ public isCompatibleLicense() { - if (!this.minimalLicense) return true; + if (!this.minimalLicense || !this.deps.getLicense) return true; const license = this.deps.getLicense(); return license.isAvailable && license.isActive && license.hasAtLeast(this.minimalLicense); } @@ -110,7 +110,7 @@ export class ActionFactory< } private notifyFeatureUsage(): void { - if (!this.minimalLicense || !this.licenseFeatureName) return; + if (!this.minimalLicense || !this.licenseFeatureName || !this.deps.getFeatureUsageStart) return; this.deps .getFeatureUsageStart() .notifyUsage(this.licenseFeatureName) diff --git a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts index 6821999ee2c75..fbc3d7229df6f 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_manager.ts @@ -213,6 +213,11 @@ export class DynamicActionManager { * @param triggers List of triggers to which action should react. */ public async createEvent(action: SerializedAction, triggers: string[]) { + if (!triggers.length) { + // This error should never happen, hence it is not translated. + throw new Error('No triggers selected for event.'); + } + const event: SerializedEvent = { eventId: uuidv4(), triggers, diff --git a/x-pack/plugins/ui_actions_enhanced/public/index.ts b/x-pack/plugins/ui_actions_enhanced/public/index.ts index e768f829eff69..b8e4fcbd916e6 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/index.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/index.ts @@ -35,5 +35,8 @@ export { export { DynamicActionsState } from './services/ui_actions_service_enhancements'; -export { DrilldownDefinition as UiActionsEnhancedDrilldownDefinition } from './drilldowns'; +export { + DrilldownDefinition as UiActionsEnhancedDrilldownDefinition, + DrilldownTemplate as UiActionsEnhancedDrilldownTemplate, +} from './drilldowns'; export * from './drilldowns/url_drilldown'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/mocks.ts b/x-pack/plugins/ui_actions_enhanced/public/mocks.ts index 514569a7ae336..33591c9383703 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/mocks.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/mocks.ts @@ -31,7 +31,7 @@ const createStartContract = (): Start => { getActionFactories: jest.fn(), getActionFactory: jest.fn(), hasActionFactory: jest.fn(), - FlyoutManageDrilldowns: jest.fn(), + DrilldownManager: jest.fn(), telemetry: jest.fn(), extract: jest.fn(), inject: jest.fn(), diff --git a/x-pack/plugins/ui_actions_enhanced/public/plugin.ts b/x-pack/plugins/ui_actions_enhanced/public/plugin.ts index bfb9e47beb014..b83f3288b05af 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/plugin.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/plugin.ts @@ -26,7 +26,7 @@ import { CustomTimeRangeBadge } from './custom_time_range_badge'; import { CommonlyUsedRange } from './types'; import { UiActionsServiceEnhancements } from './services'; import { ILicense, LicensingPluginSetup, LicensingPluginStart } from '../../licensing/public'; -import { createFlyoutManageDrilldowns } from './drilldowns'; +import { createPublicDrilldownManager, PublicDrilldownManagerComponent } from './drilldowns'; import { createStartServicesGetter, Storage } from '../../../../src/plugins/kibana_utils/public'; import { dynamicActionEnhancement } from './dynamic_actions/dynamic_action_enhancement'; @@ -57,7 +57,7 @@ export interface StartContract | 'extract' | 'inject' > { - FlyoutManageDrilldowns: ReturnType; + DrilldownManager: PublicDrilldownManagerComponent; } export class AdvancedUiActionsPublicPlugin @@ -118,7 +118,7 @@ export class AdvancedUiActionsPublicPlugin return { ...uiActions, ...this.enhancements!, - FlyoutManageDrilldowns: createFlyoutManageDrilldowns({ + DrilldownManager: createPublicDrilldownManager({ actionFactories: this.enhancements!.getActionFactories(), getTrigger: (triggerId) => uiActions.getTrigger(triggerId), storage: new Storage(window?.localStorage), diff --git a/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_dashboard_drilldown.ts b/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_dashboard_drilldown.ts index 68b057e9487ce..b891d3cce3ba0 100644 --- a/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_dashboard_drilldown.ts +++ b/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_dashboard_drilldown.ts @@ -12,6 +12,7 @@ const DRILLDOWN_TO_PIE_CHART_NAME = 'Go to pie chart dashboard'; const DRILLDOWN_TO_AREA_CHART_NAME = 'Go to area chart dashboard'; export default function ({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); const dashboardPanelActions = getService('dashboardPanelActions'); const dashboardDrilldownPanelActions = getService('dashboardDrilldownPanelActions'); const dashboardDrilldownsManage = getService('dashboardDrilldownsManage'); @@ -27,7 +28,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); const browser = getService('browser'); const retry = getService('retry'); - const testSubjects = getService('testSubjects'); const filterBar = getService('filterBar'); const security = getService('security'); const spaces = getService('spaces'); @@ -49,18 +49,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.gotoDashboardEditMode( dashboardDrilldownsManage.DASHBOARD_WITH_PIE_CHART_NAME ); - // create drilldown await dashboardPanelActions.openContextMenu(); await dashboardDrilldownPanelActions.expectExistsCreateDrilldownAction(); await dashboardDrilldownPanelActions.clickCreateDrilldown(); await dashboardDrilldownsManage.expectsCreateDrilldownFlyoutOpen(); + await testSubjects.click('actionFactoryItem-DASHBOARD_TO_DASHBOARD_DRILLDOWN'); await dashboardDrilldownsManage.fillInDashboardToDashboardDrilldownWizard({ drilldownName: DRILLDOWN_TO_AREA_CHART_NAME, destinationDashboardTitle: dashboardDrilldownsManage.DASHBOARD_WITH_AREA_CHART_NAME, }); await dashboardDrilldownsManage.saveChanges(); - await dashboardDrilldownsManage.expectsCreateDrilldownFlyoutClose(); + await dashboardDrilldownsManage.closeFlyout(); // check that drilldown notification badge is shown expect(await PageObjects.dashboard.getPanelDrilldownCount()).to.be(1); diff --git a/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_url_drilldown.ts b/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_url_drilldown.ts index e0b6c6a5f4803..5ed118c9b753a 100644 --- a/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_url_drilldown.ts +++ b/x-pack/test/functional/apps/dashboard/drilldowns/dashboard_to_url_drilldown.ts @@ -39,6 +39,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const urlTemplate = `{{kibanaUrl}}/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'{{date event.from}}',to:'{{date event.to}}'))&_a=(columns:!(_source),filters:{{rison context.panel.filters}},index:'{{context.panel.indexPatternId}}',interval:auto,query:(language:{{context.panel.query.language}},query:'{{context.panel.query.query}}'),sort:!())`; + await testSubjects.click('actionFactoryItem-URL_DRILLDOWN'); await dashboardDrilldownsManage.fillInDashboardToURLDrilldownWizard({ drilldownName: DRILLDOWN_TO_DISCOVER_URL, destinationURLTemplate: urlTemplate, @@ -49,7 +50,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('urlDrilldownOpenInNewTab'); await dashboardDrilldownsManage.saveChanges(); - await dashboardDrilldownsManage.expectsCreateDrilldownFlyoutClose(); + await dashboardDrilldownsManage.closeFlyout(); // check that drilldown notification badge is shown expect(await PageObjects.dashboard.getPanelDrilldownCount()).to.be(2); diff --git a/x-pack/test/functional/services/dashboard/drilldowns_manage.ts b/x-pack/test/functional/services/dashboard/drilldowns_manage.ts index 6f4deb2d32986..34212262aedba 100644 --- a/x-pack/test/functional/services/dashboard/drilldowns_manage.ts +++ b/x-pack/test/functional/services/dashboard/drilldowns_manage.ts @@ -10,12 +10,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; const CREATE_DRILLDOWN_FLYOUT_DATA_TEST_SUBJ = 'createDrilldownFlyout'; const MANAGE_DRILLDOWNS_FLYOUT_DATA_TEST_SUBJ = 'editDrilldownFlyout'; -const DASHBOARD_TO_DASHBOARD_ACTION_LIST_ITEM = - 'actionFactoryItem-DASHBOARD_TO_DASHBOARD_DRILLDOWN'; -const DASHBOARD_TO_DASHBOARD_ACTION_WIZARD = - 'selectedActionFactory-DASHBOARD_TO_DASHBOARD_DRILLDOWN'; -const DASHBOARD_TO_URL_ACTION_LIST_ITEM = 'actionFactoryItem-URL_DRILLDOWN'; -const DASHBOARD_TO_URL_ACTION_WIZARD = 'selectedActionFactory-URL_DRILLDOWN'; const DESTINATION_DASHBOARD_SELECT = 'dashboardDrilldownSelectDashboard'; const DRILLDOWN_WIZARD_SUBMIT = 'drilldownWizardSubmit'; @@ -69,7 +63,6 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon destinationDashboardTitle: string; }) { await this.fillInDrilldownName(drilldownName); - await this.selectDashboardToDashboardActionIfNeeded(); await this.selectDestinationDashboard(destinationDashboardTitle); } @@ -83,7 +76,6 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon trigger: 'VALUE_CLICK_TRIGGER' | 'SELECT_RANGE_TRIGGER'; }) { await this.fillInDrilldownName(drilldownName); - await this.selectDashboardToURLActionIfNeeded(); await this.selectTriggerIfNeeded(trigger); await this.fillInURLTemplate(destinationURLTemplate); } @@ -92,20 +84,6 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon await testSubjects.setValue('drilldownNameInput', name); } - async selectDashboardToURLActionIfNeeded() { - if (await testSubjects.exists(DASHBOARD_TO_URL_ACTION_LIST_ITEM)) { - await testSubjects.click(DASHBOARD_TO_URL_ACTION_LIST_ITEM); - } - await testSubjects.existOrFail(DASHBOARD_TO_URL_ACTION_WIZARD); - } - - async selectDashboardToDashboardActionIfNeeded() { - if (await testSubjects.exists(DASHBOARD_TO_DASHBOARD_ACTION_LIST_ITEM)) { - await testSubjects.click(DASHBOARD_TO_DASHBOARD_ACTION_LIST_ITEM); - } - await testSubjects.existOrFail(DASHBOARD_TO_DASHBOARD_ACTION_WIZARD); - } - async selectDestinationDashboard(title: string) { await comboBox.set(DESTINATION_DASHBOARD_SELECT, title); } From 08b5f0db2ff86c9ad55ed28d78cc0657bcada4e5 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Mon, 19 Apr 2021 12:27:37 -0500 Subject: [PATCH 44/82] [Workplace Search] Fix doc link, remove shadows on panels and fix source id bug (#97482) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix private source docs link * Add a whole bunch of missed shadow/background changes to panels * Add success messages to Role mappings * Fix bug where sourceId still in memory If you were on an org source and then clicked to view your Personal dashboard, the subnav was visible because the source Id was still in the logic file. This resets it on unmount. As a part of this fix, dataLoading was set to true on reset. Because of this, some places that were resettings state, but not fetching new data, were left in a loading state. This commit also removes the redundant `resetSourceState` calls around the components that don’t fetch a fresh copy of the source data --- .../applications/workplace_search/routes.ts | 3 ++- .../components/add_source/add_source_list.tsx | 2 +- .../display_settings/display_settings.tsx | 2 +- .../content_sources/components/overview.tsx | 14 +++++++++++-- .../components/schema/schema.tsx | 2 +- .../components/source_content.test.tsx | 2 -- .../components/source_content.tsx | 15 ++++--------- .../components/source_settings.test.tsx | 2 -- .../components/source_settings.tsx | 3 +-- .../views/content_sources/private_sources.tsx | 4 ++-- .../views/content_sources/source_logic.ts | 3 ++- .../views/content_sources/source_router.tsx | 3 ++- .../views/role_mappings/constants.ts | 21 +++++++++++++++++++ .../role_mappings/role_mappings_logic.ts | 20 ++++++++++++++++-- 14 files changed, 67 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts index e08050335671e..59e43b103db40 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts @@ -19,9 +19,10 @@ export const LEAVE_FEEDBACK_EMAIL = 'support@elastic.co'; export const LEAVE_FEEDBACK_URL = `mailto:${LEAVE_FEEDBACK_EMAIL}?Subject=Elastic%20Workplace%20Search%20Feedback`; export const DOCS_PREFIX = docLinks.workplaceSearchBase; +export const PERMISSIONS_DOCS_URL = `${DOCS_PREFIX}/workplace-search-permissions.html`; export const DOCUMENT_PERMISSIONS_DOCS_URL = `${DOCS_PREFIX}/workplace-search-sources-document-permissions.html`; export const DOCUMENT_PERMISSIONS_SYNC_DOCS_URL = `${DOCUMENT_PERMISSIONS_DOCS_URL}#sources-permissions-synchronizing`; -export const PRIVATE_SOURCES_DOCS_URL = `${DOCUMENT_PERMISSIONS_DOCS_URL}#sources-permissions-org-private`; +export const PRIVATE_SOURCES_DOCS_URL = `${PERMISSIONS_DOCS_URL}#organizational-sources-private-sources`; export const EXTERNAL_IDENTITIES_DOCS_URL = `${DOCS_PREFIX}/workplace-search-external-identities-api.html`; export const SECURITY_DOCS_URL = `${DOCS_PREFIX}/workplace-search-security.html`; export const SMTP_DOCS_URL = `${DOCS_PREFIX}/workplace-search-smtp-mailer.html`; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx index 8819367cacd1f..80d35553bb8bb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx @@ -126,7 +126,7 @@ export const AddSourceList: React.FC = () => { - + = ({ tabId }) => { onTabClick={onSelectedTabChanged} /> ) : ( - + {DISPLAY_SETTINGS_EMPTY_TITLE}

} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx index a5a2d8ab73d94..86c911e7e0b00 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx @@ -116,7 +116,12 @@ export const Overview: React.FC = () => { const emptyState = ( <> - + {SOURCES_NO_CONTENT_TITLE}

} iconType="documents" @@ -163,7 +168,12 @@ export const Overview: React.FC = () => { const emptyState = ( <> - + {EMPTY_ACTIVITY_TITLE}} iconType="clock" diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema.tsx index f31f7049ebf36..72a3804c4443b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema.tsx @@ -140,7 +140,7 @@ export const Schema: React.FC = () => { ) : ( - + {SCHEMA_EMPTY_SCHEMA_TITLE}} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.test.tsx index 12399d4822a13..8aa644827709a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.test.tsx @@ -34,7 +34,6 @@ import { SourceContent } from './source_content'; describe('SourceContent', () => { const setActivePage = jest.fn(); const searchContentSourceDocuments = jest.fn(); - const resetSourceState = jest.fn(); const setContentFilterValue = jest.fn(); const mockValues = { @@ -51,7 +50,6 @@ describe('SourceContent', () => { setMockActions({ setActivePage, searchContentSourceDocuments, - resetSourceState, setContentFilterValue, }); setMockValues({ ...mockValues }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx index cc086f9c829d9..fbafe54df7493 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx @@ -56,12 +56,9 @@ const MAX_LENGTH = 28; export const SourceContent: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); - const { - setActivePage, - searchContentSourceDocuments, - resetSourceState, - setContentFilterValue, - } = useActions(SourceLogic); + const { setActivePage, searchContentSourceDocuments, setContentFilterValue } = useActions( + SourceLogic + ); const { contentSource: { id, serviceType, urlField, titleField, urlFieldIsLinkable, isFederatedSource }, @@ -74,10 +71,6 @@ export const SourceContent: React.FC = () => { sectionLoading, } = useValues(SourceLogic); - useEffect(() => { - return resetSourceState; - }, []); - useEffect(() => { searchContentSourceDocuments(id); }, [contentFilterValue, activePage]); @@ -106,7 +99,7 @@ export const SourceContent: React.FC = () => { const isCustomSource = serviceType === CUSTOM_SERVICE_TYPE; const emptyState = ( - + {emptyMessage}} iconType="documents" diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.test.tsx index c6cefba317cce..b2a4488b04107 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.test.tsx @@ -23,7 +23,6 @@ import { SourceSettings } from './source_settings'; describe('SourceSettings', () => { const updateContentSource = jest.fn(); const removeContentSource = jest.fn(); - const resetSourceState = jest.fn(); const getSourceConfigData = jest.fn(); const contentSource = fullContentSources[0]; const buttonLoading = false; @@ -41,7 +40,6 @@ describe('SourceSettings', () => { setMockActions({ updateContentSource, removeContentSource, - resetSourceState, getSourceConfigData, }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx index 7ba53822534cf..4bc623ac9fdf8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_settings.tsx @@ -52,7 +52,7 @@ import { staticSourceData } from '../source_data'; import { SourceLogic } from '../source_logic'; export const SourceSettings: React.FC = () => { - const { updateContentSource, removeContentSource, resetSourceState } = useActions(SourceLogic); + const { updateContentSource, removeContentSource } = useActions(SourceLogic); const { getSourceConfigData } = useActions(AddSourceLogic); const { @@ -68,7 +68,6 @@ export const SourceSettings: React.FC = () => { useEffect(() => { getSourceConfigData(serviceType); - return resetSourceState; }, []); const { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx index 114df3cf41e39..128c65eeb95da 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx @@ -81,7 +81,7 @@ export const PrivateSources: React.FC = () => { ); const privateSourcesEmptyState = ( - + {PRIVATE_EMPTY_TITLE}} /> @@ -107,7 +107,7 @@ export const PrivateSources: React.FC = () => { ); const sharedSourcesEmptyState = ( - + >({ ...contentSource, summary, }), + resetSourceState: () => ({} as ContentSourceFullData), }, ], dataLoading: [ true, { onInitializeSource: () => false, - resetSourceState: () => false, + resetSourceState: () => true, }, ], buttonLoading: [ diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_router.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_router.tsx index b844c86abb919..b14ea4ebd7a73 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_router.tsx @@ -47,12 +47,13 @@ import { SourceLogic } from './source_logic'; export const SourceRouter: React.FC = () => { const { sourceId } = useParams() as { sourceId: string }; - const { initializeSource } = useActions(SourceLogic); + const { initializeSource, resetSourceState } = useActions(SourceLogic); const { contentSource, dataLoading } = useValues(SourceLogic); const { isOrganization } = useValues(AppLogic); useEffect(() => { initializeSource(sourceId); + return resetSourceState; }, []); if (dataLoading) return ; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/constants.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/constants.ts index a44144666d139..b4355ba7aa586 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/constants.ts @@ -15,6 +15,27 @@ export const DELETE_ROLE_MAPPING_MESSAGE = i18n.translate( } ); +export const ROLE_MAPPING_DELETED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.roleMappingDeletedMessage', + { + defaultMessage: 'Successfully deleted role mapping', + } +); + +export const ROLE_MAPPING_CREATED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.roleMappingCreatedMessage', + { + defaultMessage: 'Role mapping successfully created.', + } +); + +export const ROLE_MAPPING_UPDATED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.roleMappingUpdatedMessage', + { + defaultMessage: 'Role mapping successfully updated.', + } +); + export const DEFAULT_GROUP_NAME = i18n.translate( 'xpack.enterpriseSearch.workplaceSearch.roleMapping.defaultGroupName', { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts index b43bda3bb228e..6e3b74f95f707 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts @@ -7,7 +7,11 @@ import { kea, MakeLogicType } from 'kea'; -import { clearFlashMessages, flashAPIErrors } from '../../../shared/flash_messages'; +import { + clearFlashMessages, + flashAPIErrors, + setSuccessMessage, +} from '../../../shared/flash_messages'; import { HttpLogic } from '../../../shared/http'; import { KibanaLogic } from '../../../shared/kibana'; import { ANY_AUTH_PROVIDER } from '../../../shared/role_mapping/constants'; @@ -15,7 +19,13 @@ import { AttributeName } from '../../../shared/types'; import { ROLE_MAPPINGS_PATH } from '../../routes'; import { RoleGroup, WSRoleMapping, Role } from '../../types'; -import { DELETE_ROLE_MAPPING_MESSAGE, DEFAULT_GROUP_NAME } from './constants'; +import { + DELETE_ROLE_MAPPING_MESSAGE, + ROLE_MAPPING_DELETED_MESSAGE, + ROLE_MAPPING_CREATED_MESSAGE, + ROLE_MAPPING_UPDATED_MESSAGE, + DEFAULT_GROUP_NAME, +} from './constants'; interface RoleMappingsServerDetails { multipleAuthProvidersConfig: boolean; @@ -265,6 +275,7 @@ export const RoleMappingsLogic = kea Date: Mon, 19 Apr 2021 10:35:22 -0700 Subject: [PATCH 45/82] [App Search] Synonyms set up (#97187) * Add barebones Synonyms view * Update Synonyms route+nav link * Add server API routes - will be used in upcoming PRs, may change Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/engine/engine_nav.tsx | 3 +- .../components/engine/engine_router.test.tsx | 8 + .../components/engine/engine_router.tsx | 11 +- .../app_search/components/synonyms/index.ts | 1 + .../components/synonyms/synonyms.test.tsx | 21 ++ .../components/synonyms/synonyms.tsx | 27 +++ .../server/routes/app_search/synonyms.test.ts | 207 ++++++++++++++++++ .../server/routes/app_search/synonyms.ts | 85 +++++++ 8 files changed, 358 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.tsx create mode 100644 x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.test.ts create mode 100644 x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.ts diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx index 2d7e3438d4c02..dfca497807718 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_nav.tsx @@ -211,8 +211,7 @@ export const EngineNav: React.FC = () => { )} {canManageEngineSynonyms && ( {SYNONYMS_TITLE} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx index 27ef42e72764c..d01958942e0a1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.test.tsx @@ -22,6 +22,7 @@ import { CurationsRouter } from '../curations'; import { EngineOverview } from '../engine_overview'; import { RelevanceTuning } from '../relevance_tuning'; import { ResultSettings } from '../result_settings'; +import { Synonyms } from '../synonyms'; import { EngineRouter } from './engine_router'; @@ -100,6 +101,13 @@ describe('EngineRouter', () => { expect(wrapper.find(AnalyticsRouter)).toHaveLength(1); }); + it('renders a synonyms view', () => { + setMockValues({ ...values, myRole: { canManageEngineSynonyms: true } }); + const wrapper = shallow(); + + expect(wrapper.find(Synonyms)).toHaveLength(1); + }); + it('renders a curations view', () => { setMockValues({ ...values, myRole: { canManageEngineCurations: true } }); const wrapper = shallow(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx index 8c6f248e9ce8e..c246af3611563 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx @@ -27,7 +27,7 @@ import { // ENGINE_CRAWLER_PATH, // META_ENGINE_SOURCE_ENGINES_PATH, ENGINE_RELEVANCE_TUNING_PATH, - // ENGINE_SYNONYMS_PATH, + ENGINE_SYNONYMS_PATH, ENGINE_CURATIONS_PATH, ENGINE_RESULT_SETTINGS_PATH, // ENGINE_SEARCH_UI_PATH, @@ -39,8 +39,8 @@ import { CurationsRouter } from '../curations'; import { DocumentDetail, Documents } from '../documents'; import { EngineOverview } from '../engine_overview'; import { RelevanceTuning } from '../relevance_tuning'; - import { ResultSettings } from '../result_settings'; +import { Synonyms } from '../synonyms'; import { EngineLogic, getEngineBreadcrumbs } from './'; @@ -53,7 +53,7 @@ export const EngineRouter: React.FC = () => { // canViewEngineCrawler, // canViewMetaEngineSourceEngines, canManageEngineRelevanceTuning, - // canManageEngineSynonyms, + canManageEngineSynonyms, canManageEngineCurations, canManageEngineResultSettings, // canManageEngineSearchUi, @@ -107,6 +107,11 @@ export const EngineRouter: React.FC = () => { )} + {canManageEngineSynonyms && ( + + + + )} {canManageEngineResultSettings && ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/index.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/index.ts index 5b0fde246ed44..177bc5eade0f6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/index.ts @@ -6,3 +6,4 @@ */ export { SYNONYMS_TITLE } from './constants'; +export { Synonyms } from './synonyms'; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.test.tsx new file mode 100644 index 0000000000000..e093442f77b77 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.test.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import '../../__mocks__/engine_logic.mock'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { Synonyms } from './'; + +describe('Synonyms', () => { + it('renders', () => { + shallow(); + // TODO: Check for Synonym cards, Synonym modal + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.tsx new file mode 100644 index 0000000000000..0b18271660911 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/synonyms.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { EuiPageHeader, EuiPageContentBody } from '@elastic/eui'; + +import { FlashMessages } from '../../../shared/flash_messages'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { getEngineBreadcrumbs } from '../engine'; + +import { SYNONYMS_TITLE } from './constants'; + +export const Synonyms: React.FC = () => { + return ( + <> + + + + TODO + + ); +}; diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.test.ts new file mode 100644 index 0000000000000..26b44b5ad8889 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.test.ts @@ -0,0 +1,207 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MockRouter, mockRequestHandler, mockDependencies } from '../../__mocks__'; + +import { registerSynonymsRoutes } from './synonyms'; + +describe('synonyms routes', () => { + describe('GET /api/app_search/engines/{engineName}/synonyms', () => { + let mockRouter: MockRouter; + + beforeEach(() => { + jest.clearAllMocks(); + mockRouter = new MockRouter({ + method: 'get', + path: '/api/app_search/engines/{engineName}/synonyms', + }); + + registerSynonymsRoutes({ + ...mockDependencies, + router: mockRouter.router, + }); + }); + + it('creates a request handler', () => { + expect(mockRequestHandler.createRequest).toHaveBeenCalledWith({ + path: '/as/engines/:engineName/synonyms/collection', + }); + }); + + describe('validates', () => { + it('with pagination query params', () => { + const request = { + query: { + 'page[current]': 1, + 'page[size]': 10, + }, + }; + mockRouter.shouldValidate(request); + }); + + it('missing query params', () => { + const request = { query: {} }; + mockRouter.shouldThrow(request); + }); + }); + }); + + describe('POST /api/app_search/engines/{engineName}/synonyms', () => { + let mockRouter: MockRouter; + + beforeEach(() => { + jest.clearAllMocks(); + mockRouter = new MockRouter({ + method: 'post', + path: '/api/app_search/engines/{engineName}/synonyms', + }); + + registerSynonymsRoutes({ + ...mockDependencies, + router: mockRouter.router, + }); + }); + + it('creates a request handler', () => { + expect(mockRequestHandler.createRequest).toHaveBeenCalledWith({ + path: '/as/engines/:engineName/synonyms/collection', + }); + }); + + describe('validates', () => { + it('with synonyms', () => { + const request = { + body: { + synonyms: ['a', 'b', 'c'], + }, + }; + mockRouter.shouldValidate(request); + }); + + it('empty synonyms array', () => { + const request = { + body: { + queries: [], + }, + }; + mockRouter.shouldThrow(request); + }); + + it('only one synonym', () => { + const request = { + body: { + queries: ['a'], + }, + }; + mockRouter.shouldThrow(request); + }); + + it('empty synonym strings', () => { + const request = { + body: { + queries: ['', '', ''], + }, + }; + mockRouter.shouldThrow(request); + }); + + it('missing synonyms', () => { + const request = { body: {} }; + mockRouter.shouldThrow(request); + }); + }); + }); + + describe('PUT /api/app_search/engines/{engineName}/synonyms/{synonymId}', () => { + let mockRouter: MockRouter; + + beforeEach(() => { + jest.clearAllMocks(); + mockRouter = new MockRouter({ + method: 'put', + path: '/api/app_search/engines/{engineName}/synonyms/{synonymId}', + }); + + registerSynonymsRoutes({ + ...mockDependencies, + router: mockRouter.router, + }); + }); + + it('creates a request handler', () => { + expect(mockRequestHandler.createRequest).toHaveBeenCalledWith({ + path: '/as/engines/:engineName/synonyms/:synonymId', + }); + }); + + describe('validates', () => { + it('with synonyms', () => { + const request = { + body: { + synonyms: ['a', 'b', 'c'], + }, + }; + mockRouter.shouldValidate(request); + }); + + it('empty synonyms array', () => { + const request = { + body: { + queries: [], + }, + }; + mockRouter.shouldThrow(request); + }); + + it('only one synonym', () => { + const request = { + body: { + queries: ['a'], + }, + }; + mockRouter.shouldThrow(request); + }); + + it('empty synonym strings', () => { + const request = { + body: { + queries: ['', '', ''], + }, + }; + mockRouter.shouldThrow(request); + }); + + it('missing synonyms', () => { + const request = { body: {} }; + mockRouter.shouldThrow(request); + }); + }); + }); + + describe('DELETE /api/app_search/engines/{engineName}/synonyms/{synonymId}', () => { + let mockRouter: MockRouter; + + beforeEach(() => { + jest.clearAllMocks(); + mockRouter = new MockRouter({ + method: 'delete', + path: '/api/app_search/engines/{engineName}/synonyms/{synonymId}', + }); + + registerSynonymsRoutes({ + ...mockDependencies, + router: mockRouter.router, + }); + }); + + it('creates a request handler', () => { + expect(mockRequestHandler.createRequest).toHaveBeenCalledWith({ + path: '/as/engines/:engineName/synonyms/:synonymId', + }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.ts new file mode 100644 index 0000000000000..1be58f00c476a --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/synonyms.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +import { RouteDependencies } from '../../plugin'; + +const synonymsSchema = schema.arrayOf(schema.string({ minLength: 1 }), { minSize: 2 }); + +export function registerSynonymsRoutes({ + router, + enterpriseSearchRequestHandler, +}: RouteDependencies) { + router.get( + { + path: '/api/app_search/engines/{engineName}/synonyms', + validate: { + params: schema.object({ + engineName: schema.string(), + }), + query: schema.object({ + 'page[current]': schema.number(), + 'page[size]': schema.number(), + }), + }, + }, + enterpriseSearchRequestHandler.createRequest({ + path: '/as/engines/:engineName/synonyms/collection', + }) + ); + + router.post( + { + path: '/api/app_search/engines/{engineName}/synonyms', + validate: { + params: schema.object({ + engineName: schema.string(), + }), + body: schema.object({ + synonyms: synonymsSchema, + }), + }, + }, + enterpriseSearchRequestHandler.createRequest({ + path: '/as/engines/:engineName/synonyms/collection', + }) + ); + + router.put( + { + path: '/api/app_search/engines/{engineName}/synonyms/{synonymId}', + validate: { + params: schema.object({ + engineName: schema.string(), + synonymId: schema.string(), + }), + body: schema.object({ + synonyms: synonymsSchema, + }), + }, + }, + enterpriseSearchRequestHandler.createRequest({ + path: '/as/engines/:engineName/synonyms/:synonymId', + }) + ); + + router.delete( + { + path: '/api/app_search/engines/{engineName}/synonyms/{synonymId}', + validate: { + params: schema.object({ + engineName: schema.string(), + synonymId: schema.string(), + }), + }, + }, + enterpriseSearchRequestHandler.createRequest({ + path: '/as/engines/:engineName/synonyms/:synonymId', + }) + ); +} From 64f30a224e52e58e8a806bba9194123ecc109860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Mon, 19 Apr 2021 20:10:34 +0200 Subject: [PATCH 46/82] [Asset Management] Add live query history table (#94536) --- package.json | 2 +- x-pack/plugins/osquery/common/constants.ts | 2 + x-pack/plugins/osquery/kibana.json | 2 + .../action_results/action_results_summary.tsx | 239 ++++++++++++ .../action_results/action_results_table.tsx | 196 ---------- .../osquery/public/action_results/helpers.ts | 5 +- .../action_results/use_action_results.ts | 95 +++-- .../osquery/public/actions/actions_table.tsx | 195 +++++----- .../plugins/osquery/public/actions/helpers.ts | 5 +- .../public/actions/use_action_details.ts | 42 +-- .../osquery/public/actions/use_all_actions.ts | 49 +-- .../agent_policies/agents_policy_link.tsx | 55 +++ .../osquery/public/agent_policies/index.tsx | 9 + .../agent_policies/use_agent_policies.ts | 35 ++ .../public/agent_policies/use_agent_policy.ts | 30 ++ .../osquery/public/agents/agents_table.tsx | 34 +- .../plugins/osquery/public/agents/helpers.ts | 5 +- .../public/agents/use_agent_policies.ts | 15 +- .../osquery/public/agents/use_agent_status.ts | 39 ++ .../osquery/public/agents/use_all_agents.ts | 7 +- .../public/agents/use_osquery_policies.ts | 12 +- x-pack/plugins/osquery/public/application.tsx | 5 +- .../osquery/public/common/hooks/index.tsx | 9 + .../public/common/hooks/use_breadcrumbs.tsx | 136 +++++++ .../public/common/hooks/use_discover_link.tsx | 64 ++++ .../common/hooks/use_osquery_integration.tsx | 31 ++ .../public/common/lib/kibana/kibana_react.ts | 8 + .../osquery/public/common/page_paths.ts | 59 +++ .../plugins/osquery/public/components/app.tsx | 42 ++- .../osquery/public/components/beta_badge.tsx | 37 ++ .../components/manage_integration_link.tsx | 74 ++++ .../plugins/osquery/public/editor/index.tsx | 43 ++- .../components/add_new_query_flyout.tsx | 68 ---- .../components/custom_tab_tabs.tsx | 36 -- .../fleet_integration/components/form.tsx | 240 ------------- .../components/input_stream_form.tsx | 69 ---- .../components/input_type.tsx | 64 ---- .../components/navigation.tsx | 92 ----- .../components/pack_selector.tsx | 87 ----- .../components/scheduled_queries_table.tsx | 142 -------- .../fleet_integration/components/schema.ts | 41 --- .../osquery/public/fleet_integration/index.ts | 6 +- ...query_managed_custom_button_extension.tsx} | 16 +- ..._managed_empty_create_policy_extension.tsx | 20 -- ...ry_managed_empty_edit_policy_extension.tsx | 20 -- ...anaged_policy_create_import_extension.tsx} | 8 +- ..._osquery_managed_policy_edit_extension.tsx | 6 +- .../fleet_integration/navigation_buttons.tsx | 105 ++++++ ...squery_managed_custom_button_extension.tsx | 20 ++ .../osquery_managed_custom_extension.tsx | 36 -- ..._managed_empty_create_policy_extension.tsx | 43 --- ...ry_managed_empty_edit_policy_extension.tsx | 23 -- ...squery_managed_policy_create_extension.tsx | 53 --- ...managed_policy_create_import_extension.tsx | 202 +++++++++++ .../agent_results/index.tsx | 5 +- .../form/agents_table_field.tsx | 0 .../public/live_queries/form/index.tsx | 174 +++++++++ .../form/live_query_query_field.tsx | 5 +- .../form/schema.ts | 0 .../osquery/public/live_queries/index.tsx | 22 ++ .../osquery/public/live_query/form/index.tsx | 52 --- .../osquery/public/live_query/index.tsx | 47 --- .../example_params_fields.tsx | 49 --- .../public/osquery_action_type/index.tsx | 73 ---- .../osquery/public/packs/edit/index.tsx | 1 + x-pack/plugins/osquery/public/plugin.ts | 104 +++--- .../osquery/public/queries/edit/tabs.tsx | 12 +- .../public/queries/form/code_editor_field.tsx | 31 +- x-pack/plugins/osquery/public/query_client.ts | 10 + .../plugins/osquery/public/results/helpers.ts | 5 +- .../osquery/public/results/results_table.tsx | 101 +++--- .../osquery/public/results/use_all_results.ts | 58 ++- .../plugins/osquery/public/routes/index.tsx | 36 +- .../live_queries/details/actions_menu.tsx | 68 ++++ .../details/index.tsx | 60 +--- .../{live_query => live_queries}/index.tsx | 6 +- .../public/routes/live_queries/list/index.tsx | 65 ++++ .../new/index.tsx | 52 ++- .../routes/live_query/agent_details/index.tsx | 82 ----- .../public/routes/live_query/list/index.tsx | 63 ---- .../scheduled_query_groups/add/index.tsx | 68 ++++ .../details/actions_menu.tsx | 32 +- .../scheduled_query_groups/details/index.tsx | 128 +++++++ .../scheduled_query_groups/edit/index.tsx | 74 ++++ .../routes/scheduled_query_groups/index.tsx | 39 ++ .../scheduled_query_groups/list/index.tsx | 63 ++++ .../common/osquery_stream_field.tsx | 169 --------- .../public/scheduled_query/edit/form.tsx | 153 -------- .../public/scheduled_query/edit/index.tsx | 48 --- .../public/scheduled_query/edit/schema.ts | 26 -- .../osquery/public/scheduled_query/index.tsx | 38 -- .../public/scheduled_query/new/form.tsx | 105 ------ .../public/scheduled_query/new/index.tsx | 32 -- .../public/scheduled_query/new/schema.ts | 67 ---- .../public/scheduled_query/new/utils.ts | 25 -- .../public/scheduled_query/queries/index.tsx | 185 ---------- .../active_state_switch.tsx | 144 ++++++++ .../form/add_query_flyout.tsx | 124 +++++++ .../form/confirmation_modal.tsx | 82 +++++ .../form/edit_query_flyout.tsx | 136 +++++++ .../scheduled_query_groups/form/index.tsx | 339 ++++++++++++++++++ .../form/pack_uploader.tsx | 142 ++++++++ .../form/policy_id_combobox_field.tsx | 121 +++++++ .../form/queries_field.tsx | 190 ++++++++++ .../public/scheduled_query_groups/index.tsx | 8 + .../scheduled_query_group_queries_table.tsx | 214 +++++++++++ .../scheduled_query_groups_table.tsx | 104 ++++++ .../use_scheduled_query_group.ts | 37 ++ .../use_scheduled_query_groups.ts | 46 +++ .../plugins/osquery/public/shared_imports.ts | 1 + x-pack/plugins/osquery/public/types.ts | 4 +- x-pack/plugins/osquery/server/config.ts | 3 + x-pack/plugins/osquery/server/index.ts | 3 + .../lib/osquery_app_context_services.ts | 2 +- x-pack/plugins/osquery/server/plugin.ts | 55 ++- .../routes/action/create_action_route.ts | 87 +---- x-pack/plugins/osquery/server/routes/index.ts | 16 +- .../find_scheduled_query_route.ts | 4 +- .../plugins/osquery/server/saved_objects.ts | 16 +- .../results/query.action_results.dsl.ts | 37 +- .../factory/results/query.all_results.dsl.ts | 27 +- x-pack/plugins/osquery/server/types.ts | 2 + yarn.lock | 8 +- 123 files changed, 4274 insertions(+), 3089 deletions(-) create mode 100644 x-pack/plugins/osquery/public/action_results/action_results_summary.tsx delete mode 100644 x-pack/plugins/osquery/public/action_results/action_results_table.tsx create mode 100644 x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx create mode 100644 x-pack/plugins/osquery/public/agent_policies/index.tsx create mode 100644 x-pack/plugins/osquery/public/agent_policies/use_agent_policies.ts create mode 100644 x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts create mode 100644 x-pack/plugins/osquery/public/agents/use_agent_status.ts create mode 100644 x-pack/plugins/osquery/public/common/hooks/index.tsx create mode 100644 x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx create mode 100644 x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx create mode 100644 x-pack/plugins/osquery/public/common/hooks/use_osquery_integration.tsx create mode 100644 x-pack/plugins/osquery/public/common/page_paths.ts create mode 100644 x-pack/plugins/osquery/public/components/beta_badge.tsx create mode 100644 x-pack/plugins/osquery/public/components/manage_integration_link.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/add_new_query_flyout.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/custom_tab_tabs.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/form.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/input_stream_form.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/input_type.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/navigation.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/pack_selector.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/scheduled_queries_table.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/components/schema.ts rename x-pack/plugins/osquery/public/fleet_integration/{lazy_osquery_managed_custom_extension.tsx => lazy_osquery_managed_custom_button_extension.tsx} (53%) delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_create_policy_extension.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_edit_policy_extension.tsx rename x-pack/plugins/osquery/public/fleet_integration/{lazy_osquery_managed_policy_create_extension.tsx => lazy_osquery_managed_policy_create_import_extension.tsx} (58%) create mode 100644 x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx create mode 100644 x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_button_extension.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_extension.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_create_policy_extension.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_edit_policy_extension.tsx delete mode 100644 x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_extension.tsx create mode 100644 x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx rename x-pack/plugins/osquery/public/{live_query => live_queries}/agent_results/index.tsx (89%) rename x-pack/plugins/osquery/public/{live_query => live_queries}/form/agents_table_field.tsx (100%) create mode 100644 x-pack/plugins/osquery/public/live_queries/form/index.tsx rename x-pack/plugins/osquery/public/{live_query => live_queries}/form/live_query_query_field.tsx (93%) rename x-pack/plugins/osquery/public/{live_query => live_queries}/form/schema.ts (100%) create mode 100644 x-pack/plugins/osquery/public/live_queries/index.tsx delete mode 100644 x-pack/plugins/osquery/public/live_query/form/index.tsx delete mode 100644 x-pack/plugins/osquery/public/live_query/index.tsx delete mode 100644 x-pack/plugins/osquery/public/osquery_action_type/example_params_fields.tsx delete mode 100644 x-pack/plugins/osquery/public/osquery_action_type/index.tsx create mode 100644 x-pack/plugins/osquery/public/query_client.ts create mode 100644 x-pack/plugins/osquery/public/routes/live_queries/details/actions_menu.tsx rename x-pack/plugins/osquery/public/routes/{live_query => live_queries}/details/index.tsx (75%) rename x-pack/plugins/osquery/public/routes/{live_query => live_queries}/index.tsx (83%) create mode 100644 x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx rename x-pack/plugins/osquery/public/routes/{live_query => live_queries}/new/index.tsx (50%) delete mode 100644 x-pack/plugins/osquery/public/routes/live_query/agent_details/index.tsx delete mode 100644 x-pack/plugins/osquery/public/routes/live_query/list/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/scheduled_query_groups/add/index.tsx rename x-pack/plugins/osquery/public/routes/{live_query => scheduled_query_groups}/details/actions_menu.tsx (60%) create mode 100644 x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/scheduled_query_groups/edit/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/scheduled_query_groups/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/scheduled_query_groups/list/index.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/common/osquery_stream_field.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/edit/form.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/edit/index.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/edit/schema.ts delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/index.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/new/form.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/new/index.tsx delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/new/schema.ts delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/new/utils.ts delete mode 100644 x-pack/plugins/osquery/public/scheduled_query/queries/index.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/active_state_switch.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/add_query_flyout.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/confirmation_modal.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/edit_query_flyout.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/index.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/pack_uploader.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/policy_id_combobox_field.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/index.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_group_queries_table.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_group.ts create mode 100644 x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_groups.ts diff --git a/package.json b/package.json index 38eaec444ac5d..4f49ecd7373e2 100644 --- a/package.json +++ b/package.json @@ -348,7 +348,7 @@ "react-moment-proptypes": "^1.7.0", "react-monaco-editor": "^0.41.2", "react-popper-tooltip": "^2.10.1", - "react-query": "^3.12.0", + "react-query": "^3.13.10", "react-resize-detector": "^4.2.0", "react-reverse-portal": "^1.0.4", "react-router-redux": "^4.0.8", diff --git a/x-pack/plugins/osquery/common/constants.ts b/x-pack/plugins/osquery/common/constants.ts index 794ac5004c9f1..5354332fd89f8 100644 --- a/x-pack/plugins/osquery/common/constants.ts +++ b/x-pack/plugins/osquery/common/constants.ts @@ -7,3 +7,5 @@ export const DEFAULT_MAX_TABLE_QUERY_SIZE = 10000; export const DEFAULT_DARK_MODE = 'theme:darkMode'; +export const OSQUERY_INTEGRATION_NAME = 'osquery_manager'; +export const BASE_PATH = '/app/osquery'; diff --git a/x-pack/plugins/osquery/kibana.json b/x-pack/plugins/osquery/kibana.json index fea20d9fb3cb5..17d74b124f45b 100644 --- a/x-pack/plugins/osquery/kibana.json +++ b/x-pack/plugins/osquery/kibana.json @@ -20,6 +20,8 @@ "actions", "data", "dataEnhanced", + "discover", + "features", "fleet", "navigation", "triggersActionsUi" diff --git a/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx b/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx new file mode 100644 index 0000000000000..9542286c860f2 --- /dev/null +++ b/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx @@ -0,0 +1,239 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @typescript-eslint/no-unused-vars */ + +import { i18n } from '@kbn/i18n'; +import { + EuiLink, + EuiFlexGroup, + EuiFlexItem, + EuiCard, + EuiTextColor, + EuiSpacer, + EuiDescriptionList, + EuiInMemoryTable, + EuiCodeBlock, +} from '@elastic/eui'; +import React, { useCallback, useMemo, useState } from 'react'; + +import { pagePathGetters } from '../../../fleet/public'; +import { useActionResults } from './use_action_results'; +import { useAllResults } from '../results/use_all_results'; +import { Direction } from '../../common/search_strategy'; +import { useKibana } from '../common/lib/kibana'; + +interface ActionResultsSummaryProps { + actionId: string; + agentIds?: string[]; + isLive?: boolean; +} + +const renderErrorMessage = (error: string) => ( + + {error} + +); + +const ActionResultsSummaryComponent: React.FC = ({ + actionId, + agentIds, + isLive, +}) => { + const getUrlForApp = useKibana().services.application.getUrlForApp; + // @ts-expect-error update types + const [pageIndex, setPageIndex] = useState(0); + // @ts-expect-error update types + const [pageSize, setPageSize] = useState(50); + const { + // @ts-expect-error update types + data: { aggregations, edges }, + } = useActionResults({ + actionId, + activePage: pageIndex, + agentIds, + limit: pageSize, + direction: Direction.asc, + sortField: '@timestamp', + isLive, + }); + + const { data: logsResults } = useAllResults({ + actionId, + activePage: pageIndex, + limit: pageSize, + direction: Direction.asc, + sortField: '@timestamp', + isLive, + }); + + const notRespondedCount = useMemo(() => { + if (!agentIds || !aggregations.totalResponded) { + return '-'; + } + + return agentIds.length - aggregations.totalResponded; + }, [aggregations.totalResponded, agentIds]); + + const listItems = useMemo( + () => [ + { + title: i18n.translate( + 'xpack.osquery.liveQueryActionResults.summary.agentsQueriedLabelText', + { + defaultMessage: 'Agents queried', + } + ), + description: agentIds?.length, + }, + { + title: i18n.translate('xpack.osquery.liveQueryActionResults.summary.successfulLabelText', { + defaultMessage: 'Successful', + }), + description: aggregations.successful, + }, + { + title: i18n.translate('xpack.osquery.liveQueryActionResults.summary.pendingLabelText', { + defaultMessage: 'Not yet responded', + }), + description: notRespondedCount, + }, + { + title: i18n.translate('xpack.osquery.liveQueryActionResults.summary.failedLabelText', { + defaultMessage: 'Failed', + }), + description: ( + + {aggregations.failed} + + ), + }, + ], + [agentIds, aggregations.failed, aggregations.successful, notRespondedCount] + ); + + const renderAgentIdColumn = useCallback( + (agentId) => ( + + {agentId} + + ), + [getUrlForApp] + ); + + const renderRowsColumn = useCallback( + (_, item) => { + if (!logsResults) return '-'; + const agentId = item.fields.agent_id[0]; + + return ( + // @ts-expect-error update types + logsResults?.rawResponse?.aggregations?.count_by_agent_id?.buckets?.find( + // @ts-expect-error update types + (bucket) => bucket.key === agentId + )?.doc_count ?? '-' + ); + }, + [logsResults] + ); + + const renderStatusColumn = useCallback((_, item) => { + if (!item.fields.completed_at) { + return i18n.translate('xpack.osquery.liveQueryActionResults.table.pendingStatusText', { + defaultMessage: 'pending', + }); + } + + if (item.fields['error.keyword']) { + return i18n.translate('xpack.osquery.liveQueryActionResults.table.errorStatusText', { + defaultMessage: 'error', + }); + } + + return i18n.translate('xpack.osquery.liveQueryActionResults.table.successStatusText', { + defaultMessage: 'success', + }); + }, []); + + const columns = useMemo( + () => [ + { + field: 'status', + name: i18n.translate('xpack.osquery.liveQueryActionResults.table.statusColumnTitle', { + defaultMessage: 'Status', + }), + render: renderStatusColumn, + }, + { + field: 'fields.agent_id[0]', + name: i18n.translate('xpack.osquery.liveQueryActionResults.table.agentIdColumnTitle', { + defaultMessage: 'Agent Id', + }), + truncateText: true, + render: renderAgentIdColumn, + }, + { + field: 'fields.rows[0]', + name: i18n.translate( + 'xpack.osquery.liveQueryActionResults.table.resultRowsNumberColumnTitle', + { + defaultMessage: 'Number of result rows', + } + ), + render: renderRowsColumn, + }, + { + field: 'fields.error[0]', + name: i18n.translate('xpack.osquery.liveQueryActionResults.table.errorColumnTitle', { + defaultMessage: 'Error', + }), + render: renderErrorMessage, + }, + ], + [renderAgentIdColumn, renderRowsColumn, renderStatusColumn] + ); + + const pagination = useMemo( + () => ({ + initialPageSize: 20, + pageSizeOptions: [10, 20, 50, 100], + }), + [] + ); + + return ( + <> + + + + + + + + + {edges.length ? ( + <> + + + + ) : null} + + ); +}; + +export const ActionResultsSummary = React.memo(ActionResultsSummaryComponent); diff --git a/x-pack/plugins/osquery/public/action_results/action_results_table.tsx b/x-pack/plugins/osquery/public/action_results/action_results_table.tsx deleted file mode 100644 index 660b837da6d93..0000000000000 --- a/x-pack/plugins/osquery/public/action_results/action_results_table.tsx +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { find, map } from 'lodash/fp'; -import { - EuiDataGrid, - EuiDataGridProps, - EuiDataGridColumn, - EuiDataGridSorting, - EuiHealth, - EuiIcon, - EuiLink, -} from '@elastic/eui'; -import React, { createContext, useState, useCallback, useContext, useMemo } from 'react'; - -import { useAllAgents } from './../agents/use_all_agents'; -import { useActionResults } from './use_action_results'; -import { useAllResults } from '../results/use_all_results'; -import { Direction, ResultEdges } from '../../common/search_strategy'; -import { useRouterNavigate } from '../common/lib/kibana'; -import { useOsqueryPolicies } from '../agents/use_osquery_policies'; - -const DataContext = createContext([]); - -interface ActionResultsTableProps { - actionId: string; -} - -const ActionResultsTableComponent: React.FC = ({ actionId }) => { - const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 50 }); - const onChangeItemsPerPage = useCallback( - (pageSize) => - setPagination((currentPagination) => ({ - ...currentPagination, - pageSize, - pageIndex: 0, - })), - [setPagination] - ); - const onChangePage = useCallback( - (pageIndex) => setPagination((currentPagination) => ({ ...currentPagination, pageIndex })), - [setPagination] - ); - - const [columns] = useState([ - { - id: 'status', - displayAsText: 'status', - defaultSortDirection: Direction.asc, - }, - { - id: 'rows_count', - displayAsText: '# rows', - defaultSortDirection: Direction.asc, - }, - { - id: 'agent_status', - displayAsText: 'online', - defaultSortDirection: Direction.asc, - }, - { - id: 'agent', - displayAsText: 'agent', - defaultSortDirection: Direction.asc, - }, - { - id: '@timestamp', - displayAsText: '@timestamp', - defaultSortDirection: Direction.asc, - }, - ]); - - // ** Sorting config - const [sortingColumns, setSortingColumns] = useState([]); - - const { data: actionResultsData } = useActionResults({ - actionId, - activePage: pagination.pageIndex, - limit: pagination.pageSize, - direction: Direction.asc, - sortField: '@timestamp', - }); - - const [visibleColumns, setVisibleColumns] = useState(() => map('id', columns)); // initialize to the full set of columns - - const columnVisibility = useMemo(() => ({ visibleColumns, setVisibleColumns }), [ - visibleColumns, - setVisibleColumns, - ]); - - const osqueryPolicyData = useOsqueryPolicies(); - const { agents } = useAllAgents(osqueryPolicyData); - - const renderCellValue: EuiDataGridProps['renderCellValue'] = useMemo( - () => ({ rowIndex, columnId }) => { - // eslint-disable-next-line react-hooks/rules-of-hooks - const data = useContext(DataContext); - const value = data[rowIndex]; - - if (columnId === 'status') { - // eslint-disable-next-line react-hooks/rules-of-hooks - const linkProps = useRouterNavigate( - `/live_query/${actionId}/results/${value.fields?.agent_id[0]}` - ); - - return ( - <> - - {'View results'} - - ); - } - - if (columnId === 'rows_count') { - // eslint-disable-next-line react-hooks/rules-of-hooks - const { data: allResultsData } = useAllResults({ - actionId, - agentId: value.fields?.agent_id[0], - activePage: pagination.pageIndex, - limit: pagination.pageSize, - direction: Direction.asc, - sortField: '@timestamp', - }); - // @ts-expect-error update types - return allResultsData?.totalCount ?? '-'; - } - - if (columnId === 'agent_status') { - const agentIdValue = value.fields?.agent_id[0]; - const agent = find(['_id', agentIdValue], agents); - const online = agent?.active; - const color = online ? 'success' : 'danger'; - const label = online ? 'Online' : 'Offline'; - return {label}; - } - - if (columnId === 'agent') { - const agentIdValue = value.fields?.agent_id[0]; - const agent = find(['_id', agentIdValue], agents); - const agentName = agent?.local_metadata.host.name; - - // eslint-disable-next-line react-hooks/rules-of-hooks - const linkProps = useRouterNavigate(`/live_query/${actionId}/results/${agentIdValue}`); - return ( - {`(${agent?.local_metadata.os.name}) ${agentName}`} - ); - } - - if (columnId === '@timestamp') { - // @ts-expect-error fields is optional - return value.fields['@timestamp']; - } - - return '-'; - }, - [actionId, agents, pagination.pageIndex, pagination.pageSize] - ); - - const tableSorting: EuiDataGridSorting = useMemo( - () => ({ columns: sortingColumns, onSort: setSortingColumns }), - [sortingColumns] - ); - - const tablePagination = useMemo( - () => ({ - ...pagination, - pageSizeOptions: [10, 50, 100], - onChangeItemsPerPage, - onChangePage, - }), - [onChangeItemsPerPage, onChangePage, pagination] - ); - - return ( - // @ts-expect-error update types - - - - ); -}; - -export const ActionResultsTable = React.memo(ActionResultsTableComponent); diff --git a/x-pack/plugins/osquery/public/action_results/helpers.ts b/x-pack/plugins/osquery/public/action_results/helpers.ts index 802674ee0398c..171530a77299f 100644 --- a/x-pack/plugins/osquery/public/action_results/helpers.ts +++ b/x-pack/plugins/osquery/public/action_results/helpers.ts @@ -16,15 +16,14 @@ export type InspectResponse = Inspect & { response: string[] }; export const generateTablePaginationOptions = ( activePage: number, - limit: number, - isBucketSort?: boolean + limit: number ): PaginationInputPaginated => { const cursorStart = activePage * limit; return { activePage, cursorStart, fakePossibleCount: 4 <= activePage && activePage > 0 ? limit * (activePage + 2) : limit * 5, - querySize: isBucketSort ? limit : limit + cursorStart, + querySize: limit, }; }; diff --git a/x-pack/plugins/osquery/public/action_results/use_action_results.ts b/x-pack/plugins/osquery/public/action_results/use_action_results.ts index 58a877e799703..7cad8ca3fc498 100644 --- a/x-pack/plugins/osquery/public/action_results/use_action_results.ts +++ b/x-pack/plugins/osquery/public/action_results/use_action_results.ts @@ -5,8 +5,7 @@ * 2.0. */ -import deepEqual from 'fast-deep-equal'; -import { useEffect, useState } from 'react'; +import { flatten, reverse, uniqBy } from 'lodash/fp'; import { useQuery } from 'react-query'; import { createFilter } from '../common/helpers'; @@ -20,6 +19,7 @@ import { Direction, } from '../../common/search_strategy'; import { ESTermQuery } from '../../common/typed_json'; +import { queryClient } from '../query_client'; import { generateTablePaginationOptions, getInspectResponse, InspectResponse } from './helpers'; @@ -35,68 +35,91 @@ export interface ResultsArgs { interface UseActionResults { actionId: string; activePage: number; + agentIds?: string[]; direction: Direction; limit: number; sortField: string; filterQuery?: ESTermQuery | string; skip?: boolean; + isLive?: boolean; } export const useActionResults = ({ actionId, activePage, + agentIds, direction, limit, sortField, filterQuery, skip = false, + isLive = false, }: UseActionResults) => { const { data } = useKibana().services; - const [resultsRequest, setHostRequest] = useState(null); - - const response = useQuery( - ['actionResults', { actionId, activePage, direction, limit, sortField }], + return useQuery( + ['actionResults', { actionId }], async () => { - if (!resultsRequest) return Promise.resolve(); - const responseData = await data.search - .search(resultsRequest, { - strategy: 'osquerySearchStrategy', - }) + .search( + { + actionId, + factoryQueryType: OsqueryQueries.actionResults, + filterQuery: createFilter(filterQuery), + pagination: generateTablePaginationOptions(activePage, limit), + sort: { + direction, + field: sortField, + }, + }, + { + strategy: 'osquerySearchStrategy', + } + ) .toPromise(); + const totalResponded = + // @ts-expect-error update types + responseData.rawResponse?.aggregations?.aggs.responses_by_action_id?.doc_count; + const aggsBuckets = + // @ts-expect-error update types + responseData.rawResponse?.aggregations?.aggs.responses_by_action_id?.responses.buckets; + + const cachedData = queryClient.getQueryData(['actionResults', { actionId }]); + + // @ts-expect-error update types + const previousEdges = cachedData?.edges.length + ? // @ts-expect-error update types + cachedData?.edges + : agentIds?.map((agentId) => ({ fields: { agent_id: [agentId] } })) ?? []; + return { ...responseData, - results: responseData.edges, + edges: reverse(uniqBy('fields.agent_id[0]', flatten([responseData.edges, previousEdges]))), + aggregations: { + totalResponded, + // @ts-expect-error update types + successful: aggsBuckets.find((bucket) => bucket.key === 'success')?.doc_count ?? 0, + // @ts-expect-error update types + failed: aggsBuckets.find((bucket) => bucket.key === 'error')?.doc_count ?? 0, + }, inspect: getInspectResponse(responseData, {} as InspectResponse), }; }, { - refetchInterval: 1000, - enabled: !skip && !!resultsRequest, + initialData: { + edges: [], + aggregations: { + totalResponded: 0, + successful: 0, + // @ts-expect-error update types + pending: agentIds?.length ?? 0, + failed: 0, + }, + }, + refetchInterval: isLive ? 1000 : false, + keepPreviousData: true, + enabled: !skip && !!agentIds?.length, } ); - - useEffect(() => { - setHostRequest((prevRequest) => { - const myRequest = { - ...(prevRequest ?? {}), - actionId, - factoryQueryType: OsqueryQueries.actionResults, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - sort: { - direction, - field: sortField, - }, - }; - if (!deepEqual(prevRequest, myRequest)) { - return myRequest; - } - return prevRequest; - }); - }, [actionId, activePage, direction, filterQuery, limit, sortField]); - - return response; }; diff --git a/x-pack/plugins/osquery/public/actions/actions_table.tsx b/x-pack/plugins/osquery/public/actions/actions_table.tsx index ca85693849651..5d1b9b723d98b 100644 --- a/x-pack/plugins/osquery/public/actions/actions_table.tsx +++ b/x-pack/plugins/osquery/public/actions/actions_table.tsx @@ -5,128 +5,123 @@ * 2.0. */ -import { isEmpty, isEqual, keys, map } from 'lodash/fp'; -import { - EuiLink, - EuiDataGrid, - EuiDataGridProps, - EuiDataGridColumn, - EuiDataGridSorting, - EuiLoadingContent, -} from '@elastic/eui'; -import React, { createContext, useEffect, useState, useCallback, useContext, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiBasicTable, EuiButtonIcon, EuiCodeBlock, formatDate } from '@elastic/eui'; +import React, { useState, useCallback, useMemo } from 'react'; import { useAllActions } from './use_all_actions'; -import { ActionEdges, Direction } from '../../common/search_strategy'; +import { Direction } from '../../common/search_strategy'; import { useRouterNavigate } from '../common/lib/kibana'; -const DataContext = createContext([]); +interface ActionTableResultsButtonProps { + actionId: string; +} -const ActionsTableComponent = () => { - const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 50 }); - const onChangeItemsPerPage = useCallback( - (pageSize) => - setPagination((currentPagination) => ({ - ...currentPagination, - pageSize, - pageIndex: 0, - })), - [setPagination] - ); - const onChangePage = useCallback( - (pageIndex) => setPagination((currentPagination) => ({ ...currentPagination, pageIndex })), - [setPagination] - ); +const ActionTableResultsButton = React.memo(({ actionId }) => { + const navProps = useRouterNavigate(`live_queries/${actionId}`); + + return ; +}); - const [columns, setColumns] = useState([]); +ActionTableResultsButton.displayName = 'ActionTableResultsButton'; - // ** Sorting config - const [sortingColumns, setSortingColumns] = useState([]); +const ActionsTableComponent = () => { + const [pageIndex, setPageIndex] = useState(0); + const [pageSize, setPageSize] = useState(20); - const { isLoading: actionsLoading, data: actionsData } = useAllActions({ - activePage: pagination.pageIndex, - limit: pagination.pageSize, + const { data: actionsData } = useAllActions({ + activePage: pageIndex, + limit: pageSize, direction: Direction.desc, sortField: '@timestamp', }); - // Column visibility - const [visibleColumns, setVisibleColumns] = useState([]); // initialize to the full set of columns - - const columnVisibility = useMemo(() => ({ visibleColumns, setVisibleColumns }), [ - visibleColumns, - setVisibleColumns, - ]); - - const renderCellValue: EuiDataGridProps['renderCellValue'] = useMemo( - () => ({ rowIndex, columnId }) => { - // eslint-disable-next-line react-hooks/rules-of-hooks - const data = useContext(DataContext); - // @ts-expect-error fields is optional - const value = data[rowIndex].fields[columnId]; - - if (columnId === 'action_id') { - // eslint-disable-next-line react-hooks/rules-of-hooks - const linkProps = useRouterNavigate(`/live_query/${value}`); - return {value}; - } - - return !isEmpty(value) ? value : '-'; - }, + const onTableChange = useCallback(({ page = {} }) => { + const { index, size } = page; + + setPageIndex(index); + setPageSize(size); + }, []); + + const renderQueryColumn = useCallback( + (_, item) => ( + + {item._source.data.query} + + ), [] ); - const tableSorting: EuiDataGridSorting = useMemo( - () => ({ columns: sortingColumns, onSort: setSortingColumns }), - [setSortingColumns, sortingColumns] + const renderAgentsColumn = useCallback((_, item) => <>{item.fields.agents?.length ?? 0}, []); + + const renderTimestampColumn = useCallback( + (_, item) => <>{formatDate(item.fields['@timestamp'][0])}, + [] + ); + + const renderActionsColumn = useCallback( + (item) => , + [] ); - const tablePagination = useMemo( + const columns = useMemo( + () => [ + { + field: 'query', + name: i18n.translate('xpack.osquery.liveQueryActions.table.queryColumnTitle', { + defaultMessage: 'Query', + }), + truncateText: true, + render: renderQueryColumn, + }, + { + field: 'agents', + name: i18n.translate('xpack.osquery.liveQueryActions.table.agentsColumnTitle', { + defaultMessage: 'Agents', + }), + width: '100px', + render: renderAgentsColumn, + }, + { + field: 'created_at', + name: i18n.translate('xpack.osquery.liveQueryActions.table.createdAtColumnTitle', { + defaultMessage: 'Created at', + }), + width: '200px', + render: renderTimestampColumn, + }, + { + name: i18n.translate('xpack.osquery.liveQueryActions.table.viewDetailsColumnTitle', { + defaultMessage: 'View details', + }), + actions: [ + { + render: renderActionsColumn, + }, + ], + }, + ], + [renderActionsColumn, renderAgentsColumn, renderQueryColumn, renderTimestampColumn] + ); + + const pagination = useMemo( () => ({ - ...pagination, - pageSizeOptions: [10, 50, 100], - onChangeItemsPerPage, - onChangePage, + pageIndex, + pageSize, + totalItemCount: actionsData?.totalCount ?? 0, + pageSizeOptions: [20, 50, 100], }), - [onChangeItemsPerPage, onChangePage, pagination] + [actionsData?.totalCount, pageIndex, pageSize] ); - useEffect(() => { - // @ts-expect-error update types - const newColumns = keys(actionsData?.actions[0]?.fields) - .sort() - .map((fieldName) => ({ - id: fieldName, - displayAsText: fieldName.split('.')[1], - defaultSortDirection: Direction.asc, - })); - - if (!isEqual(columns, newColumns)) { - setColumns(newColumns); - setVisibleColumns(map('id', newColumns)); - } - // @ts-expect-error update types - }, [columns, actionsData?.actions]); - - if (actionsLoading) { - return ; - } - return ( - // @ts-expect-error update types - // eslint-disable-next-line react-perf/jsx-no-new-array-as-prop - - - + ); }; diff --git a/x-pack/plugins/osquery/public/actions/helpers.ts b/x-pack/plugins/osquery/public/actions/helpers.ts index 802674ee0398c..171530a77299f 100644 --- a/x-pack/plugins/osquery/public/actions/helpers.ts +++ b/x-pack/plugins/osquery/public/actions/helpers.ts @@ -16,15 +16,14 @@ export type InspectResponse = Inspect & { response: string[] }; export const generateTablePaginationOptions = ( activePage: number, - limit: number, - isBucketSort?: boolean + limit: number ): PaginationInputPaginated => { const cursorStart = activePage * limit; return { activePage, cursorStart, fakePossibleCount: 4 <= activePage && activePage > 0 ? limit * (activePage + 2) : limit * 5, - querySize: isBucketSort ? limit : limit + cursorStart, + querySize: limit, }; }; diff --git a/x-pack/plugins/osquery/public/actions/use_action_details.ts b/x-pack/plugins/osquery/public/actions/use_action_details.ts index eb5317f6c40e0..2e5fa79cae992 100644 --- a/x-pack/plugins/osquery/public/actions/use_action_details.ts +++ b/x-pack/plugins/osquery/public/actions/use_action_details.ts @@ -5,8 +5,6 @@ * 2.0. */ -import deepEqual from 'fast-deep-equal'; -import { useEffect, useState } from 'react'; import { useQuery } from 'react-query'; import { createFilter } from '../common/helpers'; @@ -36,17 +34,20 @@ interface UseActionDetails { export const useActionDetails = ({ actionId, filterQuery, skip = false }: UseActionDetails) => { const { data } = useKibana().services; - const [actionDetailsRequest, setHostRequest] = useState(null); - - const response = useQuery( - ['action', { actionId }], + return useQuery( + ['actionDetails', { actionId, filterQuery }], async () => { - if (!actionDetailsRequest) return Promise.resolve(); - const responseData = await data.search - .search(actionDetailsRequest, { - strategy: 'osquerySearchStrategy', - }) + .search( + { + actionId, + factoryQueryType: OsqueryQueries.actionDetails, + filterQuery: createFilter(filterQuery), + }, + { + strategy: 'osquerySearchStrategy', + } + ) .toPromise(); return { @@ -55,24 +56,7 @@ export const useActionDetails = ({ actionId, filterQuery, skip = false }: UseAct }; }, { - enabled: !skip && !!actionDetailsRequest, + enabled: !skip, } ); - - useEffect(() => { - setHostRequest((prevRequest) => { - const myRequest = { - ...(prevRequest ?? {}), - actionId, - factoryQueryType: OsqueryQueries.actionDetails, - filterQuery: createFilter(filterQuery), - }; - if (!deepEqual(prevRequest, myRequest)) { - return myRequest; - } - return prevRequest; - }); - }, [actionId, filterQuery]); - - return response; }; diff --git a/x-pack/plugins/osquery/public/actions/use_all_actions.ts b/x-pack/plugins/osquery/public/actions/use_all_actions.ts index 2b76435efff0a..a58f45b8e99a2 100644 --- a/x-pack/plugins/osquery/public/actions/use_all_actions.ts +++ b/x-pack/plugins/osquery/public/actions/use_all_actions.ts @@ -5,9 +5,7 @@ * 2.0. */ -import { useEffect, useState } from 'react'; import { useQuery } from 'react-query'; -import deepEqual from 'fast-deep-equal'; import { createFilter } from '../common/helpers'; import { useKibana } from '../common/lib/kibana'; @@ -51,17 +49,24 @@ export const useAllActions = ({ }: UseAllActions) => { const { data } = useKibana().services; - const [actionsRequest, setHostRequest] = useState(null); - - const response = useQuery( + return useQuery( ['actions', { activePage, direction, limit, sortField }], async () => { - if (!actionsRequest) return Promise.resolve(); - const responseData = await data.search - .search(actionsRequest, { - strategy: 'osquerySearchStrategy', - }) + .search( + { + factoryQueryType: OsqueryQueries.actions, + filterQuery: createFilter(filterQuery), + pagination: generateTablePaginationOptions(activePage, limit), + sort: { + direction, + field: sortField, + }, + }, + { + strategy: 'osquerySearchStrategy', + } + ) .toPromise(); return { @@ -71,28 +76,8 @@ export const useAllActions = ({ }; }, { - enabled: !skip && !!actionsRequest, + keepPreviousData: true, + enabled: !skip, } ); - - useEffect(() => { - setHostRequest((prevRequest) => { - const myRequest = { - ...(prevRequest ?? {}), - factoryQueryType: OsqueryQueries.actions, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - sort: { - direction, - field: sortField, - }, - }; - if (!deepEqual(prevRequest, myRequest)) { - return myRequest; - } - return prevRequest; - }); - }, [activePage, direction, filterQuery, limit, sortField]); - - return response; }; diff --git a/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx b/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx new file mode 100644 index 0000000000000..549e70aa1f634 --- /dev/null +++ b/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLink } from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; + +import { pagePathGetters } from '../../../fleet/public'; +import { useKibana, isModifiedEvent, isLeftClickEvent } from '../common/lib/kibana'; +import { useAgentPolicy } from './use_agent_policy'; + +interface AgentsPolicyLinkProps { + policyId: string; +} + +const AgentsPolicyLinkComponent: React.FC = ({ policyId }) => { + const { + application: { getUrlForApp, navigateToApp }, + } = useKibana().services; + + const { data } = useAgentPolicy({ policyId }); + + const href = useMemo( + () => + getUrlForApp('fleet', { + path: `#` + pagePathGetters.policy_details({ policyId }), + }), + [getUrlForApp, policyId] + ); + + const handleClick = useCallback( + (event) => { + if (!isModifiedEvent(event) && isLeftClickEvent(event)) { + event.preventDefault(); + + return navigateToApp('fleet', { + path: `#` + pagePathGetters.policy_details({ policyId }), + }); + } + }, + [navigateToApp, policyId] + ); + + return ( + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {data?.name ?? policyId} + + ); +}; + +export const AgentsPolicyLink = React.memo(AgentsPolicyLinkComponent); diff --git a/x-pack/plugins/osquery/public/agent_policies/index.tsx b/x-pack/plugins/osquery/public/agent_policies/index.tsx new file mode 100644 index 0000000000000..c010c8f10f9b6 --- /dev/null +++ b/x-pack/plugins/osquery/public/agent_policies/index.tsx @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_agent_policies'; +export * from './use_agent_policy'; diff --git a/x-pack/plugins/osquery/public/agent_policies/use_agent_policies.ts b/x-pack/plugins/osquery/public/agent_policies/use_agent_policies.ts new file mode 100644 index 0000000000000..95323dd23f4d2 --- /dev/null +++ b/x-pack/plugins/osquery/public/agent_policies/use_agent_policies.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { useKibana } from '../common/lib/kibana'; +import { + agentPolicyRouteService, + GetAgentPoliciesResponse, + GetAgentPoliciesResponseItem, +} from '../../../fleet/common'; + +export const useAgentPolicies = () => { + const { http } = useKibana().services; + + return useQuery( + ['agentPolicies'], + () => + http.get(agentPolicyRouteService.getListPath(), { + query: { + perPage: 100, + }, + }), + { + initialData: { items: [], total: 0, page: 1, perPage: 100 }, + placeholderData: [], + keepPreviousData: true, + select: (response) => response.items, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts b/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts new file mode 100644 index 0000000000000..5fdc317d3f6f1 --- /dev/null +++ b/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { useKibana } from '../common/lib/kibana'; +import { agentPolicyRouteService } from '../../../fleet/common'; + +interface UseAgentPolicy { + policyId: string; + skip?: boolean; +} + +export const useAgentPolicy = ({ policyId, skip }: UseAgentPolicy) => { + const { http } = useKibana().services; + + return useQuery( + ['agentPolicy', { policyId }], + () => http.get(agentPolicyRouteService.getInfoPath(policyId)), + { + enabled: !skip, + keepPreviousData: true, + select: (response) => response.item, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/agents/agents_table.tsx b/x-pack/plugins/osquery/public/agents/agents_table.tsx index 38132957c341f..88e3bda7bac4b 100644 --- a/x-pack/plugins/osquery/public/agents/agents_table.tsx +++ b/x-pack/plugins/osquery/public/agents/agents_table.tsx @@ -5,8 +5,9 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { EuiComboBox, EuiHealth, EuiHighlight } from '@elastic/eui'; +import { find } from 'lodash/fp'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { EuiComboBox, EuiHealth, EuiHighlight, EuiSpacer } from '@elastic/eui'; import { useDebounce } from 'react-use'; import { useAllAgents } from './use_all_agents'; @@ -38,7 +39,7 @@ interface AgentsTableProps { const perPage = 10; const DEBOUNCE_DELAY = 100; // ms -const AgentsTableComponent: React.FC = ({ onChange }) => { +const AgentsTableComponent: React.FC = ({ agentSelection, onChange }) => { // search related const [searchValue, setSearchValue] = useState(''); const [modifyingSearch, setModifyingSearch] = useState(false); @@ -67,13 +68,34 @@ const AgentsTableComponent: React.FC = ({ onChange }) => { const [options, setOptions] = useState([]); const [selectedOptions, setSelectedOptions] = useState([]); const [numAgentsSelected, setNumAgentsSelected] = useState(0); + const defaultValueInitialized = useRef(false); + + useEffect(() => { + if (agentSelection && !defaultValueInitialized.current && options.length) { + if (agentSelection.policiesSelected) { + const policyOptions = find(['label', 'Policy'], options); + + if (policyOptions) { + const defaultOptions = policyOptions.options?.filter((option) => + agentSelection.policiesSelected.includes(option.label) + ); + + if (defaultOptions?.length) { + setSelectedOptions(defaultOptions); + } + defaultValueInitialized.current = true; + } + } + } + }, [agentSelection, options]); useEffect(() => { // update the groups when groups or agents have changed grouper.setTotalAgents(totalNumAgents); grouper.updateGroup(AGENT_GROUP_KEY.Platform, groups.platforms); grouper.updateGroup(AGENT_GROUP_KEY.Policy, groups.policies); - grouper.updateGroup(AGENT_GROUP_KEY.Agent, agents); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + grouper.updateGroup(AGENT_GROUP_KEY.Agent, agents!); const newOptions = grouper.generateOptions(); setOptions(newOptions); }, [groups.platforms, groups.policies, totalNumAgents, groupsLoading, agents, grouper]); @@ -134,8 +156,6 @@ const AgentsTableComponent: React.FC = ({ onChange }) => { return (
- {numAgentsSelected > 0 ? {generateSelectedAgentsMessage(numAgentsSelected)} : ''} -   = ({ onChange }) => { onChange={onSelection} renderOption={renderOption} /> + + {numAgentsSelected > 0 ? {generateSelectedAgentsMessage(numAgentsSelected)} : ''}
); }; diff --git a/x-pack/plugins/osquery/public/agents/helpers.ts b/x-pack/plugins/osquery/public/agents/helpers.ts index 14a8dd64fb4da..948e2a0ea50b0 100644 --- a/x-pack/plugins/osquery/public/agents/helpers.ts +++ b/x-pack/plugins/osquery/public/agents/helpers.ts @@ -159,15 +159,14 @@ export const generateAgentSelection = (selection: GroupOption[]) => { export const generateTablePaginationOptions = ( activePage: number, - limit: number, - isBucketSort?: boolean + limit: number ): PaginationInputPaginated => { const cursorStart = activePage * limit; return { activePage, cursorStart, fakePossibleCount: 4 <= activePage && activePage > 0 ? limit * (activePage + 2) : limit * 5, - querySize: isBucketSort ? limit : limit + cursorStart, + querySize: limit, }; }; diff --git a/x-pack/plugins/osquery/public/agents/use_agent_policies.ts b/x-pack/plugins/osquery/public/agents/use_agent_policies.ts index 3045423ccbe2d..c8b3ef064c038 100644 --- a/x-pack/plugins/osquery/public/agents/use_agent_policies.ts +++ b/x-pack/plugins/osquery/public/agents/use_agent_policies.ts @@ -5,13 +5,10 @@ * 2.0. */ +import { mapKeys } from 'lodash'; import { useQueries, UseQueryResult } from 'react-query'; import { useKibana } from '../common/lib/kibana'; -import { - AgentPolicy, - agentPolicyRouteService, - GetOneAgentPolicyResponse, -} from '../../../fleet/common'; +import { agentPolicyRouteService, GetOneAgentPolicyResponse } from '../../../fleet/common'; export const useAgentPolicies = (policyIds: string[] = []) => { const { http } = useKibana().services; @@ -26,13 +23,7 @@ export const useAgentPolicies = (policyIds: string[] = []) => { const agentPoliciesLoading = agentResponse.some((p) => p.isLoading); const agentPolicies = agentResponse.map((p) => p.data?.item); - const agentPolicyById = agentPolicies.reduce((acc, p) => { - if (!p) { - return acc; - } - acc[p.id] = p; - return acc; - }, {} as { [key: string]: AgentPolicy }); + const agentPolicyById = mapKeys(agentPolicies, 'id'); return { agentPoliciesLoading, agentPolicies, agentPolicyById }; }; diff --git a/x-pack/plugins/osquery/public/agents/use_agent_status.ts b/x-pack/plugins/osquery/public/agents/use_agent_status.ts new file mode 100644 index 0000000000000..c26adb908f6be --- /dev/null +++ b/x-pack/plugins/osquery/public/agents/use_agent_status.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { GetAgentStatusResponse, agentRouteService } from '../../../fleet/common'; +import { useKibana } from '../common/lib/kibana'; + +interface UseAgentStatus { + policyId?: string; + skip?: boolean; +} + +export const useAgentStatus = ({ policyId, skip }: UseAgentStatus) => { + const { http } = useKibana().services; + + return useQuery( + ['agentStatus', policyId], + () => + http.get( + agentRouteService.getStatusPath(), + policyId + ? { + query: { + policyId, + }, + } + : {} + ), + { + enabled: !skip, + select: (response) => response.results, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/agents/use_all_agents.ts b/x-pack/plugins/osquery/public/agents/use_all_agents.ts index bd9b1c32412e6..4086175046c1c 100644 --- a/x-pack/plugins/osquery/public/agents/use_all_agents.ts +++ b/x-pack/plugins/osquery/public/agents/use_all_agents.ts @@ -7,6 +7,7 @@ import { useQuery } from 'react-query'; +import { GetAgentsResponse, agentRouteService } from '../../../fleet/common'; import { useKibana } from '../common/lib/kibana'; interface UseAllAgents { @@ -27,14 +28,14 @@ export const useAllAgents = ( ) => { const { perPage } = opts; const { http } = useKibana().services; - const { isLoading: agentsLoading, data: agentData } = useQuery( + const { isLoading: agentsLoading, data: agentData } = useQuery( ['agents', osqueryPolicies, searchValue, perPage], - async () => { + () => { let kuery = `(${osqueryPolicies.map((p) => `policy_id:${p}`).join(' or ')})`; if (searchValue) { kuery += ` and (local_metadata.host.hostname:/${searchValue}/ or local_metadata.elastic.agent.id:/${searchValue}/)`; } - return await http.get('/api/fleet/agents', { + return http.get(agentRouteService.getListPath(), { query: { kuery, perPage, diff --git a/x-pack/plugins/osquery/public/agents/use_osquery_policies.ts b/x-pack/plugins/osquery/public/agents/use_osquery_policies.ts index f786e9167d2f8..2937c57b50a3d 100644 --- a/x-pack/plugins/osquery/public/agents/use_osquery_policies.ts +++ b/x-pack/plugins/osquery/public/agents/use_osquery_policies.ts @@ -7,20 +7,20 @@ import { useQuery } from 'react-query'; import { useKibana } from '../common/lib/kibana'; -import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../fleet/common'; +import { packagePolicyRouteService, PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../fleet/common'; +import { OSQUERY_INTEGRATION_NAME } from '../../common'; export const useOsqueryPolicies = () => { const { http } = useKibana().services; const { isLoading: osqueryPoliciesLoading, data: osqueryPolicies } = useQuery( ['osqueryPolicies'], - async () => { - return await http.get('/api/fleet/package_policies', { + () => + http.get(packagePolicyRouteService.getListPath(), { query: { - kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:osquery_manager`, + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${OSQUERY_INTEGRATION_NAME}`, }, - }); - }, + }), { select: (data) => data.items.map((p: { policy_id: string }) => p.policy_id) } ); diff --git a/x-pack/plugins/osquery/public/application.tsx b/x-pack/plugins/osquery/public/application.tsx index d72a788b16245..3e959132e21a8 100644 --- a/x-pack/plugins/osquery/public/application.tsx +++ b/x-pack/plugins/osquery/public/application.tsx @@ -13,7 +13,7 @@ import ReactDOM from 'react-dom'; import { Router } from 'react-router-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { ThemeProvider } from 'styled-components'; -import { QueryClient, QueryClientProvider } from 'react-query'; +import { QueryClientProvider } from 'react-query'; import { ReactQueryDevtools } from 'react-query/devtools'; import { useUiSetting$ } from '../../../../src/plugins/kibana_react/public'; @@ -23,8 +23,7 @@ import { AppPluginStartDependencies } from './types'; import { OsqueryApp } from './components/app'; import { DEFAULT_DARK_MODE, PLUGIN_NAME } from '../common'; import { KibanaContextProvider } from './common/lib/kibana'; - -const queryClient = new QueryClient(); +import { queryClient } from './query_client'; const OsqueryAppContext = () => { const [darkMode] = useUiSetting$(DEFAULT_DARK_MODE); diff --git a/x-pack/plugins/osquery/public/common/hooks/index.tsx b/x-pack/plugins/osquery/public/common/hooks/index.tsx new file mode 100644 index 0000000000000..750e09b44d89b --- /dev/null +++ b/x-pack/plugins/osquery/public/common/hooks/index.tsx @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_discover_link'; +export * from './use_osquery_integration'; diff --git a/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx b/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx new file mode 100644 index 0000000000000..660ef87fb57e3 --- /dev/null +++ b/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import type { ChromeBreadcrumb } from 'src/core/public'; + +import { BASE_PATH } from '../../../common/constants'; +import type { Page, DynamicPagePathValues } from '../page_paths'; +import { pagePathGetters } from '../page_paths'; + +import { useKibana } from '../lib/kibana'; + +const BASE_BREADCRUMB: ChromeBreadcrumb = { + href: pagePathGetters.overview(), + text: i18n.translate('xpack.osquery.breadcrumbs.appTitle', { + defaultMessage: 'Osquery', + }), +}; + +const breadcrumbGetters: { + [key in Page]?: (values: DynamicPagePathValues) => ChromeBreadcrumb[]; +} = { + base: () => [BASE_BREADCRUMB], + overview: () => [ + BASE_BREADCRUMB, + { + text: i18n.translate('xpack.osquery.breadcrumbs.overviewPageTitle', { + defaultMessage: 'Overview', + }), + }, + ], + live_queries: () => [ + BASE_BREADCRUMB, + { + text: i18n.translate('xpack.osquery.breadcrumbs.liveQueriesPageTitle', { + defaultMessage: 'Live queries', + }), + }, + ], + live_query_new: () => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.live_queries(), + text: i18n.translate('xpack.osquery.breadcrumbs.liveQueriesPageTitle', { + defaultMessage: 'Live queries', + }), + }, + { + text: i18n.translate('xpack.osquery.breadcrumbs.newLiveQueryPageTitle', { + defaultMessage: 'New', + }), + }, + ], + live_query_details: ({ liveQueryId }) => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.live_queries(), + text: i18n.translate('xpack.osquery.breadcrumbs.liveQueriesPageTitle', { + defaultMessage: 'Live queries', + }), + }, + { + text: liveQueryId, + }, + ], + scheduled_query_groups: () => [ + BASE_BREADCRUMB, + { + text: i18n.translate('xpack.osquery.breadcrumbs.scheduledQueryGroupsPageTitle', { + defaultMessage: 'Scheduled query groups', + }), + }, + ], + scheduled_query_group_add: () => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.scheduled_query_groups(), + text: i18n.translate('xpack.osquery.breadcrumbs.scheduledQueryGroupsPageTitle', { + defaultMessage: 'Scheduled query groups', + }), + }, + { + text: i18n.translate('xpack.osquery.breadcrumbs.addScheduledQueryGroupsPageTitle', { + defaultMessage: 'Add', + }), + }, + ], + scheduled_query_group_details: ({ scheduledQueryGroupName }) => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.scheduled_query_groups(), + text: i18n.translate('xpack.osquery.breadcrumbs.scheduledQueryGroupsPageTitle', { + defaultMessage: 'Scheduled query groups', + }), + }, + { + text: scheduledQueryGroupName, + }, + ], + scheduled_query_group_edit: ({ scheduledQueryGroupName, scheduledQueryGroupId }) => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.scheduled_query_groups(), + text: i18n.translate('xpack.osquery.breadcrumbs.scheduledQueryGroupsPageTitle', { + defaultMessage: 'Scheduled query groups', + }), + }, + { + href: pagePathGetters.scheduled_query_group_details({ scheduledQueryGroupId }), + text: scheduledQueryGroupName, + }, + { + text: i18n.translate('xpack.osquery.breadcrumbs.editScheduledQueryGroupsPageTitle', { + defaultMessage: 'Edit', + }), + }, + ], +}; + +export function useBreadcrumbs(page: Page, values: DynamicPagePathValues = {}) { + const { chrome, http } = useKibana().services; + const breadcrumbs: ChromeBreadcrumb[] = + breadcrumbGetters[page]?.(values).map((breadcrumb) => ({ + ...breadcrumb, + href: breadcrumb.href ? http.basePath.prepend(`${BASE_PATH}${breadcrumb.href}`) : undefined, + })) || []; + const docTitle: string[] = [...breadcrumbs] + .reverse() + .map((breadcrumb) => breadcrumb.text as string); + chrome.docTitle.change(docTitle); + chrome.setBreadcrumbs(breadcrumbs); +} diff --git a/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx b/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx new file mode 100644 index 0000000000000..dd091d80ce62e --- /dev/null +++ b/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useEffect, useState } from 'react'; + +import { FilterStateStore } from '../../../../../../src/plugins/data/common'; +import { useKibana, isModifiedEvent, isLeftClickEvent } from '../lib/kibana'; + +interface UseDiscoverLink { + filters: Array<{ key: string; value: string | number }>; +} + +export const useDiscoverLink = ({ filters }: UseDiscoverLink) => { + const { + application: { navigateToUrl }, + } = useKibana().services; + const urlGenerator = useKibana().services.discover?.urlGenerator; + const [discoverUrl, setDiscoverUrl] = useState(''); + + useEffect(() => { + const getDiscoverUrl = async () => { + if (!urlGenerator?.createUrl) return; + + const newUrl = await urlGenerator.createUrl({ + indexPatternId: 'logs-*', + filters: filters.map((filter) => ({ + meta: { + index: 'logs-*', + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key: filter.key, + params: { query: filter.value }, + }, + query: { match_phrase: { action_id: filter.value } }, + $state: { store: FilterStateStore.APP_STATE }, + })), + }); + setDiscoverUrl(newUrl); + }; + getDiscoverUrl(); + }, [filters, urlGenerator]); + + const onClick = useCallback( + (event: React.MouseEvent) => { + if (!isModifiedEvent(event) && isLeftClickEvent(event) && discoverUrl) { + event.preventDefault(); + + return navigateToUrl(discoverUrl); + } + }, + [discoverUrl, navigateToUrl] + ); + + return { + href: discoverUrl, + onClick, + }; +}; diff --git a/x-pack/plugins/osquery/public/common/hooks/use_osquery_integration.tsx b/x-pack/plugins/osquery/public/common/hooks/use_osquery_integration.tsx new file mode 100644 index 0000000000000..d8bed30b969ad --- /dev/null +++ b/x-pack/plugins/osquery/public/common/hooks/use_osquery_integration.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { find } from 'lodash/fp'; +import { useQuery } from 'react-query'; + +import { GetPackagesResponse, epmRouteService } from '../../../../fleet/common'; +import { OSQUERY_INTEGRATION_NAME } from '../../../common'; +import { useKibana } from '../lib/kibana'; + +export const useOsqueryIntegration = () => { + const { http } = useKibana().services; + + return useQuery( + 'integrations', + () => + http.get(epmRouteService.getListPath(), { + query: { + experimental: true, + }, + }), + { + select: ({ response }: GetPackagesResponse) => + find(['name', OSQUERY_INTEGRATION_NAME], response), + } + ); +}; diff --git a/x-pack/plugins/osquery/public/common/lib/kibana/kibana_react.ts b/x-pack/plugins/osquery/public/common/lib/kibana/kibana_react.ts index 63288507b29d4..dc49bfcee6dda 100644 --- a/x-pack/plugins/osquery/public/common/lib/kibana/kibana_react.ts +++ b/x-pack/plugins/osquery/public/common/lib/kibana/kibana_react.ts @@ -5,6 +5,7 @@ * 2.0. */ +import React from 'react'; import { useHistory } from 'react-router-dom'; import { KibanaContextProvider, @@ -24,6 +25,11 @@ export interface WithKibanaProps { const useTypedKibana = () => useKibana(); +const isModifiedEvent = (event: React.MouseEvent) => + !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); + +const isLeftClickEvent = (event: React.MouseEvent) => event.button === 0; + const useRouterNavigate = ( to: Parameters[1], onClickCallback?: Parameters[2] @@ -35,6 +41,8 @@ const useRouterNavigate = ( export { KibanaContextProvider, useRouterNavigate, + isLeftClickEvent, + isModifiedEvent, useTypedKibana as useKibana, useUiSetting, useUiSetting$, diff --git a/x-pack/plugins/osquery/public/common/page_paths.ts b/x-pack/plugins/osquery/public/common/page_paths.ts new file mode 100644 index 0000000000000..b4c7963fb9a02 --- /dev/null +++ b/x-pack/plugins/osquery/public/common/page_paths.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type StaticPage = + | 'base' + | 'overview' + | 'live_queries' + | 'live_query_new' + | 'scheduled_query_groups' + | 'scheduled_query_group_add'; + +export type DynamicPage = + | 'live_query_details' + | 'scheduled_query_group_details' + | 'scheduled_query_group_edit'; + +export type Page = StaticPage | DynamicPage; + +export interface DynamicPagePathValues { + [key: string]: string; +} + +export const BASE_PATH = '/app/fleet'; + +// If routing paths are changed here, please also check to see if +// `pagePathGetters()`, below, needs any modifications +export const PAGE_ROUTING_PATHS = { + overview: '/', + live_queries: '/live_queries', + live_query_new: '/live_queries/new', + live_query_details: '/live_queries/:liveQueryId', + scheduled_query_groups: '/scheduled_query_groups', + scheduled_query_group_add: '/scheduled_query_groups/add', + scheduled_query_group_details: '/scheduled_query_groups/:scheduledQueryGroupId', + scheduled_query_group_edit: '/scheduled_query_groups/:scheduledQueryGroupId/edit', +}; + +export const pagePathGetters: { + [key in StaticPage]: () => string; +} & + { + [key in DynamicPage]: (values: DynamicPagePathValues) => string; + } = { + base: () => '/', + overview: () => '/', + live_queries: () => '/live_queries', + live_query_new: () => '/live_queries/new', + live_query_details: ({ liveQueryId }) => `/live_queries/${liveQueryId}`, + scheduled_query_groups: () => '/scheduled_query_groups', + scheduled_query_group_add: () => '/scheduled_query_groups/add', + scheduled_query_group_details: ({ scheduledQueryGroupId }) => + `/scheduled_query_groups/${scheduledQueryGroupId}`, + scheduled_query_group_edit: ({ scheduledQueryGroupId }) => + `/scheduled_query_groups/${scheduledQueryGroupId}/edit`, +}; diff --git a/x-pack/plugins/osquery/public/components/app.tsx b/x-pack/plugins/osquery/public/components/app.tsx index a4a1f51fdd02b..d56aacc99ad53 100644 --- a/x-pack/plugins/osquery/public/components/app.tsx +++ b/x-pack/plugins/osquery/public/components/app.tsx @@ -7,14 +7,15 @@ import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFlexGroup, EuiFlexItem, EuiTabs, EuiTab } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiTabs, EuiTab } from '@elastic/eui'; import { useLocation } from 'react-router-dom'; import { Container, Nav, Wrapper } from './layouts'; import { OsqueryAppRoutes } from '../routes'; import { useRouterNavigate } from '../common/lib/kibana'; +import { ManageIntegrationLink } from './manage_integration_link'; -export const OsqueryAppComponent = () => { +const OsqueryAppComponent = () => { const location = useLocation(); const section = useMemo(() => location.pathname.split('/')[1] ?? 'overview', [location.pathname]); @@ -25,20 +26,49 @@ export const OsqueryAppComponent = () => { - + {/* + */} + + - + + + + + + + + + + + diff --git a/x-pack/plugins/osquery/public/components/beta_badge.tsx b/x-pack/plugins/osquery/public/components/beta_badge.tsx new file mode 100644 index 0000000000000..f63c80168b487 --- /dev/null +++ b/x-pack/plugins/osquery/public/components/beta_badge.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiBetaBadge, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import styled from 'styled-components'; + +export const BetaBadgeRowWrapper = styled(EuiText)` + display: flex; + align-items: center; +`; + +const Wrapper = styled.div` + padding-left: ${({ theme }) => theme.eui.paddingSizes.s}; +`; + +const betaBadgeLabel = i18n.translate('xpack.osquery.common.tabBetaBadgeLabel', { + defaultMessage: 'Beta', +}); + +const betaBadgeTooltipContent = i18n.translate('xpack.osquery.common.tabBetaBadgeTooltipContent', { + defaultMessage: + 'This feature is under active development. Extra functionality is coming, and some functionality may change.', +}); + +const BetaBadgeComponent = () => ( + + + +); + +export const BetaBadge = React.memo(BetaBadgeComponent); diff --git a/x-pack/plugins/osquery/public/components/manage_integration_link.tsx b/x-pack/plugins/osquery/public/components/manage_integration_link.tsx new file mode 100644 index 0000000000000..db201611baed5 --- /dev/null +++ b/x-pack/plugins/osquery/public/components/manage_integration_link.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useMemo } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiButtonEmpty, EuiFlexItem } from '@elastic/eui'; + +import { pagePathGetters } from '../../../fleet/public'; + +import { useKibana, isModifiedEvent, isLeftClickEvent } from '../common/lib/kibana'; +import { useOsqueryIntegration } from '../common/hooks'; + +const ManageIntegrationLinkComponent = () => { + const { + application: { + getUrlForApp, + navigateToApp, + capabilities: { + osquery: { save: hasSaveUICapabilities }, + }, + }, + } = useKibana().services; + const { data: osqueryIntegration } = useOsqueryIntegration(); + + const integrationHref = useMemo(() => { + if (osqueryIntegration) { + return getUrlForApp('fleet', { + path: + '#' + + pagePathGetters.integration_details_policies({ + pkgkey: `${osqueryIntegration.name}-${osqueryIntegration.version}`, + }), + }); + } + }, [getUrlForApp, osqueryIntegration]); + + const integrationClick = useCallback( + (event) => { + if (!isModifiedEvent(event) && isLeftClickEvent(event)) { + event.preventDefault(); + if (osqueryIntegration) { + return navigateToApp('fleet', { + path: + '#' + + pagePathGetters.integration_details_policies({ + pkgkey: `${osqueryIntegration.name}-${osqueryIntegration.version}`, + }), + }); + } + } + }, + [navigateToApp, osqueryIntegration] + ); + + return hasSaveUICapabilities && integrationHref ? ( + + { + // eslint-disable-next-line @elastic/eui/href-or-on-click + + + + } + + ) : null; +}; + +export const ManageIntegrationLink = React.memo(ManageIntegrationLinkComponent); diff --git a/x-pack/plugins/osquery/public/editor/index.tsx b/x-pack/plugins/osquery/public/editor/index.tsx index 4cdb027480f98..70da55ca3f007 100644 --- a/x-pack/plugins/osquery/public/editor/index.tsx +++ b/x-pack/plugins/osquery/public/editor/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React from 'react'; import { EuiCodeEditor } from '@elastic/eui'; import 'brace/theme/tomorrow'; @@ -22,30 +22,27 @@ const EDITOR_PROPS = { interface OsqueryEditorProps { defaultValue: string; + disabled?: boolean; onChange: (newValue: string) => void; } -const OsqueryEditorComponent: React.FC = ({ defaultValue, onChange }) => { - const handleChange = useCallback( - (newValue) => { - onChange(newValue); - }, - [onChange] - ); - - return ( - - ); -}; +const OsqueryEditorComponent: React.FC = ({ + defaultValue, + // disabled, + onChange, +}) => ( + +); export const OsqueryEditor = React.memo(OsqueryEditorComponent); diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/add_new_query_flyout.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/add_new_query_flyout.tsx deleted file mode 100644 index b02b3d288256e..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/add_new_query_flyout.tsx +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/jsx-no-bind */ - -/* eslint-disable react-perf/jsx-no-new-function-as-prop */ - -import { produce } from 'immer'; -import { EuiFlyout, EuiTitle, EuiFlyoutBody, EuiFlyoutHeader, EuiPortal } from '@elastic/eui'; -import React from 'react'; - -import { AddPackQueryForm } from '../../packs/common/add_pack_query'; - -// @ts-expect-error update types -export const AddNewQueryFlyout = ({ data, handleChange, onClose }) => { - // @ts-expect-error update types - const handleSubmit = (payload) => { - // @ts-expect-error update types - const updatedPolicy = produce(data, (draft) => { - draft.inputs[0].streams.push({ - data_stream: { - type: 'logs', - dataset: 'osquery_elastic_managed.osquery', - }, - vars: { - query: { - type: 'text', - value: payload.query.attributes.query, - }, - interval: { - type: 'text', - value: `${payload.interval}`, - }, - id: { - type: 'text', - value: payload.query.id, - }, - }, - enabled: true, - }); - }); - - onClose(); - handleChange({ - isValid: true, - updatedPolicy, - }); - }; - - return ( - - - - -

Attach next query

-
-
- - - -
-
- ); -}; diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/custom_tab_tabs.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/custom_tab_tabs.tsx deleted file mode 100644 index 9d2df5bbb0960..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/custom_tab_tabs.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useMemo } from 'react'; -import { useLocation } from 'react-router-dom'; -import qs from 'query-string'; - -import { Queries } from '../../queries'; -import { Packs } from '../../packs'; -import { LiveQuery } from '../../live_query'; - -const CustomTabTabsComponent = () => { - const location = useLocation(); - - const selectedTab = useMemo(() => qs.parse(location.search)?.tab, [location.search]); - - if (selectedTab === 'packs') { - return ; - } - - if (selectedTab === 'saved_queries') { - return ; - } - - if (selectedTab === 'live_query') { - return ; - } - - return ; -}; - -export const CustomTabTabs = React.memo(CustomTabTabsComponent); diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/form.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/form.tsx deleted file mode 100644 index bb9bf066a9f92..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/form.tsx +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable @typescript-eslint/naming-convention */ - -import produce from 'immer'; -import { find } from 'lodash/fp'; -import { EuiSpacer, EuiText, EuiHorizontalRule, EuiSuperSelect } from '@elastic/eui'; -import React, { useCallback, useMemo } from 'react'; -import deepEqual from 'fast-deep-equal'; -import { useQuery } from 'react-query'; - -import { - // UseField, - useForm, - useFormData, - UseArray, - getUseField, - Field, - ToggleField, - Form, -} from '../../shared_imports'; - -// import { OsqueryStreamField } from '../../scheduled_query/common/osquery_stream_field'; -import { useKibana } from '../../common/lib/kibana'; -import { ScheduledQueryQueriesTable } from './scheduled_queries_table'; -import { schema } from './schema'; - -const CommonUseField = getUseField({ component: Field }); - -const EDIT_SCHEDULED_QUERY_FORM_ID = 'editScheduledQueryForm'; - -interface EditScheduledQueryFormProps { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data: Array>; - handleSubmit: () => Promise; -} - -const EditScheduledQueryFormComponent: React.FC = ({ - data, - handleSubmit, -}) => { - const { http } = useKibana().services; - - const { - data: { saved_objects: packs } = { - saved_objects: [], - }, - } = useQuery('packs', () => http.get('/internal/osquery/pack')); - - const { form } = useForm({ - id: EDIT_SCHEDULED_QUERY_FORM_ID, - onSubmit: handleSubmit, - schema, - defaultValue: data, - options: { - stripEmptyFields: false, - }, - // @ts-expect-error update types - deserializer: (payload) => { - const deserialized = produce(payload, (draft) => { - // @ts-expect-error update types - draft.streams = draft.inputs[0].streams.map(({ data_stream, enabled, vars }) => ({ - data: { - data_stream, - enabled, - vars, - }, - })); - }); - - return deserialized; - }, - // @ts-expect-error update types - serializer: (payload) => { - const serialized = produce(payload, (draft) => { - // @ts-expect-error update types - if (draft.inputs) { - // @ts-expect-error update types - draft.inputs[0].config = { - pack: { - type: 'id', - value: 'e33f5f30-705e-11eb-9e99-9f6b4d0d9506', - }, - }; - // @ts-expect-error update types - draft.inputs[0].type = 'osquery'; - // @ts-expect-error update types - draft.inputs[0].streams = draft.inputs[0].streams?.map((stream) => stream.data) ?? []; - } - }); - - return serialized; - }, - }); - - const { setFieldValue } = form; - - const handlePackChange = useCallback( - (value) => { - const newPack = find(['id', value], packs); - - setFieldValue( - 'streams', - // @ts-expect-error update types - newPack.queries.map((packQuery, index) => ({ - id: index, - isNew: true, - path: `streams[${index}]`, - data: { - data_stream: { - type: 'logs', - dataset: 'osquery_elastic_managed.osquery', - }, - id: 'osquery-osquery_elastic_managed.osquery-7065c2dc-f835-4d13-9486-6eec515f39bd', - vars: { - query: { - type: 'text', - value: packQuery.query, - }, - interval: { - type: 'text', - value: `${packQuery.interval}`, - }, - id: { - type: 'text', - value: packQuery.id, - }, - }, - enabled: true, - }, - })) - ); - }, - [packs, setFieldValue] - ); - - const [formData] = useFormData({ form, watch: ['streams'] }); - - const scheduledQueries = useMemo(() => { - if (formData.inputs) { - // @ts-expect-error update types - return formData.streams.reduce((acc, stream) => { - if (!stream.data) { - return acc; - } - - return [...acc, stream.data]; - }, []); - } - - return []; - }, [formData]); - - return ( -
- ({ - value: pack.id, - inputDisplay: ( - <> - {pack.name} - -

{pack.description}

-
- - ), - }))} - valueOfSelected={packs[0]?.id} - onChange={handlePackChange} - /> - - - - - - { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - ({ items, form: streamsForm, addItem, removeItem }) => { - return ( - <> - {/* {items.map((item) => { - return ( - removeItem(item.id)} - // readDefaultValueOnForm={true} - defaultValue={ - item.isNew - ? // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop - { - data_stream: { - type: 'logs', - dataset: 'osquery_elastic_managed.osquery', - }, - vars: { - query: { - type: 'text', - value: 'select * from uptime', - }, - interval: { - type: 'text', - value: '120', - }, - id: { - type: 'text', - value: uuid.v4(), - }, - }, - enabled: true, - } - : get(item.path, streamsForm.getFormData()) - } - /> - ); - })} */} - {/* - {'Add query'} - */} - - ); - } - } - - - ); -}; - -export const EditScheduledQueryForm = React.memo( - EditScheduledQueryFormComponent, - (prevProps, nextProps) => deepEqual(prevProps.data, nextProps.data) -); diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/input_stream_form.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/input_stream_form.tsx deleted file mode 100644 index 34508c93e73bd..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/input_stream_form.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; - -import { useForm, Form, getUseField, Field, FIELD_TYPES } from '../../shared_imports'; - -const CommonUseField = getUseField({ component: Field }); - -const FORM_ID = 'inputStreamForm'; - -const schema = { - data_stream: { - dataset: { - type: FIELD_TYPES.TEXT, - }, - type: { - type: FIELD_TYPES.TEXT, - }, - }, - enabled: { - type: FIELD_TYPES.TOGGLE, - label: 'Active', - }, - id: { - type: FIELD_TYPES.TEXT, - }, - vars: { - id: { - type: { - type: FIELD_TYPES.TEXT, - }, - value: { type: FIELD_TYPES.TEXT }, - }, - interval: { - type: { - type: FIELD_TYPES.TEXT, - }, - value: { type: FIELD_TYPES.TEXT }, - }, - query: { - type: { - type: FIELD_TYPES.TEXT, - }, - value: { type: FIELD_TYPES.TEXT }, - }, - }, -}; - -// @ts-expect-error update types -const InputStreamFormComponent = ({ data }) => { - const { form } = useForm({ - id: FORM_ID, - schema, - defaultValue: data, - }); - - return ( -
- - - ); -}; - -export const InputStreamForm = React.memo(InputStreamFormComponent); diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/input_type.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/input_type.tsx deleted file mode 100644 index 4a4e2a799ae42..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/input_type.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react-perf/jsx-no-new-object-as-prop */ - -/* eslint-disable react-perf/jsx-no-new-array-as-prop */ - -import React, { useCallback } from 'react'; -import produce from 'immer'; -import { EuiRadioGroup } from '@elastic/eui'; - -// @ts-expect-error update types -export const ScheduledQueryInputType = ({ data, handleChange }) => { - const radios = [ - { - id: 'pack', - label: 'Pack', - }, - { - id: 'saved_queries', - label: 'Saved queries', - }, - ]; - - const onChange = useCallback( - (optionId: string) => { - // @ts-expect-error update types - const updatedPolicy = produce(data, (draft) => { - if (!draft.inputs[0].config) { - draft.inputs[0].config = { - input_source: { - type: 'text', - value: optionId, - }, - }; - } else { - draft.inputs[0].config.input_source.value = optionId; - } - }); - - handleChange({ - isValid: true, - updatedPolicy, - }); - }, - [data, handleChange] - ); - - return ( - {'Choose input type'}, - }} - /> - ); -}; diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/navigation.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/navigation.tsx deleted file mode 100644 index 5f5d5c0c8b546..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/navigation.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { snakeCase } from 'lodash/fp'; -import { EuiIcon, EuiSideNav } from '@elastic/eui'; -import React, { useCallback, useMemo } from 'react'; -import { useHistory, useLocation } from 'react-router-dom'; -import qs from 'query-string'; - -export const Navigation = () => { - const { push } = useHistory(); - const location = useLocation(); - - const selectedItemName = useMemo(() => qs.parse(location.search)?.tab, [location.search]); - - const handleTabClick = useCallback( - (tab) => { - push({ - search: qs.stringify({ tab }), - }); - }, - [push] - ); - - const createItem = useCallback( - (name, data = {}) => ({ - ...data, - id: snakeCase(name), - name, - isSelected: selectedItemName === name, - onClick: () => handleTabClick(snakeCase(name)), - }), - [handleTabClick, selectedItemName] - ); - - const sideNav = useMemo( - () => [ - createItem('Packs', { - forceOpen: true, - items: [ - createItem('List', { - icon: , - }), - createItem('New pack', { - icon: , - }), - ], - }), - createItem('Saved Queries', { - forceOpen: true, - items: [ - createItem('List', { - icon: , - }), - createItem('New query', { - icon: , - }), - ], - }), - // createItem('Scheduled Queries', { - // forceOpen: true, - // items: [ - // createItem('List', { - // icon: , - // }), - // createItem('Schedule new query', { - // icon: , - // }), - // ], - // }), - createItem('Live Query', { - forceOpen: true, - items: [ - createItem('Run', { - icon: , - }), - createItem('History', { - icon: , - }), - ], - }), - ], - [createItem] - ); - - // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop - return ; -}; diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/pack_selector.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/pack_selector.tsx deleted file mode 100644 index 7d3f7debace72..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/pack_selector.tsx +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react/jsx-no-bind */ - -/* eslint-disable react-perf/jsx-no-new-function-as-prop */ - -import { find } from 'lodash/fp'; -import { produce } from 'immer'; -import { EuiText, EuiSuperSelect } from '@elastic/eui'; -import React from 'react'; -import { useQuery } from 'react-query'; - -import { useKibana } from '../../common/lib/kibana'; - -// @ts-expect-error update types -export const ScheduledQueryPackSelector = ({ data, handleChange }) => { - const { http } = useKibana().services; - const { - data: { saved_objects: packs } = { - saved_objects: [], - }, - } = useQuery('packs', () => http.get('/internal/osquery/pack')); - - // @ts-expect-error update types - const handlePackChange = (value) => { - const newPack = find(['id', value], packs); - - // @ts-expect-error update types - const updatedPolicy = produce(data, (draft) => { - draft.inputs[0].config.pack = { - type: 'text', - value: newPack.id, - }; - // @ts-expect-error update types - draft.inputs[0].streams = newPack.queries.map((packQuery) => ({ - data_stream: { - type: 'logs', - dataset: 'osquery_elastic_managed.osquery', - }, - vars: { - query: { - type: 'text', - value: packQuery.query, - }, - interval: { - type: 'text', - value: `${packQuery.interval}`, - }, - id: { - type: 'text', - value: packQuery.id, - }, - }, - enabled: true, - })); - }); - - handleChange({ - isValid: true, - updatedPolicy, - }); - }; - - return ( - ({ - value: pack.id, - inputDisplay: ( - <> - {pack.name} - -

{pack.description}

-
- - ), - }))} - valueOfSelected={data.inputs[0].config} - onChange={handlePackChange} - /> - ); -}; diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/scheduled_queries_table.tsx b/x-pack/plugins/osquery/public/fleet_integration/components/scheduled_queries_table.tsx deleted file mode 100644 index 67a94ec518d60..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/scheduled_queries_table.tsx +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react-perf/jsx-no-new-function-as-prop */ - -/* eslint-disable react/jsx-no-bind */ - -/* eslint-disable react-perf/jsx-no-new-object-as-prop */ - -/* eslint-disable react/display-name */ - -/* eslint-disable react-perf/jsx-no-new-array-as-prop */ - -import React, { useState } from 'react'; -import { - EuiBasicTable, - EuiButtonIcon, - EuiHealth, - EuiDescriptionList, - RIGHT_ALIGNMENT, -} from '@elastic/eui'; - -// @ts-expect-error update types -export const ScheduledQueryQueriesTable = ({ data }) => { - const [pageIndex, setPageIndex] = useState(0); - const [pageSize, setPageSize] = useState(5); - const [sortField, setSortField] = useState('firstName'); - const [sortDirection, setSortDirection] = useState('asc'); - const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState({}); - - const onTableChange = ({ page = {}, sort = {} }) => { - // @ts-expect-error update types - const { index, size } = page; - // @ts-expect-error update types - const { field, direction } = sort; - - setPageIndex(index); - setPageSize(size); - setSortField(field); - setSortDirection(direction); - }; - - // @ts-expect-error update types - const toggleDetails = (item) => { - const itemIdToExpandedRowMapValues = { ...itemIdToExpandedRowMap }; - // @ts-expect-error update types - if (itemIdToExpandedRowMapValues[item.id]) { - // @ts-expect-error update types - delete itemIdToExpandedRowMapValues[item.id]; - } else { - const { online } = item; - const color = online ? 'success' : 'danger'; - const label = online ? 'Online' : 'Offline'; - const listItems = [ - { - title: 'Online', - description: {label}, - }, - ]; - // @ts-expect-error update types - itemIdToExpandedRowMapValues[item.id] = ; - } - setItemIdToExpandedRowMap(itemIdToExpandedRowMapValues); - }; - - const columns = [ - { - field: 'vars.id.value', - name: 'ID', - }, - { - field: 'vars.interval.value', - name: 'Interval', - }, - { - field: 'enabled', - name: 'Active', - }, - { - name: 'Actions', - actions: [ - { - name: 'Clone', - description: 'Clone this person', - type: 'icon', - icon: 'copy', - onClick: () => '', - }, - ], - }, - { - align: RIGHT_ALIGNMENT, - width: '40px', - isExpander: true, - // @ts-expect-error update types - render: (item) => ( - toggleDetails(item)} - // @ts-expect-error update types - aria-label={itemIdToExpandedRowMap[item.id] ? 'Collapse' : 'Expand'} - // @ts-expect-error update types - iconType={itemIdToExpandedRowMap[item.id] ? 'arrowUp' : 'arrowDown'} - /> - ), - }, - ]; - - const pagination = { - pageIndex, - pageSize, - totalItemCount: data.inputs[0].streams.length, - pageSizeOptions: [3, 5, 8], - }; - - const sorting = { - sort: { - field: sortField, - direction: sortDirection, - }, - }; - - return ( - - ); -}; diff --git a/x-pack/plugins/osquery/public/fleet_integration/components/schema.ts b/x-pack/plugins/osquery/public/fleet_integration/components/schema.ts deleted file mode 100644 index 9a59c443b0a50..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/components/schema.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FIELD_TYPES } from '../../shared_imports'; - -export const schema = { - name: { - type: FIELD_TYPES.TEXT, - label: 'Name', - }, - description: { - type: FIELD_TYPES.TEXT, - label: 'Description', - }, - namespace: { - type: FIELD_TYPES.TEXT, - }, - enabled: { - type: FIELD_TYPES.TOGGLE, - }, - policy_id: { - type: FIELD_TYPES.TEXT, - }, - streams: { - type: FIELD_TYPES.MULTI_SELECT, - vars: { - query: { - type: { - type: FIELD_TYPES.TEXT, - }, - value: { - type: FIELD_TYPES.TEXT, - }, - }, - }, - }, -}; diff --git a/x-pack/plugins/osquery/public/fleet_integration/index.ts b/x-pack/plugins/osquery/public/fleet_integration/index.ts index b36a2698b8337..e27c2712c7d8c 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/index.ts +++ b/x-pack/plugins/osquery/public/fleet_integration/index.ts @@ -5,8 +5,6 @@ * 2.0. */ -export * from './lazy_osquery_managed_empty_create_policy_extension'; -export * from './lazy_osquery_managed_empty_edit_policy_extension'; -export * from './lazy_osquery_managed_policy_create_extension'; +export * from './lazy_osquery_managed_policy_create_import_extension'; export * from './lazy_osquery_managed_policy_edit_extension'; -export * from './lazy_osquery_managed_custom_extension'; +export * from './lazy_osquery_managed_custom_button_extension'; diff --git a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_custom_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_custom_button_extension.tsx similarity index 53% rename from x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_custom_extension.tsx rename to x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_custom_button_extension.tsx index 1493182cdbaa6..e547686c0166b 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_custom_extension.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_custom_button_extension.tsx @@ -8,9 +8,13 @@ import { lazy } from 'react'; import { PackageCustomExtensionComponent } from '../../../fleet/public'; -export const LazyOsqueryManagedCustomExtension = lazy(async () => { - const { OsqueryManagedCustomExtension } = await import('./osquery_managed_custom_extension'); - return { - default: OsqueryManagedCustomExtension, - }; -}); +export const LazyOsqueryManagedCustomButtonExtension = lazy( + async () => { + const { OsqueryManagedCustomButtonExtension } = await import( + './osquery_managed_custom_button_extension' + ); + return { + default: OsqueryManagedCustomButtonExtension, + }; + } +); diff --git a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_create_policy_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_create_policy_extension.tsx deleted file mode 100644 index 21f59c505952b..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_create_policy_extension.tsx +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; -import { PackagePolicyCreateExtensionComponent } from '../../../fleet/public'; - -export const LazyOsqueryManagedEmptyCreatePolicyExtension = lazy( - async () => { - const { OsqueryManagedEmptyCreatePolicyExtension } = await import( - './osquery_managed_empty_create_policy_extension' - ); - return { - default: OsqueryManagedEmptyCreatePolicyExtension, - }; - } -); diff --git a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_edit_policy_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_edit_policy_extension.tsx deleted file mode 100644 index 3f9ef42e97104..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_empty_edit_policy_extension.tsx +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; -import { PackagePolicyEditExtensionComponent } from '../../../fleet/public'; - -export const LazyOsqueryManagedEmptyEditPolicyExtension = lazy( - async () => { - const { OsqueryManagedEmptyEditPolicyExtension } = await import( - './osquery_managed_empty_edit_policy_extension' - ); - return { - default: OsqueryManagedEmptyEditPolicyExtension, - }; - } -); diff --git a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_create_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_create_import_extension.tsx similarity index 58% rename from x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_create_extension.tsx rename to x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_create_import_extension.tsx index 8f0726fdbe209..95220e8251707 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_create_extension.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_create_import_extension.tsx @@ -8,13 +8,13 @@ import { lazy } from 'react'; import { PackagePolicyCreateExtensionComponent } from '../../../fleet/public'; -export const LazyOsqueryManagedPolicyCreateExtension = lazy( +export const LazyOsqueryManagedPolicyCreateImportExtension = lazy( async () => { - const { OsqueryManagedPolicyCreateExtension } = await import( - './osquery_managed_policy_create_extension' + const { OsqueryManagedPolicyCreateImportExtension } = await import( + './osquery_managed_policy_create_import_extension' ); return { - default: OsqueryManagedPolicyCreateExtension, + default: OsqueryManagedPolicyCreateImportExtension, }; } ); diff --git a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_edit_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_edit_extension.tsx index 4289bcccdbc56..787a39f3a34b7 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_edit_extension.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/lazy_osquery_managed_policy_edit_extension.tsx @@ -10,11 +10,11 @@ import { PackagePolicyEditExtensionComponent } from '../../../fleet/public'; export const LazyOsqueryManagedPolicyEditExtension = lazy( async () => { - const { OsqueryManagedPolicyCreateExtension } = await import( - './osquery_managed_policy_create_extension' + const { OsqueryManagedPolicyCreateImportExtension } = await import( + './osquery_managed_policy_create_import_extension' ); return { - default: OsqueryManagedPolicyCreateExtension, + default: OsqueryManagedPolicyCreateImportExtension, }; } ); diff --git a/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx b/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx new file mode 100644 index 0000000000000..808718c55d199 --- /dev/null +++ b/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiCard, EuiIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useCallback, useMemo } from 'react'; + +import { useKibana, isModifiedEvent, isLeftClickEvent } from '../common/lib/kibana'; + +interface NavigationButtonsProps { + isDisabled?: boolean; + integrationPolicyId?: string; + agentPolicyId?: string; +} + +const NavigationButtonsComponent: React.FC = ({ + isDisabled, + integrationPolicyId, + agentPolicyId, +}) => { + const { + application: { getUrlForApp, navigateToApp }, + } = useKibana().services; + + const liveQueryHref = useMemo( + () => + getUrlForApp('osquery', { + path: agentPolicyId + ? `/live_queries/new?agentPolicyId=${agentPolicyId}` + : ' `/live_queries/new', + }), + [agentPolicyId, getUrlForApp] + ); + + const liveQueryClick = useCallback( + (event) => { + if (!isModifiedEvent(event) && isLeftClickEvent(event)) { + event.preventDefault(); + navigateToApp('osquery', { + path: agentPolicyId + ? `/live_queries/new?agentPolicyId=${agentPolicyId}` + : ' `/live_queries/new', + }); + } + }, + [agentPolicyId, navigateToApp] + ); + + const scheduleQueryGroupsHref = getUrlForApp('osquery', { + path: integrationPolicyId + ? `/scheduled_query_groups/${integrationPolicyId}/edit` + : `/scheduled_query_groups`, + }); + + const scheduleQueryGroupsClick = useCallback( + (event) => { + if (!isModifiedEvent(event) && isLeftClickEvent(event)) { + event.preventDefault(); + navigateToApp('osquery', { + path: integrationPolicyId + ? `/scheduled_query_groups/${integrationPolicyId}/edit` + : `/scheduled_query_groups`, + }); + } + }, + [navigateToApp, integrationPolicyId] + ); + + return ( + + + } + title={i18n.translate('xpack.osquery.fleetIntegration.runLiveQueriesButtonText', { + defaultMessage: 'Run live queries', + })} + href={liveQueryHref} + onClick={liveQueryClick} + description={''} + isDisabled={isDisabled} + /> + + + } + title={i18n.translate('xpack.osquery.fleetIntegration.scheduleQueryGroupsButtonText', { + defaultMessage: 'Schedule query groups', + })} + description={''} + isDisabled={isDisabled} + href={scheduleQueryGroupsHref} + onClick={scheduleQueryGroupsClick} + /> + + + ); +}; + +NavigationButtonsComponent.displayName = 'NavigationButtonsComponent'; + +export const NavigationButtons = React.memo(NavigationButtonsComponent); diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_button_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_button_extension.tsx new file mode 100644 index 0000000000000..775b5c7a06d21 --- /dev/null +++ b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_button_extension.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { PackageCustomExtensionComponentProps } from '../../../fleet/public'; +import { NavigationButtons } from './navigation_buttons'; + +/** + * Exports Osquery-specific package policy instructions + * for use in the Fleet app custom tab + */ +export const OsqueryManagedCustomButtonExtension = React.memo( + () => +); +OsqueryManagedCustomButtonExtension.displayName = 'OsqueryManagedCustomButtonExtension'; diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_extension.tsx deleted file mode 100644 index 1295699a270a5..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_custom_extension.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import React from 'react'; -import { QueryClient, QueryClientProvider } from 'react-query'; - -import { PackageCustomExtensionComponentProps } from '../../../fleet/public'; -import { CustomTabTabs } from './components/custom_tab_tabs'; -import { Navigation } from './components/navigation'; - -const queryClient = new QueryClient(); - -/** - * Exports Osquery-specific package policy instructions - * for use in the Fleet app custom tab - */ -export const OsqueryManagedCustomExtension = React.memo( - () => ( - - - - - - - - - - - ) -); -OsqueryManagedCustomExtension.displayName = 'OsqueryManagedCustomExtension'; diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_create_policy_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_create_policy_extension.tsx deleted file mode 100644 index 828edfc0a29b4..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_create_policy_extension.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useEffect } from 'react'; -import { produce } from 'immer'; -import deepEqual from 'fast-deep-equal'; - -import { PackagePolicyCreateExtensionComponentProps } from '../../../fleet/public'; - -/** - * Exports Osquery-specific package policy instructions - * for use in the Fleet app create / edit package policy - */ -const OsqueryManagedEmptyCreatePolicyExtensionComponent: React.FC = ({ - onChange, - newPolicy, -}) => { - useEffect(() => { - const updatedPolicy = produce(newPolicy, (draft) => { - draft.inputs.forEach((input) => (input.streams = [])); - }); - - onChange({ - isValid: true, - updatedPolicy, - }); - }); - - return <>; -}; - -OsqueryManagedEmptyCreatePolicyExtensionComponent.displayName = - 'OsqueryManagedEmptyCreatePolicyExtension'; - -export const OsqueryManagedEmptyCreatePolicyExtension = React.memo( - OsqueryManagedEmptyCreatePolicyExtensionComponent, - // we don't want to update the component if onChange has changed - (prevProps, nextProps) => deepEqual(prevProps.newPolicy, nextProps.newPolicy) -); diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_edit_policy_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_edit_policy_extension.tsx deleted file mode 100644 index c8304ea5f0d1e..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_empty_edit_policy_extension.tsx +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; - -import { PackagePolicyEditExtensionComponentProps } from '../../../fleet/public'; - -/** - * Exports Osquery-specific package policy instructions - * for use in the Fleet app edit package policy - */ -const OsqueryManagedEmptyEditPolicyExtensionComponent = () => <>; - -OsqueryManagedEmptyEditPolicyExtensionComponent.displayName = - 'OsqueryManagedEmptyEditPolicyExtension'; - -export const OsqueryManagedEmptyEditPolicyExtension = React.memo( - OsqueryManagedEmptyEditPolicyExtensionComponent -); diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_extension.tsx deleted file mode 100644 index 09653b09365ce..0000000000000 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_extension.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton } from '@elastic/eui'; -import React, { useCallback, useState } from 'react'; -import { QueryClient, QueryClientProvider } from 'react-query'; - -import { PackagePolicyCreateExtensionComponentProps } from '../../../fleet/public'; -import { ScheduledQueryInputType } from './components/input_type'; -import { ScheduledQueryPackSelector } from './components/pack_selector'; -import { ScheduledQueryQueriesTable } from './components/scheduled_queries_table'; -import { AddNewQueryFlyout } from './components/add_new_query_flyout'; - -const queryClient = new QueryClient(); - -/** - * Exports Osquery-specific package policy instructions - * for use in the Fleet app create / edit package policy - */ -export const OsqueryManagedPolicyCreateExtension = React.memo( - ({ onChange, newPolicy }) => { - const [showAddQueryFlyout, setShowAddQueryFlyout] = useState(false); - - const handleShowFlyout = useCallback(() => setShowAddQueryFlyout(true), []); - const handleHideFlyout = useCallback(() => setShowAddQueryFlyout(false), []); - - return ( - - - {newPolicy.inputs[0].config?.input_source?.value === 'pack' && ( - - )} - {newPolicy.inputs[0].streams.length && ( - // @ts-expect-error update types - - )} - {newPolicy.inputs[0].config?.input_source?.value !== 'pack' && ( - - {'Attach next query'} - - )} - {showAddQueryFlyout && ( - - )} - - ); - } -); -OsqueryManagedPolicyCreateExtension.displayName = 'OsqueryManagedPolicyCreateExtension'; diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx new file mode 100644 index 0000000000000..3b99e1d46855f --- /dev/null +++ b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx @@ -0,0 +1,202 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { filter } from 'lodash/fp'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiCallOut, EuiLink } from '@elastic/eui'; +import React, { useEffect, useMemo, useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { produce } from 'immer'; + +import { i18n } from '@kbn/i18n'; +import { + agentRouteService, + agentPolicyRouteService, + PackagePolicy, + AgentPolicy, +} from '../../../fleet/common'; +import { + pagePathGetters, + CreatePackagePolicyRouteState, + PackagePolicyCreateExtensionComponentProps, + PackagePolicyEditExtensionComponentProps, +} from '../../../fleet/public'; +import { ScheduledQueryGroupQueriesTable } from '../scheduled_query_groups/scheduled_query_group_queries_table'; +import { useKibana } from '../common/lib/kibana'; +import { NavigationButtons } from './navigation_buttons'; + +/** + * Exports Osquery-specific package policy instructions + * for use in the Fleet app create / edit package policy + */ + +export const OsqueryManagedPolicyCreateImportExtension = React.memo< + PackagePolicyCreateExtensionComponentProps & { + policy?: PackagePolicyEditExtensionComponentProps['policy']; + } +>(({ onChange, policy, newPolicy }) => { + const [policyAgentsCount, setPolicyAgentsCount] = useState(null); + const [agentPolicy, setAgentPolicy] = useState(null); + const [editMode] = useState(!!policy); + const { + application: { getUrlForApp }, + http, + } = useKibana().services; + const { replace } = useHistory(); + + const agentsLinkHref = useMemo(() => { + if (!policy?.policy_id) return '#'; + + return getUrlForApp('fleet', { + path: + `#` + + pagePathGetters.policy_details({ policyId: policy?.policy_id }) + + '?openEnrollmentFlyout=true', + }); + }, [getUrlForApp, policy?.policy_id]); + + useEffect(() => { + if (editMode && policyAgentsCount === null) { + const fetchAgentsCount = async () => { + try { + const response = await http.fetch(agentRouteService.getStatusPath(), { + query: { + policyId: policy?.policy_id, + }, + }); + if (response.results) { + setPolicyAgentsCount(response.results.total); + } + // eslint-disable-next-line no-empty + } catch (e) {} + }; + + const fetchAgentPolicyDetails = async () => { + if (policy?.policy_id) { + try { + const response = await http.fetch( + agentPolicyRouteService.getInfoPath(policy?.policy_id) + ); + if (response.item) { + setAgentPolicy(response.item); + } + // eslint-disable-next-line no-empty + } catch (e) {} + } + }; + + fetchAgentsCount(); + fetchAgentPolicyDetails(); + } + }, [editMode, http, policy?.policy_id, policyAgentsCount]); + + useEffect(() => { + /* + by default Fleet set up streams with an empty scheduled query, + this code removes that, so the user can schedule queries + in the next step + */ + if (!editMode) { + const updatedPolicy = produce(newPolicy, (draft) => { + draft.inputs[0].streams = []; + return draft; + }); + onChange({ + isValid: true, + updatedPolicy, + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (!editMode) { + replace({ + state: { + onSaveNavigateTo: (newPackagePolicy) => [ + 'fleet', + { + path: + '#' + + pagePathGetters.integration_policy_edit({ + packagePolicyId: newPackagePolicy.id, + }), + }, + ], + } as CreatePackagePolicyRouteState, + }); + } + }, [editMode, replace]); + + const scheduledQueryGroupTableData = useMemo(() => { + const policyWithoutEmptyQueries = produce(newPolicy, (draft) => { + draft.inputs[0].streams = filter(['compiled_stream.id', null], draft.inputs[0].streams); + return draft; + }); + + return policyWithoutEmptyQueries; + }, [newPolicy]); + + return ( + <> + {!editMode ? ( + <> + + + + + + + + ) : null} + {policyAgentsCount === 0 ? ( + <> + + + +

+ {`Fleet has detected that you have not assigned yet any agent to the `} + { + + {agentPolicy?.name ?? policy?.policy_id} + + } + {`. `} +
+ {`Only agents within the policy with active Osquery Manager integration support the functionality presented below.`} +

+
+
+
+ + + ) : null} + + + + + {editMode && scheduledQueryGroupTableData.inputs[0].streams.length ? ( + + + + + + ) : null} + + ); +}); + +OsqueryManagedPolicyCreateImportExtension.displayName = 'OsqueryManagedPolicyCreateImportExtension'; diff --git a/x-pack/plugins/osquery/public/live_query/agent_results/index.tsx b/x-pack/plugins/osquery/public/live_queries/agent_results/index.tsx similarity index 89% rename from x-pack/plugins/osquery/public/live_query/agent_results/index.tsx rename to x-pack/plugins/osquery/public/live_queries/agent_results/index.tsx index 63dbca98d648f..272e65d9cc0fa 100644 --- a/x-pack/plugins/osquery/public/live_query/agent_results/index.tsx +++ b/x-pack/plugins/osquery/public/live_queries/agent_results/index.tsx @@ -19,10 +19,7 @@ const QueryAgentResultsComponent = () => { return ( <> - { - // @ts-expect-error update types - data?.actionDetails._source?.data?.query - } + {data?.actionDetails._source?.data?.query} diff --git a/x-pack/plugins/osquery/public/live_query/form/agents_table_field.tsx b/x-pack/plugins/osquery/public/live_queries/form/agents_table_field.tsx similarity index 100% rename from x-pack/plugins/osquery/public/live_query/form/agents_table_field.tsx rename to x-pack/plugins/osquery/public/live_queries/form/agents_table_field.tsx diff --git a/x-pack/plugins/osquery/public/live_queries/form/index.tsx b/x-pack/plugins/osquery/public/live_queries/form/index.tsx new file mode 100644 index 0000000000000..056bbc75f3b76 --- /dev/null +++ b/x-pack/plugins/osquery/public/live_queries/form/index.tsx @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiSteps, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; +import { useMutation } from 'react-query'; + +import { UseField, Form, FormData, useForm, useFormData } from '../../shared_imports'; +import { AgentsTableField } from './agents_table_field'; +import { LiveQueryQueryField } from './live_query_query_field'; +import { useKibana } from '../../common/lib/kibana'; +import { ResultTabs } from '../../queries/edit/tabs'; + +const FORM_ID = 'liveQueryForm'; + +interface LiveQueryFormProps { + defaultValue?: Partial | undefined; + onSubmit?: (payload: Record) => Promise; + onSuccess?: () => void; +} + +const LiveQueryFormComponent: React.FC = ({ + defaultValue, + // onSubmit, + onSuccess, +}) => { + const { http } = useKibana().services; + + const { + data, + isLoading, + mutateAsync, + isError, + isSuccess, + // error + } = useMutation( + (payload: Record) => + http.post('/internal/osquery/action', { + body: JSON.stringify(payload), + }), + { + onSuccess, + } + ); + + const { form } = useForm({ + id: FORM_ID, + // schema: formSchema, + onSubmit: (payload) => { + return mutateAsync(payload); + }, + options: { + stripEmptyFields: false, + }, + defaultValue: defaultValue ?? { + query: { + id: null, + query: '', + }, + }, + }); + + const { submit } = form; + + const actionId = useMemo(() => data?.actions[0].action_id, [data?.actions]); + const agentIds = useMemo(() => data?.actions[0].agents, [data?.actions]); + const [{ agentSelection, query }] = useFormData({ form, watch: ['agentSelection', 'query'] }); + + const agentSelected = useMemo( + () => + agentSelection && + !!( + agentSelection.allAgentsSelected || + agentSelection.agents?.length || + agentSelection.platformsSelected?.length || + agentSelection.policiesSelected?.length + ), + [agentSelection] + ); + + const queryValueProvided = useMemo(() => !!query?.query?.length, [query]); + + const queryStatus = useMemo(() => { + if (!agentSelected) return 'disabled'; + if (isError) return 'danger'; + if (isLoading) return 'loading'; + if (isSuccess) return 'complete'; + + return 'incomplete'; + }, [agentSelected, isError, isLoading, isSuccess]); + + const resultsStatus = useMemo(() => (queryStatus === 'complete' ? 'incomplete' : 'disabled'), [ + queryStatus, + ]); + + const queryComponentProps = useMemo( + () => ({ + disabled: queryStatus === 'disabled', + }), + [queryStatus] + ); + + const formSteps: EuiContainedStepProps[] = useMemo( + () => [ + { + title: i18n.translate('xpack.osquery.liveQueryForm.steps.agentsStepHeading', { + defaultMessage: 'Select agents', + }), + children: , + status: agentSelected ? 'complete' : 'incomplete', + }, + { + title: i18n.translate('xpack.osquery.liveQueryForm.steps.queryStepHeading', { + defaultMessage: 'Enter query', + }), + children: ( + <> + + + + + + + + + + + ), + status: queryStatus, + }, + { + title: i18n.translate('xpack.osquery.liveQueryForm.steps.resultsStepHeading', { + defaultMessage: 'Check results', + }), + children: actionId ? ( + + ) : null, + status: resultsStatus, + }, + ], + [ + actionId, + agentIds, + agentSelected, + queryComponentProps, + queryStatus, + queryValueProvided, + resultsStatus, + submit, + ] + ); + + return ( +
+ + + ); +}; + +export const LiveQueryForm = React.memo(LiveQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/live_query/form/live_query_query_field.tsx b/x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx similarity index 93% rename from x-pack/plugins/osquery/public/live_query/form/live_query_query_field.tsx rename to x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx index bc3da3ea37209..68207200dc789 100644 --- a/x-pack/plugins/osquery/public/live_query/form/live_query_query_field.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx @@ -15,13 +15,14 @@ import { FieldHook } from '../../shared_imports'; import { OsqueryEditor } from '../../editor'; interface LiveQueryQueryFieldProps { + disabled?: boolean; field: FieldHook<{ id: string | null; query: string; }>; } -const LiveQueryQueryFieldComponent: React.FC = ({ field }) => { +const LiveQueryQueryFieldComponent: React.FC = ({ disabled, field }) => { // const { http } = useKibana().services; // const { data } = useQuery('savedQueryList', () => // http.get('/internal/osquery/saved_query', { @@ -82,7 +83,7 @@ const LiveQueryQueryFieldComponent: React.FC = ({ fiel onChange={handleSavedQueryChange} /> */} - + ); }; diff --git a/x-pack/plugins/osquery/public/live_query/form/schema.ts b/x-pack/plugins/osquery/public/live_queries/form/schema.ts similarity index 100% rename from x-pack/plugins/osquery/public/live_query/form/schema.ts rename to x-pack/plugins/osquery/public/live_queries/form/schema.ts diff --git a/x-pack/plugins/osquery/public/live_queries/index.tsx b/x-pack/plugins/osquery/public/live_queries/index.tsx new file mode 100644 index 0000000000000..3fb36f57ef82f --- /dev/null +++ b/x-pack/plugins/osquery/public/live_queries/index.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { LiveQueryForm } from './form'; +import { FormData } from '../shared_imports'; + +interface LiveQueryProps { + defaultValue?: Partial | undefined; + onSuccess?: () => void; +} + +const LiveQueryComponent: React.FC = ({ defaultValue, onSuccess }) => ( + +); + +export const LiveQuery = React.memo(LiveQueryComponent); diff --git a/x-pack/plugins/osquery/public/live_query/form/index.tsx b/x-pack/plugins/osquery/public/live_query/form/index.tsx deleted file mode 100644 index 7e19bee530ec5..0000000000000 --- a/x-pack/plugins/osquery/public/live_query/form/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiSpacer } from '@elastic/eui'; -import React from 'react'; - -import { UseField, Form, useForm } from '../../shared_imports'; -import { AgentsTableField } from './agents_table_field'; -import { LiveQueryQueryField } from './live_query_query_field'; - -const FORM_ID = 'liveQueryForm'; - -interface LiveQueryFormProps { - defaultValue?: unknown; - onSubmit: (payload: Record) => Promise; -} - -const LiveQueryFormComponent: React.FC = ({ defaultValue, onSubmit }) => { - const { form } = useForm({ - id: FORM_ID, - // schema: formSchema, - onSubmit, - options: { - stripEmptyFields: false, - }, - defaultValue: { - // @ts-expect-error update types - query: defaultValue ?? { - id: null, - query: '', - }, - }, - }); - - const { submit } = form; - - return ( -
- - - - - {'Send query'} - - ); -}; - -export const LiveQueryForm = React.memo(LiveQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/live_query/index.tsx b/x-pack/plugins/osquery/public/live_query/index.tsx deleted file mode 100644 index 324f9896cbd96..0000000000000 --- a/x-pack/plugins/osquery/public/live_query/index.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiSpacer } from '@elastic/eui'; -import React from 'react'; -import { useMutation } from 'react-query'; -import { useLocation } from 'react-router-dom'; - -import { useKibana } from '../common/lib/kibana'; -import { LiveQueryForm } from './form'; -import { ResultTabs } from '../queries/edit/tabs'; - -const LiveQueryComponent = () => { - const location = useLocation(); - const { http } = useKibana().services; - - const createActionMutation = useMutation((payload: Record) => - http.post('/internal/osquery/action', { - body: JSON.stringify(payload), - }) - ); - - return ( - <> - { - - } - - {createActionMutation.data && ( - <> - - - - )} - - ); -}; - -export const LiveQuery = React.memo(LiveQueryComponent); diff --git a/x-pack/plugins/osquery/public/osquery_action_type/example_params_fields.tsx b/x-pack/plugins/osquery/public/osquery_action_type/example_params_fields.tsx deleted file mode 100644 index 898806ea542a8..0000000000000 --- a/x-pack/plugins/osquery/public/osquery_action_type/example_params_fields.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/* eslint-disable react-perf/jsx-no-new-function-as-prop, react/jsx-no-bind */ - -import React, { Fragment } from 'react'; -import { EuiTextArea } from '@elastic/eui'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ActionParamsProps } from '../../../triggers_actions_ui/public/types'; - -interface ExampleActionParams { - message: string; -} - -const ExampleParamsFields: React.FunctionComponent> = ({ - actionParams, - editAction, - index, - errors, -}) => { - // console.error('actionParams', actionParams, index, errors); - const { message } = actionParams; - return ( - - 0 && message !== undefined} - name="message" - value={message || ''} - onChange={(e) => { - editAction('message', e.target.value, index); - }} - onBlur={() => { - if (!message) { - editAction('message', '', index); - } - }} - /> - - ); -}; - -// Export as default in order to support lazy loading -// eslint-disable-next-line import/no-default-export -export { ExampleParamsFields as default }; diff --git a/x-pack/plugins/osquery/public/osquery_action_type/index.tsx b/x-pack/plugins/osquery/public/osquery_action_type/index.tsx deleted file mode 100644 index 2e162b34ab96d..0000000000000 --- a/x-pack/plugins/osquery/public/osquery_action_type/index.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { lazy } from 'react'; -import { i18n } from '@kbn/i18n'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ActionTypeModel, ValidationResult } from '../../../triggers_actions_ui/public/types'; - -interface ExampleActionParams { - message: string; -} - -export function getActionType(): ActionTypeModel { - return { - id: '.osquery', - iconClass: 'logoOsquery', - selectMessage: i18n.translate( - 'xpack.osquery.components.builtinActionTypes.exampleAction.selectMessageText', - { - defaultMessage: 'Example Action is used to show how to create new action type UI.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.osquery.components.builtinActionTypes.exampleAction.actionTypeTitle', - { - defaultMessage: 'Example Action', - } - ), - // @ts-expect-error update types - validateConnector: (action): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - someConnectorField: new Array(), - }; - validationResult.errors = errors; - if (!action.config.someConnectorField) { - errors.someConnectorField.push( - i18n.translate( - 'xpack.osquery.components.builtinActionTypes.error.requiredSomeConnectorFieldeText', - { - defaultMessage: 'SomeConnectorField is required.', - } - ) - ); - } - return validationResult; - }, - validateParams: (actionParams: ExampleActionParams): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - message: new Array(), - }; - validationResult.errors = errors; - if (!actionParams.message?.length) { - errors.message.push( - i18n.translate( - 'xpack.osquery.components.builtinActionTypes.error.requiredExampleMessageText', - { - defaultMessage: 'Message is required.', - } - ) - ); - } - return validationResult; - }, - actionConnectorFields: null, - actionParamsFields: lazy(() => import('./example_params_fields')), - }; -} diff --git a/x-pack/plugins/osquery/public/packs/edit/index.tsx b/x-pack/plugins/osquery/public/packs/edit/index.tsx index 478152bb8b4a3..3cbd80c9f4db0 100644 --- a/x-pack/plugins/osquery/public/packs/edit/index.tsx +++ b/x-pack/plugins/osquery/public/packs/edit/index.tsx @@ -26,6 +26,7 @@ const EditPackPageComponent: React.FC = ({ onSuccess, packId queries: [], }, } = useQuery(['pack', { id: packId }], ({ queryKey }) => { + // @ts-expect-error update types return http.get(`/internal/osquery/pack/${queryKey[1].id}`); }); diff --git a/x-pack/plugins/osquery/public/plugin.ts b/x-pack/plugins/osquery/public/plugin.ts index b807e93236df6..c0a097cb3ba28 100644 --- a/x-pack/plugins/osquery/public/plugin.ts +++ b/x-pack/plugins/osquery/public/plugin.ts @@ -14,6 +14,7 @@ import { CoreStart, DEFAULT_APP_CATEGORIES, AppStatus, + AppNavLinkStatus, AppUpdater, } from '../../../../src/core/public'; import { Storage } from '../../../../src/plugins/kibana_utils/public'; @@ -24,28 +25,51 @@ import { StartPlugins, AppPluginStartDependencies, } from './types'; -import { PLUGIN_NAME } from '../common'; +import { OSQUERY_INTEGRATION_NAME, PLUGIN_NAME } from '../common'; +import { epmRouteService, GetPackagesResponse } from '../../fleet/common'; import { - LazyOsqueryManagedEmptyCreatePolicyExtension, - LazyOsqueryManagedEmptyEditPolicyExtension, + LazyOsqueryManagedPolicyCreateImportExtension, + LazyOsqueryManagedPolicyEditExtension, + LazyOsqueryManagedCustomButtonExtension, } from './fleet_integration'; -// import { getActionType } from './osquery_action_type'; - -export function toggleOsqueryPlugin(updater$: Subject, http: CoreStart['http']) { - http.fetch('/api/fleet/epm/packages', { query: { experimental: true } }).then(({ response }) => { - const installed = response.find( - // @ts-expect-error update types - (integration) => - integration?.name === 'osquery_elastic_managed' && integration?.status === 'installed' - ); - updater$.next(() => ({ - status: installed ? AppStatus.accessible : AppStatus.inaccessible, - })); - }); + +export function toggleOsqueryPlugin( + updater$: Subject, + http: CoreStart['http'], + registerExtension?: StartPlugins['fleet']['registerExtension'] +) { + http + .fetch(epmRouteService.getListPath(), { query: { experimental: true } }) + .then(({ response }) => { + const installed = response.find( + (integration) => + integration?.name === OSQUERY_INTEGRATION_NAME && integration?.status === 'installed' + ); + + if (installed && registerExtension) { + registerExtension({ + package: OSQUERY_INTEGRATION_NAME, + view: 'package-detail-custom', + component: LazyOsqueryManagedCustomButtonExtension, + }); + } + + updater$.next(() => ({ + navLinkStatus: installed ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden, + })); + }) + .catch(() => { + updater$.next(() => ({ + status: AppStatus.inaccessible, + navLinkStatus: AppNavLinkStatus.hidden, + })); + }); } export class OsqueryPlugin implements Plugin { - private readonly appUpdater$ = new BehaviorSubject(() => ({})); + private readonly appUpdater$ = new BehaviorSubject(() => ({ + navLinkStatus: AppNavLinkStatus.hidden, + })); private kibanaVersion: string; private storage = new Storage(localStorage); @@ -53,11 +77,14 @@ export class OsqueryPlugin implements Plugin(); + public setup(core: CoreSetup): OsqueryPluginSetup { + const config = this.initializerContext.config.get<{ + enabled: boolean; + actionEnabled: boolean; + scheduledQueries: boolean; + savedQueries: boolean; + packs: boolean; + }>(); if (!config.enabled) { return {}; @@ -71,6 +98,7 @@ export class OsqueryPlugin implements Plugin(); - - if (!config.enabled) { - return {}; - } + const config = this.initializerContext.config.get<{ + enabled: boolean; + actionEnabled: boolean; + scheduledQueries: boolean; + savedQueries: boolean; + packs: boolean; + }>(); if (plugins.fleet) { const { registerExtension } = plugins.fleet; - toggleOsqueryPlugin(this.appUpdater$, core.http); + if (config.enabled) { + toggleOsqueryPlugin(this.appUpdater$, core.http, registerExtension); + } registerExtension({ - package: 'osquery_elastic_managed', + package: OSQUERY_INTEGRATION_NAME, view: 'package-policy-create', - component: LazyOsqueryManagedEmptyCreatePolicyExtension, + component: LazyOsqueryManagedPolicyCreateImportExtension, }); registerExtension({ - package: 'osquery_elastic_managed', + package: OSQUERY_INTEGRATION_NAME, view: 'package-policy-edit', - component: LazyOsqueryManagedEmptyEditPolicyExtension, + component: LazyOsqueryManagedPolicyEditExtension, }); - - // registerExtension({ - // package: 'osquery_elastic_managed', - // view: 'package-detail-custom', - // component: LazyOsqueryManagedCustomExtension, - // }); } else { this.appUpdater$.next(() => ({ status: AppStatus.inaccessible, diff --git a/x-pack/plugins/osquery/public/queries/edit/tabs.tsx b/x-pack/plugins/osquery/public/queries/edit/tabs.tsx index 4aa9d20d11123..1a6b317653c98 100644 --- a/x-pack/plugins/osquery/public/queries/edit/tabs.tsx +++ b/x-pack/plugins/osquery/public/queries/edit/tabs.tsx @@ -9,13 +9,15 @@ import { EuiTabbedContent, EuiSpacer } from '@elastic/eui'; import React, { useMemo } from 'react'; import { ResultsTable } from '../../results/results_table'; -import { ActionResultsTable } from '../../action_results/action_results_table'; +import { ActionResultsSummary } from '../../action_results/action_results_summary'; interface ResultTabsProps { actionId: string; + agentIds?: string[]; + isLive?: boolean; } -const ResultTabsComponent: React.FC = ({ actionId }) => { +const ResultTabsComponent: React.FC = ({ actionId, agentIds, isLive }) => { const tabs = useMemo( () => [ { @@ -24,7 +26,7 @@ const ResultTabsComponent: React.FC = ({ actionId }) => { content: ( <> - + ), }, @@ -34,12 +36,12 @@ const ResultTabsComponent: React.FC = ({ actionId }) => { content: ( <> - + ), }, ], - [actionId] + [actionId, agentIds, isLive] ); return ( diff --git a/x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx b/x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx index 5a564af987562..a56e747355c5b 100644 --- a/x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx +++ b/x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx @@ -5,6 +5,9 @@ * 2.0. */ +import { FormattedMessage } from '@kbn/i18n/react'; +import { isEmpty } from 'lodash/fp'; +import { EuiFormRow, EuiLink, EuiText } from '@elastic/eui'; import React from 'react'; import { OsqueryEditor } from '../../editor'; @@ -14,10 +17,34 @@ interface CodeEditorFieldProps { field: FieldHook; } +const OsquerySchemaLink = React.memo(() => ( + + + + + +)); + +OsquerySchemaLink.displayName = 'OsquerySchemaLink'; + const CodeEditorFieldComponent: React.FC = ({ field }) => { - const { value, setValue } = field; + const { value, label, labelAppend, helpText, setValue } = field; - return ; + return ( + } + helpText={helpText} + // isInvalid={typeof error === 'string'} + // error={error} + fullWidth + > + + + ); }; export const CodeEditorField = React.memo(CodeEditorFieldComponent); diff --git a/x-pack/plugins/osquery/public/query_client.ts b/x-pack/plugins/osquery/public/query_client.ts new file mode 100644 index 0000000000000..7541e80aee935 --- /dev/null +++ b/x-pack/plugins/osquery/public/query_client.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { QueryClient } from 'react-query'; + +export const queryClient = new QueryClient(); diff --git a/x-pack/plugins/osquery/public/results/helpers.ts b/x-pack/plugins/osquery/public/results/helpers.ts index 802674ee0398c..171530a77299f 100644 --- a/x-pack/plugins/osquery/public/results/helpers.ts +++ b/x-pack/plugins/osquery/public/results/helpers.ts @@ -16,15 +16,14 @@ export type InspectResponse = Inspect & { response: string[] }; export const generateTablePaginationOptions = ( activePage: number, - limit: number, - isBucketSort?: boolean + limit: number ): PaginationInputPaginated => { const cursorStart = activePage * limit; return { activePage, cursorStart, fakePossibleCount: 4 <= activePage && activePage > 0 ? limit * (activePage + 2) : limit * 5, - querySize: isBucketSort ? limit : limit + cursorStart, + querySize: limit, }; }; diff --git a/x-pack/plugins/osquery/public/results/results_table.tsx b/x-pack/plugins/osquery/public/results/results_table.tsx index 7557828c4407c..d82c45d802520 100644 --- a/x-pack/plugins/osquery/public/results/results_table.tsx +++ b/x-pack/plugins/osquery/public/results/results_table.tsx @@ -6,22 +6,40 @@ */ import { isEmpty, isEqual, keys, map } from 'lodash/fp'; -import { EuiDataGrid, EuiDataGridProps, EuiDataGridColumn, EuiLink } from '@elastic/eui'; +import { + EuiDataGrid, + EuiDataGridSorting, + EuiDataGridProps, + EuiDataGridColumn, + EuiLink, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import React, { createContext, useEffect, useState, useCallback, useContext, useMemo } from 'react'; -import { EuiDataGridSorting } from '@elastic/eui'; +import { pagePathGetters } from '../../../fleet/public'; import { useAllResults } from './use_all_results'; import { Direction, ResultEdges } from '../../common/search_strategy'; -import { useRouterNavigate } from '../common/lib/kibana'; +import { useKibana } from '../common/lib/kibana'; const DataContext = createContext([]); interface ResultsTableComponentProps { actionId: string; agentId?: string; + isLive?: boolean; } -const ResultsTableComponent: React.FC = ({ actionId, agentId }) => { +const ResultsTableComponent: React.FC = ({ actionId, isLive }) => { + const { getUrlForApp } = useKibana().services.application; + + const getFleetAppUrl = useCallback( + (agentId) => + getUrlForApp('fleet', { + path: `#` + pagePathGetters.fleet_agent_details({ agentId }), + }), + [getUrlForApp] + ); + const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 50 }); const onChangeItemsPerPage = useCallback( (pageSize) => @@ -39,22 +57,15 @@ const ResultsTableComponent: React.FC = ({ actionId, const [columns, setColumns] = useState([]); - // ** Sorting config const [sortingColumns, setSortingColumns] = useState([]); - const onSort = useCallback( - (newSortingColumns) => { - setSortingColumns(newSortingColumns); - }, - [setSortingColumns] - ); - const { data: allResultsData = [] } = useAllResults({ + const { data: allResultsData } = useAllResults({ actionId, - agentId, activePage: pagination.pageIndex, limit: pagination.pageSize, direction: Direction.asc, sortField: '@timestamp', + isLive, }); const [visibleColumns, setVisibleColumns] = useState([]); @@ -68,24 +79,22 @@ const ResultsTableComponent: React.FC = ({ actionId, // eslint-disable-next-line react-hooks/rules-of-hooks const data = useContext(DataContext); - // @ts-expect-error fields is optional - const value = data[rowIndex].fields[columnId]; + // @ts-expect-error update types + const value = data[rowIndex % pagination.pageSize]?.fields[columnId]; if (columnId === 'agent.name') { - // @ts-expect-error fields is optional - const agentIdValue = data[rowIndex].fields['agent.id']; - // eslint-disable-next-line react-hooks/rules-of-hooks - const linkProps = useRouterNavigate(`/live_query/${actionId}/results/${agentIdValue}`); - return {value}; + // @ts-expect-error update types + const agentIdValue = data[rowIndex % pagination.pageSize]?.fields['agent.id']; + + return {value}; } return !isEmpty(value) ? value : '-'; }, - [actionId] + [getFleetAppUrl, pagination.pageSize] ); - const tableSorting = useMemo(() => ({ columns: sortingColumns, onSort }), [ - onSort, + const tableSorting = useMemo(() => ({ columns: sortingColumns, onSort: setSortingColumns }), [ sortingColumns, ]); @@ -100,34 +109,32 @@ const ResultsTableComponent: React.FC = ({ actionId, ); useEffect(() => { - // @ts-expect-error update types - if (!allResultsData?.results) { + if (!allResultsData?.edges) { return; } - // @ts-expect-error update types - const newColumns = keys(allResultsData?.results[0]?.fields) + + const newColumns = keys(allResultsData?.edges[0]?.fields) .sort() .reduce((acc, fieldName) => { if (fieldName === 'agent.name') { - return [ - ...acc, - { - id: fieldName, - displayAsText: 'agent', - defaultSortDirection: Direction.asc, - }, - ]; + acc.push({ + id: fieldName, + displayAsText: i18n.translate('xpack.osquery.liveQueryResults.table.agentColumnTitle', { + defaultMessage: 'agent', + }), + defaultSortDirection: Direction.asc, + }); + + return acc; } if (fieldName.startsWith('osquery.')) { - return [ - ...acc, - { - id: fieldName, - displayAsText: fieldName.split('.')[1], - defaultSortDirection: Direction.asc, - }, - ]; + acc.push({ + id: fieldName, + displayAsText: fieldName.split('.')[1], + defaultSortDirection: Direction.asc, + }); + return acc; } return acc; @@ -137,22 +144,20 @@ const ResultsTableComponent: React.FC = ({ actionId, setColumns(newColumns); setVisibleColumns(map('id', newColumns)); } - // @ts-expect-error update types - }, [columns, allResultsData?.results]); + }, [columns, allResultsData?.edges]); return ( // @ts-expect-error update types - + ); diff --git a/x-pack/plugins/osquery/public/results/use_all_results.ts b/x-pack/plugins/osquery/public/results/use_all_results.ts index 5727edf1bf4c3..7140f80f510f4 100644 --- a/x-pack/plugins/osquery/public/results/use_all_results.ts +++ b/x-pack/plugins/osquery/public/results/use_all_results.ts @@ -5,8 +5,6 @@ * 2.0. */ -import deepEqual from 'fast-deep-equal'; -import { useEffect, useState } from 'react'; import { useQuery } from 'react-query'; import { createFilter } from '../common/helpers'; @@ -35,71 +33,55 @@ export interface ResultsArgs { interface UseAllResults { actionId: string; activePage: number; - agentId?: string; direction: Direction; limit: number; sortField: string; filterQuery?: ESTermQuery | string; skip?: boolean; + isLive?: boolean; } export const useAllResults = ({ actionId, activePage, - agentId, direction, limit, sortField, filterQuery, skip = false, + isLive = false, }: UseAllResults) => { const { data } = useKibana().services; - const [resultsRequest, setHostRequest] = useState(null); - - const response = useQuery( + return useQuery( ['allActionResults', { actionId, activePage, direction, limit, sortField }], async () => { - if (!resultsRequest) return Promise.resolve(); - const responseData = await data.search - .search(resultsRequest, { - strategy: 'osquerySearchStrategy', - }) + .search( + { + actionId, + factoryQueryType: OsqueryQueries.results, + filterQuery: createFilter(filterQuery), + pagination: generateTablePaginationOptions(activePage, limit), + sort: { + direction, + field: sortField, + }, + }, + { + strategy: 'osquerySearchStrategy', + } + ) .toPromise(); return { ...responseData, - results: responseData.edges, inspect: getInspectResponse(responseData, {} as InspectResponse), }; }, { - refetchInterval: 1000, - enabled: !skip && !!resultsRequest, + refetchInterval: isLive ? 1000 : false, + enabled: !skip, } ); - - useEffect(() => { - setHostRequest((prevRequest) => { - const myRequest = { - ...(prevRequest ?? {}), - actionId, - agentId, - factoryQueryType: OsqueryQueries.results, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - sort: { - direction, - field: sortField, - }, - }; - if (!deepEqual(prevRequest, myRequest)) { - return myRequest; - } - return prevRequest; - }); - }, [actionId, activePage, agentId, direction, filterQuery, limit, sortField]); - - return response; }; diff --git a/x-pack/plugins/osquery/public/routes/index.tsx b/x-pack/plugins/osquery/public/routes/index.tsx index 18ba0abec5696..7007feb19d663 100644 --- a/x-pack/plugins/osquery/public/routes/index.tsx +++ b/x-pack/plugins/osquery/public/routes/index.tsx @@ -8,24 +8,24 @@ import React from 'react'; import { Switch, Redirect, Route } from 'react-router-dom'; -import { LiveQueries } from './live_query'; +import { useBreadcrumbs } from '../common/hooks/use_breadcrumbs'; +import { LiveQueries } from './live_queries'; +import { ScheduledQueryGroups } from './scheduled_query_groups'; -const OsqueryAppRoutesComponent = () => ( - - {/* - - - - - - - - */} - - - - - -); +const OsqueryAppRoutesComponent = () => { + useBreadcrumbs('base'); + + return ( + + + + + + + + + + ); +}; export const OsqueryAppRoutes = React.memo(OsqueryAppRoutesComponent); diff --git a/x-pack/plugins/osquery/public/routes/live_queries/details/actions_menu.tsx b/x-pack/plugins/osquery/public/routes/live_queries/details/actions_menu.tsx new file mode 100644 index 0000000000000..5e7c6082fef5a --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/live_queries/details/actions_menu.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiButton, EuiContextMenuPanel, EuiContextMenuItem, EuiPopover } from '@elastic/eui'; +import React, { useCallback, useMemo, useState } from 'react'; + +import { useDiscoverLink } from '../../../common/hooks'; +interface LiveQueryDetailsActionsMenuProps { + actionId: string; +} + +const LiveQueryDetailsActionsMenuComponent: React.FC = ({ + actionId, +}) => { + const discoverLinkProps = useDiscoverLink({ filters: [{ key: 'action_id', value: actionId }] }); + const [isPopoverOpen, setPopover] = useState(false); + + const onButtonClick = useCallback(() => { + setPopover((currentIsPopoverOpen) => !currentIsPopoverOpen); + }, []); + + const closePopover = useCallback(() => { + setPopover(false); + }, []); + + const items = useMemo( + () => [ + + + , + ], + [discoverLinkProps] + ); + + const button = useMemo( + () => ( + + + + ), + [onButtonClick] + ); + + return ( + + + + ); +}; + +export const LiveQueryDetailsActionsMenu = React.memo(LiveQueryDetailsActionsMenuComponent); diff --git a/x-pack/plugins/osquery/public/routes/live_query/details/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx similarity index 75% rename from x-pack/plugins/osquery/public/routes/live_query/details/index.tsx rename to x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx index 11665bede97c5..9f759f847f4c8 100644 --- a/x-pack/plugins/osquery/public/routes/live_query/details/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx @@ -7,7 +7,7 @@ import { EuiButtonEmpty, - EuiText, + EuiTextColor, EuiFlexGroup, EuiFlexItem, EuiCodeBlock, @@ -28,6 +28,8 @@ import { useActionResults } from '../../../action_results/use_action_results'; import { useActionDetails } from '../../../actions/use_action_details'; import { ResultTabs } from '../../../queries/edit/tabs'; import { LiveQueryDetailsActionsMenu } from './actions_menu'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const Divider = styled.div` width: 0; @@ -37,7 +39,8 @@ const Divider = styled.div` const LiveQueryDetailsPageComponent = () => { const { actionId } = useParams<{ actionId: string }>(); - const liveQueryListProps = useRouterNavigate('live_query'); + useBreadcrumbs('live_query_details', { liveQueryId: actionId }); + const liveQueryListProps = useRouterNavigate('live_queries'); const { data } = useActionDetails({ actionId }); const { data: actionResultsData } = useActionResults({ @@ -54,30 +57,21 @@ const LiveQueryDetailsPageComponent = () => { - +

-
-
- - -

- -

-
+ +
), @@ -103,10 +97,7 @@ const LiveQueryDetailsPageComponent = () => { /> - { - // @ts-expect-error update types - data?.actionDetails?.fields?.agents?.length ?? '0' - } + {data?.actionDetails?.fields?.agents?.length ?? '0'}
@@ -123,17 +114,13 @@ const LiveQueryDetailsPageComponent = () => { /> - { - // @ts-expect-error update types - actionResultsData?.rawResponse?.aggregations?.responses?.buckets.find( - // @ts-expect-error update types - (bucket) => bucket.key === 'error' - )?.doc_count ?? '0' - } + + {actionResultsData?.aggregations.failed} + - + @@ -141,25 +128,16 @@ const LiveQueryDetailsPageComponent = () => { ), - [ - actionId, - // @ts-expect-error update types - actionResultsData?.rawResponse?.aggregations?.responses?.buckets, - // @ts-expect-error update types - data?.actionDetails?.fields?.agents?.length, - ] + [actionId, actionResultsData?.aggregations.failed, data?.actionDetails?.fields?.agents?.length] ); return ( - { - // @ts-expect-error update types - data?.actionDetails._source?.data?.query - } + {data?.actionDetails._source?.data?.query} - + ); }; diff --git a/x-pack/plugins/osquery/public/routes/live_query/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/index.tsx similarity index 83% rename from x-pack/plugins/osquery/public/routes/live_query/index.tsx rename to x-pack/plugins/osquery/public/routes/live_queries/index.tsx index 738f96087545c..af039e85e9785 100644 --- a/x-pack/plugins/osquery/public/routes/live_query/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/index.tsx @@ -11,9 +11,10 @@ import { Switch, Route, useRouteMatch } from 'react-router-dom'; import { LiveQueriesPage } from './list'; import { NewLiveQueryPage } from './new'; import { LiveQueryDetailsPage } from './details'; -import { LiveQueryAgentDetailsPage } from './agent_details'; +import { useBreadcrumbs } from '../../common/hooks/use_breadcrumbs'; const LiveQueriesComponent = () => { + useBreadcrumbs('live_queries'); const match = useRouteMatch(); return ( @@ -21,9 +22,6 @@ const LiveQueriesComponent = () => { - - - diff --git a/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx new file mode 100644 index 0000000000000..f5d2863b9e99b --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; + +import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; +import { ActionsTable } from '../../../actions/actions_table'; +import { WithHeaderLayout } from '../../../components/layouts'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; + +const LiveQueriesPageComponent = () => { + const hasSaveUICapabilities = useKibana().services.application.capabilities.osquery.save; + useBreadcrumbs('live_queries'); + const newQueryLinkProps = useRouterNavigate('live_queries/new'); + + const LeftColumn = useMemo( + () => ( + + + +

+ +

+ +
+
+
+ ), + [] + ); + + const RightColumn = useMemo( + () => ( + + + + ), + [newQueryLinkProps] + ); + + return ( + + + + ); +}; + +export const LiveQueriesPage = React.memo(LiveQueriesPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/live_query/new/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx similarity index 50% rename from x-pack/plugins/osquery/public/routes/live_query/new/index.tsx rename to x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx index 0aeb46da2a897..78304d4b29196 100644 --- a/x-pack/plugins/osquery/public/routes/live_query/new/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx @@ -5,16 +5,39 @@ * 2.0. */ -import { EuiButtonEmpty, EuiText, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; +import { useLocation } from 'react-router-dom'; +import qs from 'query-string'; import { WithHeaderLayout } from '../../../components/layouts'; import { useRouterNavigate } from '../../../common/lib/kibana'; -import { LiveQuery } from '../../../live_query'; +import { LiveQuery } from '../../../live_queries'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const NewLiveQueryPageComponent = () => { - const liveQueryListProps = useRouterNavigate('live_query'); + useBreadcrumbs('live_query_new'); + const location = useLocation(); + const liveQueryListProps = useRouterNavigate('live_queries'); + + const formDefaultValue = useMemo(() => { + const queryParams = qs.parse(location.search); + + if (queryParams?.agentPolicyId) { + return { + agentSelection: { + allAgentsSelected: false, + agents: [], + platformsSelected: [], + policiesSelected: [queryParams?.agentPolicyId], + }, + }; + } + + return undefined; + }, [location.search]); const LeftColumn = useMemo( () => ( @@ -22,30 +45,21 @@ const NewLiveQueryPageComponent = () => { - +

+

-
-
- - -

- -

-
+
), @@ -54,7 +68,7 @@ const NewLiveQueryPageComponent = () => { return ( - + ); }; diff --git a/x-pack/plugins/osquery/public/routes/live_query/agent_details/index.tsx b/x-pack/plugins/osquery/public/routes/live_query/agent_details/index.tsx deleted file mode 100644 index 266847a803c0d..0000000000000 --- a/x-pack/plugins/osquery/public/routes/live_query/agent_details/index.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiButtonEmpty, - EuiText, - EuiFlexGroup, - EuiFlexItem, - EuiCodeBlock, - EuiSpacer, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { useMemo } from 'react'; -import { useParams } from 'react-router-dom'; - -import { useRouterNavigate } from '../../../common/lib/kibana'; -import { WithHeaderLayout } from '../../../components/layouts'; -import { useActionDetails } from '../../../actions/use_action_details'; -import { ResultsTable } from '../../../results/results_table'; - -const LiveQueryAgentDetailsPageComponent = () => { - const { actionId, agentId } = useParams<{ actionId: string; agentId: string }>(); - const { data } = useActionDetails({ actionId }); - const liveQueryListProps = useRouterNavigate(`live_query/${actionId}`); - - const LeftColumn = useMemo( - () => ( - - - - - - - - -

- -

-
-
- - -

- -

-
-
-
- ), - [agentId, liveQueryListProps] - ); - - return ( - - - { - // @ts-expect-error update types - data?.actionDetails._source?.data?.query - } - - - - - ); -}; - -export const LiveQueryAgentDetailsPage = React.memo(LiveQueryAgentDetailsPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/live_query/list/index.tsx b/x-pack/plugins/osquery/public/routes/live_query/list/index.tsx deleted file mode 100644 index ed72fe704294d..0000000000000 --- a/x-pack/plugins/osquery/public/routes/live_query/list/index.tsx +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiText, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { useMemo } from 'react'; - -import { useRouterNavigate } from '../../../common/lib/kibana'; -import { ActionsTable } from '../../../actions/actions_table'; -import { WithHeaderLayout } from '../../../components/layouts'; - -const LiveQueriesPageComponent = () => { - const newQueryLinkProps = useRouterNavigate('live_query/new'); - - const LeftColumn = useMemo( - () => ( - - - -

- -

-
-
- - -

- -

-
-
-
- ), - [] - ); - - const RightColumn = useMemo( - () => ( - - {'New live query'} - - ), - [newQueryLinkProps] - ); - - return ( - - - - ); -}; - -export const LiveQueriesPage = React.memo(LiveQueriesPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/scheduled_query_groups/add/index.tsx b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/add/index.tsx new file mode 100644 index 0000000000000..3d5f25a0e3231 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/add/index.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; + +import { WithHeaderLayout } from '../../../components/layouts'; +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { ScheduledQueryGroupForm } from '../../../scheduled_query_groups/form'; +import { useOsqueryIntegration } from '../../../common/hooks'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; + +const AddScheduledQueryGroupPageComponent = () => { + useBreadcrumbs('scheduled_query_group_add'); + const scheduledQueryListProps = useRouterNavigate('scheduled_query_groups'); + const { data: osqueryIntegration } = useOsqueryIntegration(); + + const packageInfo = useMemo(() => { + if (!osqueryIntegration) return; + + return { + name: osqueryIntegration.name, + title: osqueryIntegration.title, + version: osqueryIntegration.version, + }; + }, [osqueryIntegration]); + + const LeftColumn = useMemo( + () => ( + + + + + + + + +

+ +

+ +
+
+
+ ), + [scheduledQueryListProps] + ); + + return ( + + {packageInfo && } + + ); +}; + +export const AddScheduledQueryGroupPage = React.memo(AddScheduledQueryGroupPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/live_query/details/actions_menu.tsx b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/actions_menu.tsx similarity index 60% rename from x-pack/plugins/osquery/public/routes/live_query/details/actions_menu.tsx rename to x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/actions_menu.tsx index 677b917e047b4..ccfb933afdad6 100644 --- a/x-pack/plugins/osquery/public/routes/live_query/details/actions_menu.tsx +++ b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/actions_menu.tsx @@ -5,10 +5,11 @@ * 2.0. */ +import { FormattedMessage } from '@kbn/i18n/react'; import { EuiButton, EuiContextMenuPanel, EuiContextMenuItem, EuiPopover } from '@elastic/eui'; import React, { useCallback, useMemo, useState } from 'react'; -import { useKibana } from '../../../common/lib/kibana'; +import { useDiscoverLink } from '../../../common/hooks'; interface LiveQueryDetailsActionsMenuProps { actionId: string; @@ -17,13 +18,9 @@ interface LiveQueryDetailsActionsMenuProps { const LiveQueryDetailsActionsMenuComponent: React.FC = ({ actionId, }) => { - const services = useKibana().services; + const discoverLinkProps = useDiscoverLink({ filters: [{ key: 'action_id', value: actionId }] }); const [isPopoverOpen, setPopover] = useState(false); - const discoverLinkHref = services?.application?.getUrlForApp('discover', { - path: `#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(columns:!(),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'logs-*',key:action_id,negate:!f,params:(query:'${actionId}'),type:phrase),query:(match_phrase:(action_id:'${actionId}')))),index:'logs-*',interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))`, - }); - const onButtonClick = useCallback(() => { setPopover((currentIsPopoverOpen) => !currentIsPopoverOpen); }, []); @@ -34,17 +31,26 @@ const LiveQueryDetailsActionsMenuComponent: React.FC [ - - Check results in Discover + + , ], - [discoverLinkHref] + [discoverLinkProps] ); - const button = ( - - Actions - + const button = useMemo( + () => ( + + + + ), + [onButtonClick] ); return ( diff --git a/x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/index.tsx b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/index.tsx new file mode 100644 index 0000000000000..abd81697fb024 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/details/index.tsx @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButtonEmpty, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiDescriptionList, + EuiDescriptionListTitle, + EuiDescriptionListDescription, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; +import { useParams } from 'react-router-dom'; +import styled from 'styled-components'; + +import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; +import { WithHeaderLayout } from '../../../components/layouts'; +import { useScheduledQueryGroup } from '../../../scheduled_query_groups/use_scheduled_query_group'; +import { ScheduledQueryGroupQueriesTable } from '../../../scheduled_query_groups/scheduled_query_group_queries_table'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { AgentsPolicyLink } from '../../../agent_policies/agents_policy_link'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; + +const Divider = styled.div` + width: 0; + height: 100%; + border-left: ${({ theme }) => theme.eui.euiBorderThin}; +`; + +const ScheduledQueryGroupDetailsPageComponent = () => { + const hasSaveUICapabilities = useKibana().services.application.capabilities.osquery.save; + const { scheduledQueryGroupId } = useParams<{ scheduledQueryGroupId: string }>(); + const scheduledQueryGroupsListProps = useRouterNavigate('scheduled_query_groups'); + const editQueryLinkProps = useRouterNavigate( + `scheduled_query_groups/${scheduledQueryGroupId}/edit` + ); + + const { data } = useScheduledQueryGroup({ scheduledQueryGroupId }); + + useBreadcrumbs('scheduled_query_group_details', { scheduledQueryGroupName: data?.name ?? '' }); + + const LeftColumn = useMemo( + () => ( + + + + + + + + +

+ +

+ +
+
+
+ ), + [data?.name, scheduledQueryGroupsListProps] + ); + + const RightColumn = useMemo( + () => ( + + + {/* eslint-disable-next-line react-perf/jsx-no-new-object-as-prop */} + + + + + + {data?.policy_id ? : null} + + + + {hasSaveUICapabilities ? ( + <> + + + + + + + + + + ) : undefined} + + ), + [data?.policy_id, editQueryLinkProps, hasSaveUICapabilities] + ); + + return ( + + {data && } + + ); +}; + +export const ScheduledQueryGroupDetailsPage = React.memo(ScheduledQueryGroupDetailsPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/scheduled_query_groups/edit/index.tsx b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/edit/index.tsx new file mode 100644 index 0000000000000..0d63dba2fd1e6 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/edit/index.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiLoadingContent } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; +import { useParams } from 'react-router-dom'; + +import { WithHeaderLayout } from '../../../components/layouts'; +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { ScheduledQueryGroupForm } from '../../../scheduled_query_groups/form'; +import { useScheduledQueryGroup } from '../../../scheduled_query_groups/use_scheduled_query_group'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; + +const EditScheduledQueryGroupPageComponent = () => { + const { scheduledQueryGroupId } = useParams<{ scheduledQueryGroupId: string }>(); + const queryDetailsLinkProps = useRouterNavigate( + `scheduled_query_groups/${scheduledQueryGroupId}` + ); + + const { data } = useScheduledQueryGroup({ scheduledQueryGroupId }); + + useBreadcrumbs('scheduled_query_group_edit', { scheduledQueryGroupName: data?.name ?? '' }); + + const LeftColumn = useMemo( + () => ( + + + + + + + + +

+ +

+ +
+
+
+ ), + [data?.name, queryDetailsLinkProps] + ); + + return ( + + {!data ? ( + + ) : ( + + )} + + ); +}; + +export const EditScheduledQueryGroupPage = React.memo(EditScheduledQueryGroupPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/scheduled_query_groups/index.tsx b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/index.tsx new file mode 100644 index 0000000000000..76ca2bf14d303 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/index.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { Switch, Route, useRouteMatch } from 'react-router-dom'; + +import { ScheduledQueryGroupsPage } from './list'; +import { AddScheduledQueryGroupPage } from './add'; +import { EditScheduledQueryGroupPage } from './edit'; +import { ScheduledQueryGroupDetailsPage } from './details'; +import { useBreadcrumbs } from '../../common/hooks/use_breadcrumbs'; + +const ScheduledQueryGroupsComponent = () => { + useBreadcrumbs('scheduled_query_groups'); + const match = useRouteMatch(); + + return ( + + + + + + + + + + + + + + + ); +}; + +export const ScheduledQueryGroups = React.memo(ScheduledQueryGroupsComponent); diff --git a/x-pack/plugins/osquery/public/routes/scheduled_query_groups/list/index.tsx b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/list/index.tsx new file mode 100644 index 0000000000000..9c5ebfdb79f9f --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/scheduled_query_groups/list/index.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; + +import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; +import { WithHeaderLayout } from '../../../components/layouts'; +import { ScheduledQueryGroupsTable } from '../../../scheduled_query_groups/scheduled_query_groups_table'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; + +const ScheduledQueryGroupsPageComponent = () => { + const hasSaveUICapabilities = useKibana().services.application.capabilities.osquery.save; + const newQueryLinkProps = useRouterNavigate('scheduled_query_groups/add'); + + const LeftColumn = useMemo( + () => ( + + + +

+ +

+ +
+
+
+ ), + [] + ); + + const RightColumn = useMemo( + () => ( + + + + ), + [newQueryLinkProps] + ); + + return ( + + + + ); +}; + +export const ScheduledQueryGroupsPage = React.memo(ScheduledQueryGroupsPageComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/common/osquery_stream_field.tsx b/x-pack/plugins/osquery/public/scheduled_query/common/osquery_stream_field.tsx deleted file mode 100644 index 6f589f6f64b13..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/common/osquery_stream_field.tsx +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { find } from 'lodash/fp'; -import { - EuiButtonIcon, - EuiFieldText, - EuiForm, - EuiFormRow, - EuiSelect, - EuiSpacer, - EuiSwitch, - EuiHorizontalRule, -} from '@elastic/eui'; -import React, { useCallback, useMemo } from 'react'; -import { useQuery } from 'react-query'; - -import { useKibana } from '../../common/lib/kibana'; - -// @ts-expect-error update types -const OsqueryStreamFieldComponent = ({ field, removeItem }) => { - const { http } = useKibana().services; - const { data: { saved_objects: savedQueries } = {} } = useQuery(['savedQueryList'], () => - http.get('/internal/osquery/saved_query', { - query: { pageIndex: 0, pageSize: 100, sortField: 'updated_at', sortDirection: 'desc' }, - }) - ); - - const { setValue } = field; - - const savedQueriesOptions = useMemo( - () => - // @ts-expect-error update types - (savedQueries ?? []).map((savedQuery) => ({ - text: savedQuery.attributes.name, - value: savedQuery.id, - })), - [savedQueries] - ); - - const handleSavedQueryChange = useCallback( - (event) => { - event.persist(); - const savedQueryId = event.target.value; - const savedQuery = find(['id', savedQueryId], savedQueries); - - if (savedQuery) { - // @ts-expect-error update types - setValue((prev) => ({ - ...prev, - vars: { - ...prev.vars, - id: { - ...prev.vars.id, - value: savedQuery.id, - }, - query: { - ...prev.vars.query, - value: savedQuery.attributes.query, - }, - }, - })); - } - }, - [savedQueries, setValue] - ); - - const handleEnabledChange = useCallback(() => { - // @ts-expect-error update types - setValue((prev) => ({ - ...prev, - enabled: !prev.enabled, - })); - }, [setValue]); - - const handleQueryChange = useCallback( - (event) => { - event.persist(); - // @ts-expect-error update types - setValue((prev) => ({ - ...prev, - vars: { - ...prev.vars, - query: { - ...prev.vars.query, - value: event.target.value, - }, - }, - })); - }, - [setValue] - ); - - const handleIntervalChange = useCallback( - (event) => { - event.persist(); - // @ts-expect-error update types - setValue((prev) => ({ - ...prev, - vars: { - ...prev.vars, - interval: { - ...prev.vars.interval, - value: event.target.value, - }, - }, - })); - }, - [setValue] - ); - - const handleIdChange = useCallback( - (event) => { - event.persist(); - // @ts-expect-error update types - setValue((prev) => ({ - ...prev, - vars: { - ...prev.vars, - id: { - ...prev.vars.id, - value: event.target.value, - }, - }, - })); - }, - [setValue] - ); - - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; - -export const OsqueryStreamField = React.memo(OsqueryStreamFieldComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/edit/form.tsx b/x-pack/plugins/osquery/public/scheduled_query/edit/form.tsx deleted file mode 100644 index 3e0e2b33efdae..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/edit/form.tsx +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import produce from 'immer'; -import { get, omit } from 'lodash/fp'; -import { EuiButton, EuiButtonEmpty, EuiSpacer, EuiHorizontalRule } from '@elastic/eui'; -import uuid from 'uuid'; -import React, { useMemo } from 'react'; - -import { - UseField, - useForm, - UseArray, - getUseField, - Field, - ToggleField, - Form, -} from '../../shared_imports'; - -import { OsqueryStreamField } from '../common/osquery_stream_field'; -import { schema } from './schema'; - -const CommonUseField = getUseField({ component: Field }); - -const EDIT_SCHEDULED_QUERY_FORM_ID = 'editScheduledQueryForm'; - -interface EditScheduledQueryFormProps { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - agentPolicies: Array>; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data: Array>; - handleSubmit: () => Promise; -} - -const EditScheduledQueryFormComponent: React.FC = ({ - agentPolicies, - data, - handleSubmit, -}) => { - const agentPoliciesOptions = useMemo( - () => - agentPolicies.map((policy) => ({ - value: policy.id, - text: policy.name, - })), - [agentPolicies] - ); - - const { form } = useForm({ - schema, - id: EDIT_SCHEDULED_QUERY_FORM_ID, - onSubmit: handleSubmit, - defaultValue: data, - // @ts-expect-error update types - deserializer: (payload) => { - const deserialized = produce(payload, (draft) => { - // @ts-expect-error update types - draft.inputs[0].streams.forEach((stream) => { - delete stream.compiled_stream; - }); - }); - - return deserialized; - }, - // @ts-expect-error update types - serializer: (payload) => - omit(['id', 'revision', 'created_at', 'created_by', 'updated_at', 'updated_by', 'version'], { - ...data, - ...payload, - // @ts-expect-error update types - inputs: [{ type: 'osquery', ...((payload.inputs && payload.inputs[0]) ?? {}) }], - }), - }); - - const { submit } = form; - - const policyIdComponentProps = useMemo( - () => ({ - euiFieldProps: { - disabled: true, - options: agentPoliciesOptions, - }, - }), - [agentPoliciesOptions] - ); - - return ( -
- - - - - - - - - - - {({ items, addItem, removeItem }) => ( - <> - {items.map((item) => ( - removeItem(item.id)} - defaultValue={ - // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop - get(item.path, form.getFormData()) ?? { - data_stream: { - type: 'logs', - dataset: 'osquery_elastic_managed.osquery', - }, - vars: { - query: { - type: 'text', - value: 'select * from uptime', - }, - interval: { - type: 'text', - value: '120', - }, - id: { - type: 'text', - value: uuid.v4(), - }, - }, - enabled: true, - } - } - /> - ))} - - {'Add query'} - - - )} - - - - - Save - - - ); -}; - -export const EditScheduledQueryForm = React.memo(EditScheduledQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/edit/index.tsx b/x-pack/plugins/osquery/public/scheduled_query/edit/index.tsx deleted file mode 100644 index 65dec2e467b35..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/edit/index.tsx +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { useParams } from 'react-router-dom'; -import { useMutation, useQuery } from 'react-query'; - -import { useKibana } from '../../common/lib/kibana'; -import { EditScheduledQueryForm } from './form'; - -const EditScheduledQueryPageComponent = () => { - const { http } = useKibana().services; - const { scheduledQueryId } = useParams<{ scheduledQueryId: string }>(); - - const { data } = useQuery(['scheduledQuery', { scheduledQueryId }], () => - http.get(`/internal/osquery/scheduled_query/${scheduledQueryId}`) - ); - - const { data: agentPolicies } = useQuery( - ['agentPolicy'], - () => http.get(`/api/fleet/agent_policies`), - { initialData: { items: [] } } - ); - - const updateScheduledQueryMutation = useMutation((payload) => - http.put(`/api/fleet/package_policies/${scheduledQueryId}`, { body: JSON.stringify(payload) }) - ); - - if (data) { - return ( - - ); - } - - return
Loading
; -}; - -export const EditScheduledQueryPage = React.memo(EditScheduledQueryPageComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/edit/schema.ts b/x-pack/plugins/osquery/public/scheduled_query/edit/schema.ts deleted file mode 100644 index 75a6d955c62ec..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/edit/schema.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FIELD_TYPES } from '../../shared_imports'; - -export const schema = { - policy_id: { - type: FIELD_TYPES.SELECT, - label: 'Policy', - }, - name: { - type: FIELD_TYPES.TEXT, - label: 'Name', - }, - description: { - type: FIELD_TYPES.TEXT, - label: 'Description', - }, - streams: { - type: FIELD_TYPES.MULTI_SELECT, - }, -}; diff --git a/x-pack/plugins/osquery/public/scheduled_query/index.tsx b/x-pack/plugins/osquery/public/scheduled_query/index.tsx deleted file mode 100644 index 205c87b3a0d50..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { Switch, Route, useRouteMatch } from 'react-router-dom'; - -import { ScheduledQueriesPage } from './queries'; -import { NewScheduledQueryPage } from './new'; -import { EditScheduledQueryPage } from './edit'; -// import { QueryAgentResults } from './agent_results'; -// import { SavedQueriesPage } from './saved_query'; - -const ScheduledQueriesComponent = () => { - const match = useRouteMatch(); - - return ( - - - - - {/* - - */} - - - - - - - - ); -}; - -export const ScheduledQueries = React.memo(ScheduledQueriesComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/new/form.tsx b/x-pack/plugins/osquery/public/scheduled_query/new/form.tsx deleted file mode 100644 index 186e74d190c6d..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/new/form.tsx +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiButtonEmpty, EuiSpacer } from '@elastic/eui'; -import deepmerge from 'deepmerge'; -import React, { useCallback } from 'react'; - -import { useForm, UseArray, UseField, getUseField, Field, Form } from '../../shared_imports'; - -import { OsqueryStreamField } from '../common/osquery_stream_field'; -import { defaultValue, schema } from './schema'; -import { combineMerge } from './utils'; - -const CommonUseField = getUseField({ component: Field }); - -const NEW_SCHEDULED_QUERY_FORM_ID = 'newScheduledQueryForm'; - -interface NewScheduledQueryFormProps { - handleSubmit: () => Promise; -} - -const NewScheduledQueryFormComponent: React.FC = ({ handleSubmit }) => { - const { form } = useForm({ - schema, - id: NEW_SCHEDULED_QUERY_FORM_ID, - options: { - stripEmptyFields: false, - }, - onSubmit: handleSubmit, - // @ts-expect-error update types - defaultValue, - serializer: (payload) => - deepmerge(defaultValue, payload, { - arrayMerge: combineMerge, - }), - }); - const { submit } = form; - - const StreamsContent = useCallback( - ({ items, addItem, removeItem }) => ( - <> - { - // @ts-expect-error update types - items.map((item) => ( - removeItem(item.id)} - // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop - defaultValue={{ - data_stream: { - type: 'logs', - dataset: 'osquery_elastic_managed.osquery', - }, - vars: { - query: { - type: 'text', - value: '', - }, - interval: { - type: 'text', - value: '', - }, - id: { - type: 'text', - value: '', - }, - }, - enabled: true, - }} - /> - )) - } - - {'Add query'} - - - ), - [] - ); - - return ( -
- - - - - - {StreamsContent} - - - - {'Save'} - - - ); -}; - -export const NewScheduledQueryForm = React.memo(NewScheduledQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/new/index.tsx b/x-pack/plugins/osquery/public/scheduled_query/new/index.tsx deleted file mode 100644 index bb4ae6f113de2..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/new/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { useHistory } from 'react-router-dom'; -import { useMutation } from 'react-query'; - -import { useKibana } from '../../common/lib/kibana'; -import { NewScheduledQueryForm } from './form'; - -const NewScheduledQueryPageComponent = () => { - const { http } = useKibana().services; - const history = useHistory(); - - const createScheduledQueryMutation = useMutation( - (payload) => http.post(`/api/fleet/package_policies`, { body: JSON.stringify(payload) }), - { - onSuccess: (data) => { - history.push(`/scheduled_queries/${data.item.id}`); - }, - } - ); - - // @ts-expect-error update types - return ; -}; - -export const NewScheduledQueryPage = React.memo(NewScheduledQueryPageComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query/new/schema.ts b/x-pack/plugins/osquery/public/scheduled_query/new/schema.ts deleted file mode 100644 index aef33e57f6f30..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/new/schema.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FIELD_TYPES } from '../../shared_imports'; - -export const defaultValue = { - name: '', - description: '', - namespace: 'default', - enabled: true, - policy_id: '1e2bb670-686c-11eb-84b4-81282a213fcf', - output_id: '', - package: { - name: 'osquery_elastic_managed', - title: 'OSquery Elastic Managed', - version: '0.1.2', - }, - inputs: [ - { - type: 'osquery', - enabled: true, - streams: [], - }, - ], -}; - -export const schema = { - name: { - type: FIELD_TYPES.TEXT, - label: 'Name', - }, - description: { - type: FIELD_TYPES.TEXT, - label: 'Description', - }, - namespace: { - type: FIELD_TYPES.TEXT, - }, - enabled: { - type: FIELD_TYPES.TOGGLE, - }, - policy_id: { - type: FIELD_TYPES.TEXT, - }, - inputs: { - enabled: { - type: FIELD_TYPES.TOGGLE, - }, - streams: { - type: FIELD_TYPES.MULTI_SELECT, - vars: { - query: { - type: { - type: FIELD_TYPES.TEXT, - }, - value: { - type: FIELD_TYPES.TEXT, - }, - }, - }, - }, - }, -}; diff --git a/x-pack/plugins/osquery/public/scheduled_query/new/utils.ts b/x-pack/plugins/osquery/public/scheduled_query/new/utils.ts deleted file mode 100644 index 2de5c90f19c0e..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/new/utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import deepmerge from 'deepmerge'; - -// @ts-expect-error update types -export const combineMerge = (target, source, options) => { - const destination = target.slice(); - - // @ts-expect-error update types - source.forEach((item, index) => { - if (typeof destination[index] === 'undefined') { - destination[index] = options.cloneUnlessOtherwiseSpecified(item, options); - } else if (options.isMergeableObject(item)) { - destination[index] = deepmerge(target[index], item, options); - } else if (target.indexOf(item) === -1) { - destination.push(item); - } - }); - return destination; -}; diff --git a/x-pack/plugins/osquery/public/scheduled_query/queries/index.tsx b/x-pack/plugins/osquery/public/scheduled_query/queries/index.tsx deleted file mode 100644 index 24a78320e30d2..0000000000000 --- a/x-pack/plugins/osquery/public/scheduled_query/queries/index.tsx +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiBasicTable, - EuiButton, - EuiButtonIcon, - EuiCodeBlock, - RIGHT_ALIGNMENT, -} from '@elastic/eui'; -import React, { useCallback, useMemo, useState } from 'react'; -import { useQuery } from 'react-query'; -import { useHistory } from 'react-router-dom'; - -import { Direction } from '../../../common/search_strategy'; -import { useKibana, useRouterNavigate } from '../../common/lib/kibana'; - -const ScheduledQueriesPageComponent = () => { - const { push } = useHistory(); - const [pageIndex, setPageIndex] = useState(0); - const [pageSize, setPageSize] = useState(5); - const [sortField, setSortField] = useState('updated_at'); - const [sortDirection, setSortDirection] = useState(Direction.desc); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState>({}); - const { http } = useKibana().services; - const newQueryLinkProps = useRouterNavigate('scheduled_queries/new'); - - const { data = {} } = useQuery( - ['scheduledQueryList', { pageIndex, pageSize, sortField, sortDirection }], - () => - http.get('/internal/osquery/scheduled_query', { - query: { - pageIndex, - pageSize, - sortField, - sortDirection, - }, - }), - { - keepPreviousData: true, - // Refetch the data every 5 seconds - refetchInterval: 5000, - } - ); - const { total = 0, items: savedQueries } = data; - - const toggleDetails = useCallback( - (item) => () => { - const itemIdToExpandedRowMapValues = { ...itemIdToExpandedRowMap }; - if (itemIdToExpandedRowMapValues[item.id]) { - delete itemIdToExpandedRowMapValues[item.id]; - } else { - // @ts-expect-error update types - itemIdToExpandedRowMapValues[item.id] = item.inputs[0].streams.map((stream) => ( - - {`${stream.vars.query.value} every ${stream.vars.interval.value}s`} - - )); - } - setItemIdToExpandedRowMap(itemIdToExpandedRowMapValues); - }, - [itemIdToExpandedRowMap] - ); - - const renderExtendedItemToggle = useCallback( - (item) => ( - - ), - [itemIdToExpandedRowMap, toggleDetails] - ); - - const handleEditClick = useCallback((item) => push(`/scheduled_queries/${item.id}`), [push]); - - const columns = useMemo( - () => [ - { - field: 'name', - name: 'Query name', - sortable: true, - truncateText: true, - }, - { - field: 'enabled', - name: 'Active', - sortable: true, - truncateText: true, - }, - { - field: 'updated_at', - name: 'Last updated at', - sortable: true, - truncateText: true, - }, - { - name: 'Actions', - actions: [ - { - name: 'Edit', - description: 'Edit or run this query', - type: 'icon', - icon: 'documentEdit', - onClick: handleEditClick, - }, - ], - }, - { - align: RIGHT_ALIGNMENT, - width: '40px', - isExpander: true, - render: renderExtendedItemToggle, - }, - ], - [handleEditClick, renderExtendedItemToggle] - ); - - const onTableChange = useCallback(({ page = {}, sort = {} }) => { - setPageIndex(page.index); - setPageSize(page.size); - setSortField(sort.field); - setSortDirection(sort.direction); - }, []); - - const pagination = useMemo( - () => ({ - pageIndex, - pageSize, - totalItemCount: total, - pageSizeOptions: [3, 5, 8], - }), - [total, pageIndex, pageSize] - ); - - const sorting = useMemo( - () => ({ - sort: { - field: sortField, - direction: sortDirection, - }, - }), - [sortDirection, sortField] - ); - - const selection = useMemo( - () => ({ - selectable: () => true, - initialSelected: [], - }), - [] - ); - - return ( -
- - {'New query'} - - - {savedQueries && ( - - )} -
- ); -}; - -export const ScheduledQueriesPage = React.memo(ScheduledQueriesPageComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/active_state_switch.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/active_state_switch.tsx new file mode 100644 index 0000000000000..1e06c1efd2c61 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/active_state_switch.tsx @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { produce } from 'immer'; +import { EuiSwitch, EuiLoadingSpinner } from '@elastic/eui'; +import React, { useCallback, useState } from 'react'; +import { useMutation, useQueryClient } from 'react-query'; +import styled from 'styled-components'; +import { i18n } from '@kbn/i18n'; + +import { + PackagePolicy, + UpdatePackagePolicy, + packagePolicyRouteService, +} from '../../../fleet/common'; +import { useKibana } from '../common/lib/kibana'; +import { useAgentStatus } from '../agents/use_agent_status'; +import { useAgentPolicy } from '../agent_policies/use_agent_policy'; +import { ConfirmDeployAgentPolicyModal } from './form/confirmation_modal'; + +const StyledEuiLoadingSpinner = styled(EuiLoadingSpinner)` + margin-right: ${({ theme }) => theme.eui.paddingSizes.s}; +`; + +interface ActiveStateSwitchProps { + item: PackagePolicy; +} + +const ActiveStateSwitchComponent: React.FC = ({ item }) => { + const queryClient = useQueryClient(); + const { + http, + notifications: { toasts }, + application: { + capabilities: { + osquery: { save: hasSaveUICapabilities }, + }, + }, + } = useKibana().services; + const [confirmationModal, setConfirmationModal] = useState(false); + + const hideConfirmationModal = useCallback(() => setConfirmationModal(false), []); + + const { data: agentStatus } = useAgentStatus({ policyId: item.policy_id }); + const { data: agentPolicy } = useAgentPolicy({ policyId: item.policy_id }); + + const { isLoading, mutate } = useMutation( + ({ id, ...payload }: UpdatePackagePolicy & { id: string }) => + http.put(packagePolicyRouteService.getUpdatePath(id), { + body: JSON.stringify(payload), + }), + { + onSuccess: (response) => { + queryClient.invalidateQueries('scheduledQueries'); + toasts.addSuccess( + response.item.enabled + ? i18n.translate( + 'xpack.osquery.scheduledQueryGroup.table.activatedSuccessToastMessageText', + { + defaultMessage: 'Successfully activated {scheduledQueryGroupName}', + values: { + scheduledQueryGroupName: response.item.name, + }, + } + ) + : i18n.translate( + 'xpack.osquery.scheduledQueryGroup.table.deactivatedSuccessToastMessageText', + { + defaultMessage: 'Successfully deactivated {scheduledQueryGroupName}', + values: { + scheduledQueryGroupName: response.item.name, + }, + } + ) + ); + }, + } + ); + + const handleToggleActive = useCallback(() => { + const updatedPolicy = produce< + UpdatePackagePolicy & { id: string }, + Omit & + Partial<{ + revision: number; + updated_at: string; + updated_by: string; + created_at: string; + created_by: string; + }> + >(item, (draft) => { + delete draft.revision; + delete draft.updated_at; + delete draft.updated_by; + delete draft.created_at; + delete draft.created_by; + + draft.enabled = !item.enabled; + draft.inputs[0].streams.forEach((stream) => { + delete stream.compiled_stream; + }); + + return draft; + }); + + mutate(updatedPolicy); + hideConfirmationModal(); + }, [hideConfirmationModal, item, mutate]); + + const handleToggleActiveClick = useCallback(() => { + if (agentStatus?.total) { + return setConfirmationModal(true); + } + + handleToggleActive(); + }, [agentStatus?.total, handleToggleActive]); + + return ( + <> + {isLoading && } + + {confirmationModal && agentStatus?.total && ( + + )} + + ); +}; + +export const ActiveStateSwitch = React.memo(ActiveStateSwitchComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/add_query_flyout.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/add_query_flyout.tsx new file mode 100644 index 0000000000000..b2cfa05e0fc63 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/add_query_flyout.tsx @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlyout, + EuiTitle, + EuiSpacer, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiFlyoutFooter, + EuiPortal, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiButton, +} from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; + +import { CodeEditorField } from '../../queries/form/code_editor_field'; +import { Form, useForm, FormData, getUseField, Field, FIELD_TYPES } from '../../shared_imports'; + +const FORM_ID = 'addQueryFlyoutForm'; + +const CommonUseField = getUseField({ component: Field }); + +interface AddQueryFlyoutProps { + onSave: (payload: FormData) => Promise; + onClose: () => void; +} + +const AddQueryFlyoutComponent: React.FC = ({ onSave, onClose }) => { + const { form } = useForm({ + id: FORM_ID, + // @ts-expect-error update types + onSubmit: (payload, isValid) => { + if (isValid) { + onSave(payload); + onClose(); + } + }, + schema: { + id: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.queryFlyoutForm.idFieldLabel', { + defaultMessage: 'ID', + }), + }, + query: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.queryFlyoutForm.queryFieldLabel', { + defaultMessage: 'Query', + }), + }, + interval: { + type: FIELD_TYPES.NUMBER, + label: i18n.translate( + 'xpack.osquery.scheduledQueryGroup.queryFlyoutForm.intervalFieldLabel', + { + defaultMessage: 'Interval (s)', + } + ), + }, + }, + }); + + const { submit } = form; + + return ( + + + + +

+ +

+
+
+ +
+ + + + + { + // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop + + } + +
+ + + + + + + + + + + + + + +
+
+ ); +}; + +export const AddQueryFlyout = React.memo(AddQueryFlyoutComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/confirmation_modal.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/confirmation_modal.tsx new file mode 100644 index 0000000000000..e686038430829 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/confirmation_modal.tsx @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiCallOut, EuiConfirmModal, EuiSpacer } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; + +import { AgentPolicy } from '../../../../fleet/common'; + +interface ConfirmDeployAgentPolicyModalProps { + onConfirm: () => void; + onCancel: () => void; + agentCount: number; + agentPolicy: AgentPolicy; +} + +const ConfirmDeployAgentPolicyModalComponent: React.FC = ({ + onConfirm, + onCancel, + agentCount, + agentPolicy, +}) => ( + + } + onCancel={onCancel} + onConfirm={onConfirm} + cancelButtonText={ + + } + confirmButtonText={ + + } + buttonColor="primary" + > + +
+ + + + +); + +export const ConfirmDeployAgentPolicyModal = React.memo(ConfirmDeployAgentPolicyModalComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/edit_query_flyout.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/edit_query_flyout.tsx new file mode 100644 index 0000000000000..41846636eccd4 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/edit_query_flyout.tsx @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlyout, + EuiTitle, + EuiSpacer, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiFlyoutFooter, + EuiPortal, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiButton, +} from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; + +import { PackagePolicyInputStream } from '../../../../fleet/common'; +import { CodeEditorField } from '../../queries/form/code_editor_field'; +import { Form, useForm, getUseField, Field, FIELD_TYPES } from '../../shared_imports'; + +const FORM_ID = 'editQueryFlyoutForm'; + +const CommonUseField = getUseField({ component: Field }); + +interface EditQueryFlyoutProps { + defaultValue: PackagePolicyInputStream; + onSave: (payload: FormData) => void; + onClose: () => void; +} + +export const EditQueryFlyout: React.FC = ({ + defaultValue, + onSave, + onClose, +}) => { + const { form } = useForm({ + id: FORM_ID, + // @ts-expect-error update types + onSubmit: (payload, isValid) => { + if (isValid) { + // @ts-expect-error update types + onSave(payload); + onClose(); + } + return; + }, + defaultValue, + deserializer: (payload) => ({ + id: payload.vars.id.value, + query: payload.vars.query.value, + interval: payload.vars.interval.value, + }), + schema: { + id: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.queryFlyoutForm.idFieldLabel', { + defaultMessage: 'ID', + }), + }, + query: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.queryFlyoutForm.queryFieldLabel', { + defaultMessage: 'Query', + }), + }, + interval: { + type: FIELD_TYPES.NUMBER, + label: i18n.translate( + 'xpack.osquery.scheduledQueryGroup.queryFlyoutForm.intervalFieldLabel', + { + defaultMessage: 'Interval (s)', + } + ), + }, + }, + }); + + const { submit } = form; + + return ( + + + + +

+ +

+
+
+ +
+ + + + + { + // eslint-disable-next-line react-perf/jsx-no-new-object-as-prop + + } + +
+ + + + + + + + + + + + + + +
+
+ ); +}; diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/index.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/index.tsx new file mode 100644 index 0000000000000..68652e13bed07 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/index.tsx @@ -0,0 +1,339 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mapKeys } from 'lodash'; +import { merge } from 'lodash/fp'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiButton, + EuiDescribedFormGroup, + EuiSpacer, + EuiAccordion, + EuiBottomBar, + EuiHorizontalRule, +} from '@elastic/eui'; +import React, { useCallback, useMemo, useState } from 'react'; +import { useMutation } from 'react-query'; +import { produce } from 'immer'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { + AgentPolicy, + PackagePolicy, + PackagePolicyPackage, + packagePolicyRouteService, +} from '../../../../fleet/common'; +import { Form, useForm, useFormData, getUseField, Field, FIELD_TYPES } from '../../shared_imports'; +import { useKibana, useRouterNavigate } from '../../common/lib/kibana'; +import { PolicyIdComboBoxField } from './policy_id_combobox_field'; +import { QueriesField } from './queries_field'; +import { ConfirmDeployAgentPolicyModal } from './confirmation_modal'; +import { useAgentPolicies } from '../../agent_policies'; + +const GhostFormField = () => <>; + +const FORM_ID = 'scheduledQueryForm'; + +const CommonUseField = getUseField({ component: Field }); + +interface ScheduledQueryGroupFormProps { + defaultValue?: PackagePolicy; + packageInfo?: PackagePolicyPackage; + editMode?: boolean; +} + +const ScheduledQueryGroupFormComponent: React.FC = ({ + defaultValue, + packageInfo, + editMode = false, +}) => { + const { + application: { navigateToApp }, + http, + notifications: { toasts }, + } = useKibana().services; + const [showConfirmationModal, setShowConfirmationModal] = useState(false); + const handleHideConfirmationModal = useCallback(() => setShowConfirmationModal(false), []); + + const { data: agentPolicies } = useAgentPolicies(); + const agentPoliciesById = mapKeys(agentPolicies, 'id'); + const agentPolicyOptions = useMemo( + () => + agentPolicies?.map((agentPolicy) => ({ + key: agentPolicy.id, + label: agentPolicy.id, + })) ?? [], + [agentPolicies] + ); + + const cancelButtonProps = useRouterNavigate( + `scheduled_query_groups/${editMode ? defaultValue?.id : ''}` + ); + + const { isLoading, mutateAsync } = useMutation( + (payload: Record) => + editMode && defaultValue?.id + ? http.put(packagePolicyRouteService.getUpdatePath(defaultValue.id), { + body: JSON.stringify(payload), + }) + : http.post(packagePolicyRouteService.getCreatePath(), { + body: JSON.stringify(payload), + }), + { + onSuccess: (data) => { + if (!editMode) { + navigateToApp('osquery', { path: `scheduled_query_groups/${data.item.id}` }); + toasts.addSuccess( + i18n.translate('xpack.osquery.scheduledQueryGroup.form.createSuccessToastMessageText', { + defaultMessage: 'Successfully scheduled {scheduledQueryGroupName}', + values: { + scheduledQueryGroupName: data.item.name, + }, + }) + ); + return; + } + + navigateToApp('osquery', { path: `scheduled_query_groups/${data.item.id}` }); + toasts.addSuccess( + i18n.translate('xpack.osquery.scheduledQueryGroup.form.updateSuccessToastMessageText', { + defaultMessage: 'Successfully updated {scheduledQueryGroupName}', + values: { + scheduledQueryGroupName: data.item.name, + }, + }) + ); + }, + onError: (error) => { + // @ts-expect-error update types + toasts.addError(error, { title: error.body.error, toastMessage: error.body.message }); + }, + } + ); + + const { form } = useForm({ + id: FORM_ID, + schema: { + name: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.form.nameFieldLabel', { + defaultMessage: 'Name', + }), + }, + description: { + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.form.descriptionFieldLabel', { + defaultMessage: 'Description', + }), + }, + namespace: { + type: FIELD_TYPES.COMBO_BOX, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.form.namespaceFieldLabel', { + defaultMessage: 'Namespace', + }), + }, + policy_id: { + type: FIELD_TYPES.COMBO_BOX, + label: i18n.translate('xpack.osquery.scheduledQueryGroup.form.agentPolicyFieldLabel', { + defaultMessage: 'Agent policy', + }), + }, + }, + onSubmit: (payload) => { + const formData = produce(payload, (draft) => { + // @ts-expect-error update types + draft.inputs[0].streams.forEach((stream) => { + delete stream.compiled_stream; + }); + return draft; + }); + return mutateAsync(formData); + }, + options: { + stripEmptyFields: false, + }, + // @ts-expect-error update types + deserializer: (payload) => ({ + ...payload, + policy_id: payload.policy_id.length ? [payload.policy_id] : [], + namespace: [payload.namespace], + }), + serializer: (payload) => ({ + ...payload, + // @ts-expect-error update types + policy_id: payload.policy_id[0], + // @ts-expect-error update types + namespace: payload.namespace[0], + }), + defaultValue: merge( + { + name: '', + description: '', + enabled: true, + policy_id: [], + namespace: 'default', + output_id: '', + package: packageInfo, + inputs: [ + { + type: 'osquery', + enabled: true, + streams: [], + }, + ], + }, + defaultValue ?? {} + ), + }); + + const { submit } = form; + + const policyIdEuiFieldProps = useMemo( + () => ({ isDisabled: !!defaultValue, options: agentPolicyOptions }), + [defaultValue, agentPolicyOptions] + ); + + const [{ policy_id: policyId }] = useFormData({ form, watch: ['policy_id'] }); + + const currentPolicy = useMemo(() => { + if (!policyId) { + return { + agentCount: 0, + agentPolicy: {} as AgentPolicy, + }; + } + + const currentAgentPolicy = agentPoliciesById[policyId[0]]; + return { + agentCount: currentAgentPolicy?.agents ?? 0, + agentPolicy: currentAgentPolicy, + }; + }, [agentPoliciesById, policyId]); + + const handleSaveClick = useCallback(() => { + if (currentPolicy.agentCount) { + setShowConfirmationModal(true); + return; + } + + submit(); + }, [currentPolicy.agentCount, submit]); + + const handleConfirmConfirmationClick = useCallback(() => { + submit(); + setShowConfirmationModal(false); + }, [submit]); + + return ( + <> +
+ + + + } + fullWidth + description={ + + } + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {showConfirmationModal && ( + + )} + + ); +}; + +export const ScheduledQueryGroupForm = React.memo(ScheduledQueryGroupFormComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/pack_uploader.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/pack_uploader.tsx new file mode 100644 index 0000000000000..f8c6f8ca263e2 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/pack_uploader.tsx @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mapKeys, kebabCase } from 'lodash'; +import { EuiLink, EuiFormRow, EuiFilePicker, EuiSpacer } from '@elastic/eui'; +import React, { useCallback, useState, useRef } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +const SUPPORTED_PACK_EXTENSIONS = ['application/json', 'text/plain']; + +const ExamplePackLink = React.memo(() => ( + + + +)); + +ExamplePackLink.displayName = 'ExamplePackLink'; + +interface OsqueryPackUploaderProps { + onChange: (payload: Record) => void; +} + +const OsqueryPackUploaderComponent: React.FC = ({ onChange }) => { + const packName = useRef(''); + const filePickerRef = useRef(null); + const [isInvalid, setIsInvalid] = useState(null); + // @ts-expect-error update types + let fileReader; + + const handleFileRead = () => { + // @ts-expect-error update types + const content = fileReader.result; + + let parsedContent; + + try { + parsedContent = JSON.parse(content.replaceAll('\\\n', ''), (key, value) => { + if (key === 'query') { + // remove any multiple spaces from the query + return value.replaceAll(/\s(?=\s)/gm, ''); + } + return value; + }); + + setIsInvalid(null); + } catch (error) { + setIsInvalid(error); + // @ts-expect-error update types + filePickerRef.current?.removeFiles(new Event('fake')); + } + + if (!parsedContent?.queries) { + return; + } + + const queriesJSON = mapKeys( + parsedContent?.queries, + (value, key) => `pack_${packName.current}_${key}` + ); + + onChange(queriesJSON); + // @ts-expect-error update types + filePickerRef.current?.removeFiles(new Event('fake')); + }; + + // @ts-expect-error update types + // eslint-disable-next-line react-hooks/exhaustive-deps + const handleFileChosen = (file) => { + fileReader = new FileReader(); + fileReader.onloadend = handleFileRead; + fileReader.readAsText(file); + }; + + const handleInputChange = useCallback( + (inputFiles) => { + if (!inputFiles.length) { + packName.current = ''; + return; + } + + if ( + inputFiles.length && + ((!!inputFiles[0].type.length && !SUPPORTED_PACK_EXTENSIONS.includes(inputFiles[0].type)) || + !inputFiles[0].name.endsWith('.conf')) + ) { + packName.current = ''; + setIsInvalid( + i18n.translate('xpack.osquery.packUploader.unsupportedFileTypeText', { + defaultMessage: + 'File type {fileType} is not supported, please upload {supportedFileTypes} config file', + values: { + fileType: inputFiles[0].type, + supportedFileTypes: SUPPORTED_PACK_EXTENSIONS.join(' or '), + }, + }) + ); + // @ts-expect-error update types + filePickerRef.current?.removeFiles(new Event('fake')); + return; + } + + packName.current = kebabCase(inputFiles[0].name.split('.')[0]); + handleFileChosen(inputFiles[0]); + }, + [handleFileChosen] + ); + + return ( + <> + + } + isInvalid={!!isInvalid} + error={<>{`${isInvalid}`}} + > + + + + ); +}; + +export const OsqueryPackUploader = React.memo(OsqueryPackUploaderComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/policy_id_combobox_field.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/policy_id_combobox_field.tsx new file mode 100644 index 0000000000000..75bb95b198f54 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/policy_id_combobox_field.tsx @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiFlexGroup, EuiFlexItem, EuiTextColor, EuiComboBoxOptionOption } from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; +import styled from 'styled-components'; + +import { GetAgentPoliciesResponseItem } from '../../../../fleet/common'; +import { ComboBoxField, FieldHook } from '../../shared_imports'; + +// Custom styling for drop down list items due to: +// 1) the max-width and overflow properties is added to prevent long agent policy +// names/descriptions from overflowing the flex items +// 2) max-width is built from the grow property on the flex items because the value +// changes based on if Fleet is enabled/setup or not +const AgentPolicyNameColumn = styled(EuiFlexItem)` + max-width: ${(props) => `${((props.grow as number) / 9) * 100}%`}; + overflow: hidden; +`; +const AgentPolicyDescriptionColumn = styled(EuiFlexItem)` + max-width: ${(props) => `${((props.grow as number) / 9) * 100}%`}; + overflow: hidden; +`; + +type ComboBoxFieldProps = Parameters[0]; + +type PolicyIdComboBoxFieldProps = Pick & { + field: FieldHook; + agentPoliciesById: Record; +}; + +const PolicyIdComboBoxFieldComponent: React.FC = ({ + euiFieldProps, + field, + agentPoliciesById, +}) => { + const { value } = field; + + const renderOption = useCallback( + (option: EuiComboBoxOptionOption) => ( + + + + {(option.key && agentPoliciesById[option.key]?.name) ?? option.label} + + + + + {(option.key && agentPoliciesById[option.key].description) ?? ''} + + + + + + + + + ), + [agentPoliciesById] + ); + + const selectedOptions = useMemo(() => { + if (!value?.length || !value[0].length) return []; + + return value.map((policyId) => ({ + label: agentPoliciesById[policyId]?.name ?? policyId, + })); + }, [agentPoliciesById, value]); + + const helpText = useMemo(() => { + if (!value?.length || !value[0].length || !agentPoliciesById || !agentPoliciesById[value[0]]) + return; + + return ( + + ); + }, [agentPoliciesById, value]); + + const mergedEuiFieldProps = useMemo( + () => ({ + onCreateOption: null, + singleSelection: { asPlainText: true }, + noSuggestions: false, + isClearable: false, + selectedOptions, + renderOption, + ...euiFieldProps, + }), + [euiFieldProps, renderOption, selectedOptions] + ); + + return ( + + ); +}; + +export const PolicyIdComboBoxField = React.memo(PolicyIdComboBoxFieldComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx new file mode 100644 index 0000000000000..2074c38e20fe9 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx @@ -0,0 +1,190 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { findIndex, forEach, pullAt } from 'lodash'; +import { EuiFlexGroup, EuiFlexItem, EuiButton, EuiSpacer } from '@elastic/eui'; +import { produce } from 'immer'; +import React, { useCallback, useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { PackagePolicyInput, PackagePolicyInputStream } from '../../../../fleet/common'; +import { OSQUERY_INTEGRATION_NAME } from '../../../common'; +import { FieldHook } from '../../shared_imports'; +import { ScheduledQueryGroupQueriesTable } from '../scheduled_query_group_queries_table'; +import { AddQueryFlyout } from './add_query_flyout'; +import { EditQueryFlyout } from './edit_query_flyout'; +import { OsqueryPackUploader } from './pack_uploader'; + +interface QueriesFieldProps { + field: FieldHook; + scheduledQueryGroupId: string; +} + +interface GetNewStreamProps { + id: string; + interval: string; + query: string; + scheduledQueryGroupId?: string; +} + +const getNewStream = ({ id, interval, query, scheduledQueryGroupId }: GetNewStreamProps) => ({ + data_stream: { type: 'logs', dataset: `${OSQUERY_INTEGRATION_NAME}.result` }, + enabled: true, + id: scheduledQueryGroupId + ? `osquery-${OSQUERY_INTEGRATION_NAME}.result-${scheduledQueryGroupId}` + : null, + vars: { + id: { type: 'text', value: id }, + type: 'integer', + interval: { + value: interval, + }, + query: { type: 'text', value: query }, + }, +}); + +const QueriesFieldComponent: React.FC = ({ field, scheduledQueryGroupId }) => { + const [showAddQueryFlyout, setShowAddQueryFlyout] = useState(false); + const [showEditQueryFlyout, setShowEditQueryFlyout] = useState(-1); + + const handleShowAddFlyout = useCallback(() => setShowAddQueryFlyout(true), []); + const handleHideAddFlyout = useCallback(() => setShowAddQueryFlyout(false), []); + const handleHideEditFlyout = useCallback(() => setShowEditQueryFlyout(-1), []); + + const { setValue } = field; + + const handleDeleteClick = useCallback( + (stream: PackagePolicyInputStream) => { + const streamIndex = findIndex(field.value[0].streams, [ + 'vars.id.value', + stream.vars?.id.value, + ]); + + if (streamIndex > -1) { + setValue( + produce((draft) => { + pullAt(draft[0].streams, [streamIndex]); + + return draft; + }) + ); + } + }, + [field.value, setValue] + ); + + const handleEditClick = useCallback( + (stream: PackagePolicyInputStream) => { + const streamIndex = findIndex(field.value[0].streams, [ + 'vars.id.value', + stream.vars?.id.value, + ]); + + setShowEditQueryFlyout(streamIndex); + }, + [field.value] + ); + + const handleEditQuery = useCallback( + (updatedQuery) => { + if (showEditQueryFlyout >= 0) { + setValue( + produce((draft) => { + draft[0].streams[showEditQueryFlyout].vars.id.value = updatedQuery.id; + draft[0].streams[showEditQueryFlyout].vars.interval.value = updatedQuery.interval; + draft[0].streams[showEditQueryFlyout].vars.query.value = updatedQuery.query; + + return draft; + }) + ); + } + + handleHideEditFlyout(); + }, + [handleHideEditFlyout, setValue, showEditQueryFlyout] + ); + + const handleAddQuery = useCallback( + (newQuery) => { + setValue( + produce((draft) => { + draft[0].streams.push( + getNewStream({ + ...newQuery, + scheduledQueryGroupId, + }) + ); + return draft; + }) + ); + handleHideAddFlyout(); + }, + [handleHideAddFlyout, scheduledQueryGroupId, setValue] + ); + + const handlePackUpload = useCallback( + (newQueries) => { + setValue( + produce((draft) => { + forEach(newQueries, (newQuery, newQueryId) => { + draft[0].streams.push( + getNewStream({ + id: newQueryId, + interval: newQuery.interval, + query: newQuery.query, + scheduledQueryGroupId, + }) + ); + }); + + return draft; + }) + ); + }, + [scheduledQueryGroupId, setValue] + ); + + return ( + <> + + + + + + + + + {field.value && field.value[0].streams?.length ? ( + + ) : null} + + {} + {showAddQueryFlyout && ( + // @ts-expect-error update types + + )} + {showEditQueryFlyout != null && showEditQueryFlyout >= 0 && ( + + )} + + ); +}; + +export const QueriesField = React.memo(QueriesFieldComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/index.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/index.tsx new file mode 100644 index 0000000000000..f97127a946558 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './scheduled_query_groups_table'; diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_group_queries_table.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_group_queries_table.tsx new file mode 100644 index 0000000000000..d501f56b789d7 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_group_queries_table.tsx @@ -0,0 +1,214 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useState, useMemo } from 'react'; +import { EuiInMemoryTable, EuiCodeBlock, EuiButtonIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { PackagePolicy, PackagePolicyInputStream } from '../../../fleet/common'; +import { FilterStateStore } from '../../../../../src/plugins/data/common'; +import { useKibana } from '../common/lib/kibana'; + +interface ViewResultsInDiscoverActionProps { + item: PackagePolicyInputStream; +} + +const ViewResultsInDiscoverAction: React.FC = ({ item }) => { + const urlGenerator = useKibana().services.discover?.urlGenerator; + const [discoverUrl, setDiscoverUrl] = useState(''); + + useEffect(() => { + const getDiscoverUrl = async () => { + if (!urlGenerator?.createUrl) return; + + const newUrl = await urlGenerator.createUrl({ + indexPatternId: 'logs-*', + filters: [ + { + meta: { + index: 'logs-*', + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key: 'action_id', + params: { query: item.vars?.id.value }, + }, + query: { match_phrase: { action_id: item.vars?.id.value } }, + $state: { store: FilterStateStore.APP_STATE }, + }, + ], + }); + setDiscoverUrl(newUrl); + }; + getDiscoverUrl(); + }, [item.vars?.id.value, urlGenerator]); + + return ( + + ); +}; + +interface ScheduledQueryGroupQueriesTableProps { + data: Pick; + editMode?: boolean; + onDeleteClick?: (item: PackagePolicyInputStream) => void; + onEditClick?: (item: PackagePolicyInputStream) => void; +} + +const ScheduledQueryGroupQueriesTableComponent: React.FC = ({ + data, + editMode = false, + onDeleteClick, + onEditClick, +}) => { + const renderDeleteAction = useCallback( + (item: PackagePolicyInputStream) => ( + onDeleteClick(item)} + iconType="trash" + aria-label={i18n.translate( + 'xpack.osquery.scheduledQueryGroup.queriesTable.deleteActionAriaLabel', + { + defaultMessage: 'Delete {queryName}', + values: { + queryName: item.vars?.id.value, + }, + } + )} + /> + ), + [onDeleteClick] + ); + + const renderEditAction = useCallback( + (item: PackagePolicyInputStream) => ( + onEditClick(item)} + iconType="pencil" + aria-label={i18n.translate( + 'xpack.osquery.scheduledQueryGroup.queriesTable.editActionAriaLabel', + { + defaultMessage: 'Edit {queryName}', + values: { + queryName: item.vars?.id.value, + }, + } + )} + /> + ), + [onEditClick] + ); + + const renderQueryColumn = useCallback( + (query: string) => ( + + {query} + + ), + [] + ); + + const renderDiscoverResultsAction = useCallback( + (item) => , + [] + ); + + const columns = useMemo( + () => [ + { + field: 'vars.id.value', + name: i18n.translate('xpack.osquery.scheduledQueryGroup.queriesTable.idColumnTitle', { + defaultMessage: 'ID', + }), + width: '20%', + }, + { + field: 'vars.interval.value', + name: i18n.translate('xpack.osquery.scheduledQueryGroup.queriesTable.intervalColumnTitle', { + defaultMessage: 'Interval', + }), + width: '100px', + }, + { + field: 'vars.query.value', + name: i18n.translate('xpack.osquery.scheduledQueryGroup.queriesTable.queryColumnTitle', { + defaultMessage: 'Query', + }), + render: renderQueryColumn, + }, + { + name: editMode + ? i18n.translate('xpack.osquery.scheduledQueryGroup.queriesTable.actionsColumnTitle', { + defaultMessage: 'Actions', + }) + : i18n.translate( + 'xpack.osquery.scheduledQueryGroup.queriesTable.viewResultsColumnTitle', + { + defaultMessage: 'View results', + } + ), + width: '120px', + actions: editMode + ? [ + { + render: renderEditAction, + }, + { + render: renderDeleteAction, + }, + ] + : [ + { + render: renderDiscoverResultsAction, + }, + ], + }, + ], + [editMode, renderDeleteAction, renderDiscoverResultsAction, renderEditAction, renderQueryColumn] + ); + + const sorting = useMemo( + () => ({ + sort: { + field: 'vars.id.value', + direction: 'asc' as const, + }, + }), + [] + ); + + return ( + + items={data.inputs[0].streams} + itemId="vars.id.value" + isExpandable={true} + columns={columns} + sorting={sorting} + /> + ); +}; + +export const ScheduledQueryGroupQueriesTable = React.memo(ScheduledQueryGroupQueriesTableComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx new file mode 100644 index 0000000000000..7b5f91157132e --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiInMemoryTable, EuiBasicTableColumn, EuiLink } from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; + +import { i18n } from '@kbn/i18n'; +import { PackagePolicy } from '../../../fleet/common'; +import { useRouterNavigate } from '../common/lib/kibana'; +import { useScheduledQueryGroups } from './use_scheduled_query_groups'; +import { ActiveStateSwitch } from './active_state_switch'; +import { AgentsPolicyLink } from '../agent_policies/agents_policy_link'; + +const ScheduledQueryNameComponent = ({ id, name }: { id: string; name: string }) => ( + {name} +); + +const ScheduledQueryName = React.memo(ScheduledQueryNameComponent); + +const renderName = (_: unknown, item: PackagePolicy) => ( + +); + +const ScheduledQueryGroupsTableComponent = () => { + const { data } = useScheduledQueryGroups(); + + const renderAgentPolicy = useCallback((policyId) => , []); + + const renderQueries = useCallback( + (streams: PackagePolicy['inputs'][0]['streams']) => <>{streams.length}, + [] + ); + + const renderActive = useCallback((_, item) => , []); + + const columns: Array> = useMemo( + () => [ + { + field: 'name', + name: i18n.translate('xpack.osquery.scheduledQueryGroups.table.nameColumnTitle', { + defaultMessage: 'Name', + }), + sortable: true, + render: renderName, + }, + { + field: 'policy_id', + name: i18n.translate('xpack.osquery.scheduledQueryGroups.table.policyColumnTitle', { + defaultMessage: 'Policy', + }), + truncateText: true, + render: renderAgentPolicy, + }, + { + field: 'inputs[0].streams', + name: i18n.translate( + 'xpack.osquery.scheduledQueryGroups.table.numberOfQueriesColumnTitle', + { + defaultMessage: 'Number of queries', + } + ), + render: renderQueries, + width: '150px', + }, + { + field: 'enabled', + name: i18n.translate('xpack.osquery.scheduledQueryGroups.table.activeColumnTitle', { + defaultMessage: 'Active', + }), + sortable: true, + align: 'right', + width: '80px', + render: renderActive, + }, + ], + [renderActive, renderAgentPolicy, renderQueries] + ); + + const sorting = useMemo( + () => ({ + sort: { + field: 'name', + direction: 'asc' as const, + }, + }), + [] + ); + + return ( + + // eslint-disable-next-line react-perf/jsx-no-new-array-as-prop + items={data?.items ?? []} + columns={columns} + pagination={true} + sorting={sorting} + /> + ); +}; + +export const ScheduledQueryGroupsTable = React.memo(ScheduledQueryGroupsTableComponent); diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_group.ts b/x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_group.ts new file mode 100644 index 0000000000000..e0f892d0302c0 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_group.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { useKibana } from '../common/lib/kibana'; +import { + GetOnePackagePolicyResponse, + PackagePolicy, + packagePolicyRouteService, +} from '../../../fleet/common'; + +interface UseScheduledQueryGroup { + scheduledQueryGroupId: string; + skip?: boolean; +} + +export const useScheduledQueryGroup = ({ + scheduledQueryGroupId, + skip = false, +}: UseScheduledQueryGroup) => { + const { http } = useKibana().services; + + return useQuery( + ['scheduledQueryGroup', { scheduledQueryGroupId }], + () => http.get(packagePolicyRouteService.getInfoPath(scheduledQueryGroupId)), + { + keepPreviousData: true, + enabled: !skip, + select: (response) => response.item, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_groups.ts b/x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_groups.ts new file mode 100644 index 0000000000000..3302d8e621eb7 --- /dev/null +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/use_scheduled_query_groups.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { produce } from 'immer'; +import { useQuery } from 'react-query'; + +import { useKibana } from '../common/lib/kibana'; +import { + ListResult, + PackagePolicy, + packagePolicyRouteService, + PACKAGE_POLICY_SAVED_OBJECT_TYPE, +} from '../../../fleet/common'; +import { OSQUERY_INTEGRATION_NAME } from '../../common'; + +export const useScheduledQueryGroups = () => { + const { http } = useKibana().services; + + return useQuery>( + ['scheduledQueries'], + () => + http.get(packagePolicyRouteService.getListPath(), { + query: { + page: 1, + perPage: 10000, + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: ${OSQUERY_INTEGRATION_NAME}`, + }, + }), + { + keepPreviousData: true, + select: produce((draft: ListResult) => { + draft.items = draft.items.filter( + (item) => + !( + item.inputs[0].streams.length === 1 && + !item.inputs[0].streams[0].compiled_stream.query + ) + ); + }), + } + ); +}; diff --git a/x-pack/plugins/osquery/public/shared_imports.ts b/x-pack/plugins/osquery/public/shared_imports.ts index 42e82b25d1b8f..bae73da78f704 100644 --- a/x-pack/plugins/osquery/public/shared_imports.ts +++ b/x-pack/plugins/osquery/public/shared_imports.ts @@ -28,6 +28,7 @@ export { } from '../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; export { Field, + ComboBoxField, ToggleField, SelectField, } from '../../../../src/plugins/es_ui_shared/static/forms/components'; diff --git a/x-pack/plugins/osquery/public/types.ts b/x-pack/plugins/osquery/public/types.ts index 02b5fc9c7a5d6..f1dbec045dacc 100644 --- a/x-pack/plugins/osquery/public/types.ts +++ b/x-pack/plugins/osquery/public/types.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { DiscoverStart } from '../../../../src/plugins/discover/public'; import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; import { FleetStart } from '../../fleet/public'; import { CoreStart } from '../../../../src/core/public'; @@ -24,8 +25,9 @@ export interface AppPluginStartDependencies { } export interface StartPlugins { + discover: DiscoverStart; data: DataPublicPluginStart; - fleet?: FleetStart; + fleet: FleetStart; triggersActionsUi: TriggersAndActionsUIPublicPluginStart; } diff --git a/x-pack/plugins/osquery/server/config.ts b/x-pack/plugins/osquery/server/config.ts index 31be256611803..58b9a8bf910c2 100644 --- a/x-pack/plugins/osquery/server/config.ts +++ b/x-pack/plugins/osquery/server/config.ts @@ -9,6 +9,9 @@ import { TypeOf, schema } from '@kbn/config-schema'; export const ConfigSchema = schema.object({ enabled: schema.boolean({ defaultValue: false }), + actionEnabled: schema.boolean({ defaultValue: false }), + savedQueries: schema.boolean({ defaultValue: false }), + packs: schema.boolean({ defaultValue: false }), }); export type ConfigType = TypeOf; diff --git a/x-pack/plugins/osquery/server/index.ts b/x-pack/plugins/osquery/server/index.ts index f19d47cbeffb3..30bc5ed5bd835 100644 --- a/x-pack/plugins/osquery/server/index.ts +++ b/x-pack/plugins/osquery/server/index.ts @@ -13,6 +13,9 @@ export const config = { schema: ConfigSchema, exposeToBrowser: { enabled: true, + actionEnabled: true, + savedQueries: true, + packs: true, }, }; export function plugin(initializerContext: PluginInitializerContext) { diff --git a/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts b/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts index ffe2a772ecb7f..5b1f8e780494d 100644 --- a/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts +++ b/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts @@ -68,7 +68,7 @@ export class OsqueryAppContextService { */ export interface OsqueryAppContext { logFactory: LoggerFactory; - config(): Promise; + config(): ConfigType; /** * Object readiness is tied to plugin start method diff --git a/x-pack/plugins/osquery/server/plugin.ts b/x-pack/plugins/osquery/server/plugin.ts index ce6e8d51d9b52..2a6e4dc5b1f48 100644 --- a/x-pack/plugins/osquery/server/plugin.ts +++ b/x-pack/plugins/osquery/server/plugin.ts @@ -5,9 +5,9 @@ * 2.0. */ -// import { curry } from 'lodash'; -// import { ActionTypeExecutorResult } from '../../actions/server/types'; +import { i18n } from '@kbn/i18n'; import { + DEFAULT_APP_CATEGORIES, PluginInitializerContext, CoreSetup, CoreStart, @@ -19,7 +19,7 @@ import { createConfig } from './create_config'; import { OsqueryPluginSetup, OsqueryPluginStart, SetupPlugins, StartPlugins } from './types'; import { defineRoutes } from './routes'; import { osquerySearchStrategyProvider } from './search_strategy/osquery'; -// import { initSavedObjects } from './saved_objects'; +import { initSavedObjects } from './saved_objects'; import { OsqueryAppContext, OsqueryAppContextService } from './lib/osquery_app_context_services'; import { ConfigType } from './config'; @@ -46,18 +46,45 @@ export class OsqueryPlugin implements Plugin => Promise.resolve(config), + config: (): ConfigType => config, }; - // initSavedObjects(core.savedObjects); - defineRoutes(router, osqueryContext); + plugins.features.registerKibanaFeature({ + id: 'osquery', + name: i18n.translate('xpack.osquery.featureRegistry.osqueryFeatureName', { + defaultMessage: 'Osquery', + }), + order: 4000, + category: DEFAULT_APP_CATEGORIES.management, + app: ['osquery', 'kibana'], + catalogue: ['osquery'], + // see x-pack/plugins/features/common/feature_kibana_privileges.ts + privileges: { + all: { + app: ['osquery', 'kibana'], + api: ['osquery', 'osquery_write'], + catalogue: ['osquery'], + savedObject: { + all: [], + read: [], + }, + ui: ['show', 'save'], + }, + read: { + app: ['osquery', 'kibana'], + api: ['osquery'], + catalogue: ['osquery'], + savedObject: { + all: [], + read: [], + }, + ui: ['show'], + }, + }, + }); - // plugins.actions.registerType({ - // id: '.osquery', - // name: 'Osquery', - // minimumLicenseRequired: 'gold', - // executor: curry(executor)({}), - // }); + initSavedObjects(core.savedObjects, osqueryContext); + defineRoutes(router, osqueryContext); core.getStartServices().then(([, depsStart]) => { const osquerySearchStrategy = osquerySearchStrategyProvider(depsStart.data); @@ -89,7 +116,3 @@ export class OsqueryPlugin implements Plugin> { -// return { status: 'ok', data: {}, actionId: execOptions.actionId }; -// } diff --git a/x-pack/plugins/osquery/server/routes/action/create_action_route.ts b/x-pack/plugins/osquery/server/routes/action/create_action_route.ts index 7068243cc0fb7..8e741c6a9e3ca 100644 --- a/x-pack/plugins/osquery/server/routes/action/create_action_route.ts +++ b/x-pack/plugins/osquery/server/routes/action/create_action_route.ts @@ -5,13 +5,11 @@ * 2.0. */ -import { find } from 'lodash/fp'; import uuid from 'uuid'; -import { schema } from '@kbn/config-schema'; import moment from 'moment'; +import { schema } from '@kbn/config-schema'; import { IRouter } from '../../../../../../src/core/server'; -import { packSavedObjectType, savedQuerySavedObjectType } from '../../../common/types'; import { OsqueryAppContext } from '../../lib/osquery_app_context_services'; import { parseAgentSelection, AgentSelection } from '../../lib/parse_agent_groups'; @@ -24,86 +22,19 @@ export const createActionRoute = (router: IRouter, osqueryContext: OsqueryAppCon params: schema.object({}, { unknowns: 'allow' }), body: schema.object({}, { unknowns: 'allow' }), }, + options: { + tags: ['access:osquery', 'access:osquery_write'], + }, }, async (context, request, response) => { - const esClient = context.core.elasticsearch.client.asInternalUser; + const esClient = context.core.elasticsearch.client.asCurrentUser; const { agentSelection } = request.body as { agentSelection: AgentSelection }; const selectedAgents = await parseAgentSelection(esClient, osqueryContext, agentSelection); - // @ts-expect-error update validation - if (request.body.pack_id) { - const savedObjectsClient = context.core.savedObjects.client; - const { attributes, references, ...rest } = await savedObjectsClient.get<{ - title: string; - description: string; - queries: Array<{ name: string; interval: string }>; - }>( - packSavedObjectType, - // @ts-expect-error update types - request.body.pack_id - ); - - const pack = { - ...rest, - ...attributes, - queries: - attributes.queries?.map((packQuery) => { - const queryReference = find(['name', packQuery.name], references); - - if (queryReference) { - return { - ...packQuery, - id: queryReference?.id, - }; - } - - return packQuery; - }) ?? [], - }; - - const { saved_objects: queriesSavedObjects } = await savedObjectsClient.bulkGet( - pack.queries.map((packQuery) => ({ - // @ts-expect-error update validation - id: packQuery.id, - type: savedQuerySavedObjectType, - })) - ); - - const actionId = uuid.v4(); - - const actions = queriesSavedObjects.map((query) => ({ - action_id: actionId, - '@timestamp': moment().toISOString(), - expiration: moment().add(2, 'days').toISOString(), - type: 'INPUT_ACTION', - input_type: 'osquery', - agents: selectedAgents, - data: { - id: query.id, - // @ts-expect-error update validation - query: query.attributes.query, - }, - })); - - const query = await esClient.bulk<{}>({ - index: '.fleet-actions', - // @ts-expect-error update validation - body: actions.reduce((acc, action) => { - return [...acc, { create: { _index: '.fleet-actions' } }, action]; - }, []), - }); - - return response.ok({ - body: { - actions, - query, - }, - }); - } const action = { action_id: uuid.v4(), '@timestamp': moment().toISOString(), - expiration: moment().add(2, 'days').toISOString(), + expiration: moment().add(1, 'days').toISOString(), type: 'INPUT_ACTION', input_type: 'osquery', agents: selectedAgents, @@ -114,15 +45,15 @@ export const createActionRoute = (router: IRouter, osqueryContext: OsqueryAppCon query: request.body.query.query, }, }; - const query = await esClient.index<{}, {}>({ + const actionResponse = await esClient.index<{}, {}>({ index: '.fleet-actions', body: action, }); return response.ok({ body: { - response: query, - action, + response: actionResponse, + actions: [action], }, }); } diff --git a/x-pack/plugins/osquery/server/routes/index.ts b/x-pack/plugins/osquery/server/routes/index.ts index 59d4085a77be1..7eee5b94fd84d 100644 --- a/x-pack/plugins/osquery/server/routes/index.ts +++ b/x-pack/plugins/osquery/server/routes/index.ts @@ -6,15 +6,21 @@ */ import { IRouter } from '../../../../../src/core/server'; -import { initSavedQueryRoutes } from './saved_query'; -import { initScheduledQueryRoutes } from './scheduled_query'; import { initActionRoutes } from './action'; import { OsqueryAppContext } from '../lib/osquery_app_context_services'; +import { initSavedQueryRoutes } from './saved_query'; import { initPackRoutes } from './pack'; export const defineRoutes = (router: IRouter, context: OsqueryAppContext) => { + const config = context.config(); + initActionRoutes(router, context); - initPackRoutes(router); - initSavedQueryRoutes(router); - initScheduledQueryRoutes(router, context); + + if (config.packs) { + initPackRoutes(router); + } + + if (config.savedQueries) { + initSavedQueryRoutes(router); + } }; diff --git a/x-pack/plugins/osquery/server/routes/scheduled_query/find_scheduled_query_route.ts b/x-pack/plugins/osquery/server/routes/scheduled_query/find_scheduled_query_route.ts index b9058a2868763..43d5f3fc893f0 100644 --- a/x-pack/plugins/osquery/server/routes/scheduled_query/find_scheduled_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/scheduled_query/find_scheduled_query_route.ts @@ -6,8 +6,10 @@ */ import { schema } from '@kbn/config-schema'; +import { OSQUERY_INTEGRATION_NAME } from '../../../common'; import { IRouter } from '../../../../../../src/core/server'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../../fleet/common'; import { OsqueryAppContext } from '../../lib/osquery_app_context_services'; export const findScheduledQueryRoute = (router: IRouter, osqueryContext: OsqueryAppContext) => { @@ -19,7 +21,7 @@ export const findScheduledQueryRoute = (router: IRouter, osqueryContext: Osquery }, }, async (context, request, response) => { - const kuery = 'ingest-package-policies.attributes.package.name: osquery_elastic_managed'; + const kuery = `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.attributes.package.name: ${OSQUERY_INTEGRATION_NAME}`; const packagePolicyService = osqueryContext.service.getPackagePolicyService(); const policies = await packagePolicyService?.list(context.core.savedObjects.client, { kuery, diff --git a/x-pack/plugins/osquery/server/saved_objects.ts b/x-pack/plugins/osquery/server/saved_objects.ts index 15a0f8e2be0da..c6be1098cedb2 100644 --- a/x-pack/plugins/osquery/server/saved_objects.ts +++ b/x-pack/plugins/osquery/server/saved_objects.ts @@ -7,12 +7,24 @@ import { CoreSetup } from '../../../../src/core/server'; +import { OsqueryAppContext } from './lib/osquery_app_context_services'; import { savedQueryType, packType } from './lib/saved_query/saved_object_mappings'; const types = [savedQueryType, packType]; export const savedObjectTypes = types.map((type) => type.name); -export const initSavedObjects = (savedObjects: CoreSetup['savedObjects']) => { - types.forEach((type) => savedObjects.registerType(type)); +export const initSavedObjects = ( + savedObjects: CoreSetup['savedObjects'], + osqueryContext: OsqueryAppContext +) => { + const config = osqueryContext.config(); + + if (config.savedQueries) { + savedObjects.registerType(savedQueryType); + } + + if (config.packs) { + savedObjects.registerType(packType); + } }; diff --git a/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts b/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts index 75e6201545a8e..e8a8fbd63a84d 100644 --- a/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts +++ b/x-pack/plugins/osquery/server/search_strategy/osquery/factory/actions/results/query.action_results.dsl.ts @@ -12,8 +12,8 @@ import { createQueryFilterClauses } from '../../../../../../common/utils/build_q export const buildActionResultsQuery = ({ actionId, filterQuery, + // pagination: { activePage, querySize }, sort, - pagination: { activePage, querySize }, }: ActionResultsRequestOptions): ISearchRequestParams => { const filter = [ ...createQueryFilterClauses(filterQuery), @@ -30,18 +30,39 @@ export const buildActionResultsQuery = ({ ignoreUnavailable: true, body: { aggs: { - responses: { - terms: { - script: { - lang: 'painless', - source: "if (doc['error'].size()==0) { return 'success' } else { return 'error' }", + aggs: { + global: {}, + aggs: { + responses_by_action_id: { + filter: { + bool: { + must: [ + { + match: { + action_id: actionId, + }, + }, + ], + }, + }, + aggs: { + responses: { + terms: { + script: { + lang: 'painless', + source: + "if (doc['error.keyword'].size()==0) { return 'success' } else { return 'error' }", + }, + }, + }, + }, }, }, }, }, query: { bool: { filter } }, - from: activePage * querySize, - size: querySize, + // from: activePage * querySize, + size: 10000, // querySize, track_total_hits: true, fields: ['*'], sort: [ diff --git a/x-pack/plugins/osquery/server/search_strategy/osquery/factory/results/query.all_results.dsl.ts b/x-pack/plugins/osquery/server/search_strategy/osquery/factory/results/query.all_results.dsl.ts index 04ba05532cd0d..ac36f4b31e5fc 100644 --- a/x-pack/plugins/osquery/server/search_strategy/osquery/factory/results/query.all_results.dsl.ts +++ b/x-pack/plugins/osquery/server/search_strategy/osquery/factory/results/query.all_results.dsl.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { OSQUERY_INTEGRATION_NAME } from '../../../../../common'; import { ISearchRequestParams } from '../../../../../../../../src/plugins/data/common'; import { ResultsRequestOptions } from '../../../../../common/search_strategy'; import { createQueryFilterClauses } from '../../../../../common/utils/build_query'; @@ -13,7 +14,7 @@ export const buildResultsQuery = ({ actionId, agentId, filterQuery, - // sort, + sort, pagination: { activePage, querySize }, }: ResultsRequestOptions): ISearchRequestParams => { const filter = [ @@ -36,21 +37,29 @@ export const buildResultsQuery = ({ const dslQuery = { allowNoIndices: true, - index: 'logs-elastic_agent.osquery*', + index: `logs-${OSQUERY_INTEGRATION_NAME}.result*`, ignoreUnavailable: true, body: { + aggs: { + count_by_agent_id: { + terms: { + field: 'agent.id', + size: 10000, + }, + }, + }, query: { bool: { filter } }, from: activePage * querySize, size: querySize, track_total_hits: true, fields: agentId ? ['osquery.*'] : ['agent.*', 'osquery.*'], - // sort: [ - // { - // [sort.field]: { - // order: [sort.direction], - // }, - // }, - // ], + sort: [ + { + [sort.field]: { + order: sort.direction, + }, + }, + ], }, }; diff --git a/x-pack/plugins/osquery/server/types.ts b/x-pack/plugins/osquery/server/types.ts index dd9d45b2c3cc6..1882e52074660 100644 --- a/x-pack/plugins/osquery/server/types.ts +++ b/x-pack/plugins/osquery/server/types.ts @@ -11,6 +11,7 @@ import { PluginStart as DataPluginStart, } from '../../../../src/plugins/data/server'; import { FleetStartContract } from '../../fleet/server'; +import { PluginSetupContract } from '../../features/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface OsqueryPluginSetup {} @@ -20,6 +21,7 @@ export interface OsqueryPluginStart {} export interface SetupPlugins { actions: ActionsPlugin['setup']; data: DataPluginSetup; + features: PluginSetupContract; } export interface StartPlugins { diff --git a/yarn.lock b/yarn.lock index c1b0fe1d1be4a..528d7f682ac74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23724,10 +23724,10 @@ react-popper@^2.2.4: react-fast-compare "^3.0.1" warning "^4.0.2" -react-query@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.12.0.tgz#a2082a167f3e394e84dfd3cec0f8c7503abf33dc" - integrity sha512-WJYECeZ6xT2oxIlgqXUjLNLWRvJbeelXscVnAFfyUFgO21OYEYHMWPG61V9W57EUUqrXioQsNPsU9XyddfEvXQ== +react-query@^3.13.10: + version "3.13.10" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.13.10.tgz#b6a05e22a5debb6e2df79ada588179771cbd7df8" + integrity sha512-wFvKhEDnOVL5bFL+9KPgNsiOOei1Ad+l6l1awCBuoX7xMG+SXXKDOF2uuZFsJe0w6gdthdWN+00021yepTR31g== dependencies: "@babel/runtime" "^7.5.5" broadcast-channel "^3.4.1" From 71e81189841982aaaa2a21861300a641084c2f95 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Mon, 19 Apr 2021 13:46:18 -0500 Subject: [PATCH 47/82] [ML] Fix runtime mapping texts to runtime fields, add transform switch modal (#97008) --- .../common/util/runtime_field_utils.test.ts | 6 +- .../configuration_step_form.tsx | 4 +- .../runtime_mappings/runtime_mappings.tsx | 122 +++++++++++------- .../runtime_mappings/switch_modal.tsx | 56 ++++++++ .../util/filter_runtime_mappings.test.ts | 10 +- .../results_service/results_service.js | 2 +- .../models/data_visualizer/data_visualizer.ts | 2 +- .../job_validation/validate_cardinality.ts | 2 +- .../routes/schemas/data_visualizer_schema.ts | 6 +- .../common/api_schemas/field_histograms.ts | 2 +- .../public/app/common/request.test.ts | 2 +- .../advanced_pivot_editor_switch.tsx | 3 - .../advanced_query_editor_switch.tsx | 8 +- ...dvanced_runtime_mappings_editor_switch.tsx | 61 ++++++--- .../switch_modal.tsx | 53 ++++++++ .../advanced_runtime_mappings_settings.tsx | 16 +-- .../apply_transform_config_to_define_state.ts | 2 +- .../filter_agg/components/filter_agg_form.tsx | 2 +- .../use_advanced_runtime_mappings_editor.ts | 5 +- .../step_define/hooks/use_step_define_form.ts | 2 +- .../translations/translations/ja-JP.json | 5 - .../translations/translations/zh-CN.json | 5 - .../classification_creation.ts | 7 +- .../outlier_detection_creation.ts | 11 +- .../regression_creation.ts | 7 +- 25 files changed, 280 insertions(+), 121 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/switch_modal.tsx create mode 100644 x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/switch_modal.tsx diff --git a/x-pack/plugins/ml/common/util/runtime_field_utils.test.ts b/x-pack/plugins/ml/common/util/runtime_field_utils.test.ts index 1b5e3e18b14f6..e7f9230666898 100644 --- a/x-pack/plugins/ml/common/util/runtime_field_utils.test.ts +++ b/x-pack/plugins/ml/common/util/runtime_field_utils.test.ts @@ -77,15 +77,15 @@ describe('ML runtime field utils', () => { ).toBe(false); }); - it('allows object with most basic runtime mapping', () => { + it('allows object with most basic runtime field', () => { expect(isRuntimeMappings({ fieldName: { type: 'keyword' } })).toBe(true); }); - it('allows object with multiple most basic runtime mappings', () => { + it('allows object with multiple most basic runtime fields', () => { expect( isRuntimeMappings({ fieldName1: { type: 'keyword' }, fieldName2: { type: 'keyword' } }) ).toBe(true); }); - it('allows object with runtime mappings including scripts', () => { + it('allows object with runtime fields including scripts', () => { expect( isRuntimeMappings({ fieldName1: { type: 'keyword' }, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 810f59d904696..930c32ce7e4da 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -364,7 +364,7 @@ export const ConfigurationStepForm: FC = ({ } return !option.key?.includes(runtimeMappingKey); }); - // Runtime mappings have been removed + // Runtime fields have been removed if (runtimeMappings === undefined && runtimeMappingsUpdated === true) { setDependentVariableOptions(filteredOptions); } else if (runtimeMappings) { @@ -374,7 +374,7 @@ export const ConfigurationStepForm: FC = ({ } } - // Update includes - remove previous runtime mappings then add supported runtime fields to includes + // Update includes - remove previous runtime fields then add supported runtime fields to includes const updatedIncludes = includes.filter((field) => { const isRemovedRuntimeField = previousRuntimeMapping && previousRuntimeMapping[field]; return !isRemovedRuntimeField; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx index 5b8fc82ef587b..ec85cc97ac6a6 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx @@ -20,19 +20,48 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { XJsonMode } from '@kbn/ace'; -import { RuntimeField } from '../../../../../../../../../../src/plugins/data/common/index_patterns'; import { useMlContext } from '../../../../../contexts/ml'; import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; import { XJson } from '../../../../../../../../../../src/plugins/es_ui_shared/public'; import { getCombinedRuntimeMappings } from '../../../../../components/data_grid/common'; import { isPopulatedObject } from '../../../../../../../common/util/object_utils'; import { RuntimeMappingsEditor } from './runtime_mappings_editor'; +import { isRuntimeMappings } from '../../../../../../../common'; +import { SwitchModal } from './switch_modal'; const advancedEditorsSidebarWidth = '220px'; -const COPY_TO_CLIPBOARD_RUNTIME_MAPPINGS = i18n.translate( +const COPY_RUNTIME_FIELDS_TO_CLIPBOARD_TEXT = i18n.translate( 'xpack.ml.dataframe.analytics.createWizard.indexPreview.copyRuntimeMappingsClipboardTooltip', { - defaultMessage: 'Copy Dev Console statement of the runtime mappings to the clipboard.', + defaultMessage: 'Copy Dev Console statement of the runtime fields to the clipboard.', + } +); + +const APPLY_CHANGES_TEXT = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.advancedSourceEditorApplyButtonText', + { + defaultMessage: 'Apply changes', + } +); + +const RUNTIME_FIELDS_EDITOR_HELP_TEXT = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.advancedRuntimeFieldsEditorHelpText', + { + defaultMessage: 'The advanced editor allows you to edit the runtime fields of the source.', + } +); + +const EDIT_SWITCH_LABEL_TEXT = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.advancedEditorRuntimeFieldsSwitchLabel', + { + defaultMessage: 'Edit runtime fields', + } +); + +const RUNTIME_FIELDS_LABEL_TEXT = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.runtimeFieldsLabel', + { + defaultMessage: 'Runtime fields', } ); @@ -45,12 +74,15 @@ interface Props { state: CreateAnalyticsFormProps['state']; } -type RuntimeMappings = Record; - export const RuntimeMappings: FC = ({ actions, state }) => { const [isRuntimeMappingsEditorEnabled, setIsRuntimeMappingsEditorEnabled] = useState( false ); + const [ + isRuntimeMappingsEditorSwitchModalVisible, + setRuntimeMappingsEditorSwitchModalVisible, + ] = useState(false); + const [ isRuntimeMappingsEditorApplyButtonEnabled, setIsRuntimeMappingsEditorApplyButtonEnabled, @@ -59,7 +91,6 @@ export const RuntimeMappings: FC = ({ actions, state }) => { advancedEditorRuntimeMappingsLastApplied, setAdvancedEditorRuntimeMappingsLastApplied, ] = useState(); - const [advancedEditorRuntimeMappings, setAdvancedEditorRuntimeMappings] = useState(); const { setFormState } = actions; const { jobType, previousRuntimeMapping, runtimeMappings } = state.form; @@ -90,22 +121,22 @@ export const RuntimeMappings: FC = ({ actions, state }) => { runtimeMappingsUpdated: true, previousRuntimeMapping: previous, }); - setAdvancedEditorRuntimeMappings(prettySourceConfig); + setAdvancedRuntimeMappingsConfig(prettySourceConfig); setAdvancedEditorRuntimeMappingsLastApplied(prettySourceConfig); setIsRuntimeMappingsEditorApplyButtonEnabled(false); }; - // If switching to KQL after updating via editor - reset search const toggleEditorHandler = (reset = false) => { if (reset === true) { - setFormState({ runtimeMappingsUpdated: false }); - } - if (isRuntimeMappingsEditorEnabled === false) { - setAdvancedEditorRuntimeMappingsLastApplied(advancedEditorRuntimeMappings); + setFormState({ + runtimeMappingsUpdated: false, + }); + + setAdvancedRuntimeMappingsConfig(advancedEditorRuntimeMappingsLastApplied ?? ''); } setIsRuntimeMappingsEditorEnabled(!isRuntimeMappingsEditorEnabled); - setIsRuntimeMappingsEditorApplyButtonEnabled(false); + setIsRuntimeMappingsEditorApplyButtonEnabled(isRuntimeMappings(runtimeMappings)); }; useEffect(function getInitialRuntimeMappings() { @@ -114,8 +145,11 @@ export const RuntimeMappings: FC = ({ actions, state }) => { runtimeMappings ); + const prettySourceConfig = JSON.stringify(combinedRuntimeMappings, null, 2); + if (combinedRuntimeMappings) { - setAdvancedRuntimeMappingsConfig(JSON.stringify(combinedRuntimeMappings, null, 2)); + setAdvancedRuntimeMappingsConfig(prettySourceConfig); + setAdvancedEditorRuntimeMappingsLastApplied(prettySourceConfig); setFormState({ runtimeMappings: combinedRuntimeMappings, }); @@ -125,12 +159,7 @@ export const RuntimeMappings: FC = ({ actions, state }) => { return ( <> - + {isPopulatedObject(runtimeMappings) ? ( @@ -139,8 +168,8 @@ export const RuntimeMappings: FC = ({ actions, state }) => { ) : ( )} @@ -170,27 +199,41 @@ export const RuntimeMappings: FC = ({ actions, state }) => { toggleEditorHandler()} + onChange={() => { + if ( + isRuntimeMappingsEditorEnabled && + advancedRuntimeMappingsConfig !== advancedEditorRuntimeMappingsLastApplied + ) { + setRuntimeMappingsEditorSwitchModalVisible(true); + return; + } + + toggleEditorHandler(); + }} data-test-subj="mlDataFrameAnalyticsRuntimeMappingsEditorSwitch" /> + {isRuntimeMappingsEditorSwitchModalVisible && ( + setRuntimeMappingsEditorSwitchModalVisible(false)} + onConfirm={() => { + setRuntimeMappingsEditorSwitchModalVisible(false); + toggleEditorHandler(true); + }} + /> + )} {(copy: () => void) => ( )} @@ -201,15 +244,7 @@ export const RuntimeMappings: FC = ({ actions, state }) => { {isRuntimeMappingsEditorEnabled && ( - - {i18n.translate( - 'xpack.ml.dataframe.analytics.createWizard.advancedRuntimeMappingsEditorHelpText', - { - defaultMessage: - 'The advanced editor allows you to edit the runtime mappings of the source.', - } - )} - + {RUNTIME_FIELDS_EDITOR_HELP_TEXT} = ({ actions, state }) => { disabled={!isRuntimeMappingsEditorApplyButtonEnabled} data-test-subj="mlDataFrameAnalyticsRuntimeMappingsApplyButton" > - {i18n.translate( - 'xpack.ml.dataframe.analytics.createWizard.advancedSourceEditorApplyButtonText', - { - defaultMessage: 'Apply changes', - } - )} + {APPLY_CHANGES_TEXT} )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/switch_modal.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/switch_modal.tsx new file mode 100644 index 0000000000000..21a1c18dbea13 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/switch_modal.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { EuiConfirmModal } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +interface Props { + onCancel: () => void; + onConfirm: () => void; +} + +const modalTitle = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.runtimeEditorSwitchModalTitle', + { + defaultMessage: 'Edits will be lost', + } +); + +const cancelButtonText = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.runtimeEditorSwitchModalCancelButtonText', + { + defaultMessage: 'Cancel', + } +); + +const applyChangesText = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.runtimeEditorSwitchModalConfirmButtonText', + { + defaultMessage: 'Close editor', + } +); +const modalMessage = i18n.translate( + 'xpack.ml.dataframe.analytics.createWizard.runtimeEditorSwitchModalBodyText', + { + defaultMessage: `The changes in the editor haven't been applied yet. By closing the editor you will lose your edits.`, + } +); + +export const SwitchModal: FC = ({ onCancel, onConfirm }) => ( + +

{modalMessage}

+
+); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.test.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.test.ts index c67a93c5e0626..670447826dcdd 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.test.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.test.ts @@ -102,7 +102,7 @@ describe('filter_runtime_mappings', () => { datafeed = getDatafeed(); }); - test('returns no runtime mappings, no mappings in aggs', () => { + test('returns no runtime fields, no mappings in aggs', () => { const resp = filterRuntimeMappings(job, datafeed); expect(Object.keys(resp.runtime_mappings).length).toEqual(0); @@ -111,7 +111,7 @@ describe('filter_runtime_mappings', () => { expect(resp.discarded_mappings.airline_lower).not.toEqual(undefined); }); - test('returns no runtime mappings, no runtime mappings in datafeed', () => { + test('returns no runtime fields, no runtime fields in datafeed', () => { datafeed.runtime_mappings = undefined; const resp = filterRuntimeMappings(job, datafeed); expect(Object.keys(resp.runtime_mappings).length).toEqual(0); @@ -131,7 +131,7 @@ describe('filter_runtime_mappings', () => { expect(resp.discarded_mappings.airline_lower).not.toEqual(undefined); }); - test('return no runtime mappings, no mappings in aggs', () => { + test('return no runtime fields, no mappings in aggs', () => { datafeed.aggregations = getAggs(); datafeed.aggregations!.buckets!.aggregations!.responsetime!.avg!.field! = 'responsetime'; @@ -154,7 +154,7 @@ describe('filter_runtime_mappings', () => { expect(resp.discarded_mappings.airline_lower).not.toEqual(undefined); }); - test('return two runtime mappings, no mappings in aggs', () => { + test('return two runtime fields, no mappings in aggs', () => { // set the detector field to be a runtime mapping job.analysis_config.detectors[0].field_name = 'responsetime_big'; // set the detector by field to be a runtime mapping @@ -167,7 +167,7 @@ describe('filter_runtime_mappings', () => { expect(Object.keys(resp.discarded_mappings).length).toEqual(0); }); - test('return two runtime mappings, no mappings in aggs, categorization job', () => { + test('return two runtime fields, no mappings in aggs, categorization job', () => { job.analysis_config.detectors[0].function = 'count'; // set the detector field to be a runtime mapping job.analysis_config.detectors[0].field_name = undefined; diff --git a/x-pack/plugins/ml/public/application/services/results_service/results_service.js b/x-pack/plugins/ml/public/application/services/results_service/results_service.js index c258d07cab484..71be7bcd2b7eb 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/results_service.js +++ b/x-pack/plugins/ml/public/application/services/results_service/results_service.js @@ -970,7 +970,7 @@ export function resultsServiceProvider(mlApiServices) { }, }, }, - // Runtime mappings only needed to support when query includes a runtime field + // Runtime fields only needed to support when query includes a runtime field // even though the default timeField can be a search time runtime field // because currently Kibana doesn't support that ...(isPopulatedObject(runtimeMappings) && query diff --git a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts index 64ee18c688046..e7c723ba16aba 100644 --- a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts +++ b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -627,7 +627,7 @@ export class DataVisualizer { // filter aggregation with exists query. const aggs: Aggs = datafeedAggregations !== undefined ? { ...datafeedAggregations } : {}; - // Combine runtime mappings from the index pattern as well as the datafeed + // Combine runtime fields from the index pattern as well as the datafeed const combinedRuntimeMappings: RuntimeMappings = { ...(isPopulatedObject(runtimeMappings) ? runtimeMappings : {}), ...(isPopulatedObject(datafeedConfig) && isPopulatedObject(datafeedConfig.runtime_mappings) diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts index 18dc6d3dc73c6..403d6738a4ce6 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts @@ -166,7 +166,7 @@ const validateFactory = (client: IScopedClusterClient, job: CombinedJob): Valida } } else { // only report uniqueFieldName as not aggregatable if it's not part - // of a valid categorization configuration and if it's not a scripted field or runtime mapping. + // of a valid categorization configuration and if it's not a scripted field or runtime field. if ( !isValidCategorizationConfig(job, uniqueFieldName) && !isScriptField(job, uniqueFieldName) && diff --git a/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts b/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts index 0d7e55d29b1c5..50b48aad9cee4 100644 --- a/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/data_visualizer_schema.ts @@ -20,7 +20,7 @@ export const dataVisualizerFieldHistogramsSchema = schema.object({ fields: schema.arrayOf(schema.any()), /** Number of documents to be collected in the sample processed on each shard, or -1 for no sampling. */ samplerShardSize: schema.number(), - /** Optional search time runtime mappings */ + /** Optional search time runtime fields */ runtimeMappings: runtimeMappingsSchema, }); @@ -40,7 +40,7 @@ export const dataVisualizerFieldStatsSchema = schema.object({ interval: schema.maybe(schema.number()), /** Maximum number of examples to return for text type fields. */ maxExamples: schema.number(), - /** Optional search time runtime mappings */ + /** Optional search time runtime fields */ runtimeMappings: runtimeMappingsSchema, }); @@ -59,6 +59,6 @@ export const dataVisualizerOverallStatsSchema = schema.object({ earliest: schema.maybe(schema.number()), /** Latest timestamp for search, as epoch ms (optional). */ latest: schema.maybe(schema.number()), - /** Optional search time runtime mappings */ + /** Optional search time runtime fields */ runtimeMappings: runtimeMappingsSchema, }); diff --git a/x-pack/plugins/transform/common/api_schemas/field_histograms.ts b/x-pack/plugins/transform/common/api_schemas/field_histograms.ts index 9f6f4c15d803a..5a808ab9788b1 100644 --- a/x-pack/plugins/transform/common/api_schemas/field_histograms.ts +++ b/x-pack/plugins/transform/common/api_schemas/field_histograms.ts @@ -16,7 +16,7 @@ export const fieldHistogramsRequestSchema = schema.object({ query: schema.any(), /** The fields to return histogram data. */ fields: schema.arrayOf(schema.any()), - /** Optional runtime mappings */ + /** Optional runtime fields */ runtimeMappings: runtimeMappingsSchema, /** Number of documents to be collected in the sample processed on each shard, or -1 for no sampling. */ samplerShardSize: schema.number(), diff --git a/x-pack/plugins/transform/public/app/common/request.test.ts b/x-pack/plugins/transform/public/app/common/request.test.ts index f25fedb7aaba3..6a64c6af6428f 100644 --- a/x-pack/plugins/transform/public/app/common/request.test.ts +++ b/x-pack/plugins/transform/public/app/common/request.test.ts @@ -266,7 +266,7 @@ describe('Transform: Common', () => { }); }); - test('getCreateTransformRequestBody() with runtime mappings', () => { + test('getCreateTransformRequestBody() with runtime fields', () => { const runtimeMappings = { rt_bytes_bigger: { type: 'double', diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_pivot_editor_switch/advanced_pivot_editor_switch.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_pivot_editor_switch/advanced_pivot_editor_switch.tsx index 3883be6a8bfa8..900af603266b8 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_pivot_editor_switch/advanced_pivot_editor_switch.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_pivot_editor_switch/advanced_pivot_editor_switch.tsx @@ -26,9 +26,6 @@ export const AdvancedPivotEditorSwitch: FC = ({ isAdvancedPivotEditorApplyButtonEnabled, }, }, - pivotConfig: { - actions: { setAggList, setGroupByList }, - }, }) => { return ( diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_query_editor_switch/advanced_query_editor_switch.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_query_editor_switch/advanced_query_editor_switch.tsx index aedd4a2450f54..43c6684a5a2bc 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_query_editor_switch/advanced_query_editor_switch.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_query_editor_switch/advanced_query_editor_switch.tsx @@ -27,6 +27,8 @@ export const AdvancedQueryEditorSwitch: FC = ({ isAdvancedSourceEditorEnabled, isAdvancedSourceEditorSwitchModalVisible, sourceConfigUpdated, + advancedEditorSourceConfigLastApplied, + advancedEditorSourceConfig, }, }, searchBar: { @@ -53,7 +55,11 @@ export const AdvancedQueryEditorSwitch: FC = ({ )} checked={isAdvancedSourceEditorEnabled} onChange={() => { - if (isAdvancedSourceEditorEnabled && sourceConfigUpdated) { + if ( + isAdvancedSourceEditorEnabled && + (sourceConfigUpdated || + advancedEditorSourceConfig !== advancedEditorSourceConfigLastApplied) + ) { setAdvancedSourceEditorSwitchModalVisible(true); return; } diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/advanced_runtime_mappings_editor_switch.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/advanced_runtime_mappings_editor_switch.tsx index be297c10a8f88..2ee8bc9995df6 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/advanced_runtime_mappings_editor_switch.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/advanced_runtime_mappings_editor_switch.tsx @@ -8,35 +8,58 @@ import React, { FC } from 'react'; import { EuiSwitch } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { StepDefineFormHook } from '../step_define'; +import { SwitchModal } from './switch_modal'; +import { useAdvancedRuntimeMappingsEditor } from '../step_define/hooks/use_advanced_runtime_mappings_editor'; -export const AdvancedRuntimeMappingsEditorSwitch: FC< - StepDefineFormHook['runtimeMappingsEditor'] -> = (props) => { +type Props = ReturnType; +export const AdvancedRuntimeMappingsEditorSwitch: FC = (props) => { const { - actions: { setRuntimeMappingsUpdated, toggleRuntimeMappingsEditor }, - state: { isRuntimeMappingsEditorEnabled }, + actions: { toggleRuntimeMappingsEditor, setRuntimeMappingsEditorSwitchModalVisible }, + state: { + isRuntimeMappingsEditorEnabled, + isRuntimeMappingsEditorSwitchModalVisible, + advancedEditorRuntimeMappingsLastApplied, + advancedRuntimeMappingsConfig, + }, } = props; // If switching to KQL after updating via editor - reset search const toggleEditorHandler = (reset = false) => { - if (reset === true) { - setRuntimeMappingsUpdated(false); - } toggleRuntimeMappingsEditor(reset); }; return ( - + { + if ( + isRuntimeMappingsEditorEnabled && + advancedRuntimeMappingsConfig !== advancedEditorRuntimeMappingsLastApplied + ) { + setRuntimeMappingsEditorSwitchModalVisible(true); + return; + } + + toggleEditorHandler(); + }} + data-test-subj="transformAdvancedRuntimeMappingsEditorSwitch" + /> + {isRuntimeMappingsEditorSwitchModalVisible && ( + setRuntimeMappingsEditorSwitchModalVisible(false)} + onConfirm={() => { + setRuntimeMappingsEditorSwitchModalVisible(false); + toggleEditorHandler(true); + }} + /> )} - checked={isRuntimeMappingsEditorEnabled} - onChange={() => toggleEditorHandler()} - data-test-subj="transformAdvancedRuntimeMappingsEditorSwitch" - /> + ); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/switch_modal.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/switch_modal.tsx new file mode 100644 index 0000000000000..ff08ab37bb3e6 --- /dev/null +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_editor_switch/switch_modal.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { EuiConfirmModal } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +interface Props { + onCancel: () => void; + onConfirm: () => void; +} + +const modalTitle = i18n.translate('xpack.transform.stepDefineForm.runtimeEditorSwitchModalTitle', { + defaultMessage: 'Edits will be lost', +}); + +const cancelButtonText = i18n.translate( + 'xpack.transform.stepDefineForm.runtimeEditorSwitchModalCancelButtonText', + { + defaultMessage: 'Cancel', + } +); + +const applyChangesText = i18n.translate( + 'xpack.transform.stepDefineForm.runtimeEditorSwitchModalConfirmButtonText', + { + defaultMessage: 'Close editor', + } +); +const modalMessage = i18n.translate( + 'xpack.transform.stepDefineForm.runtimeEditorSwitchModalBodyText', + { + defaultMessage: `The changes in the advanced editor haven't been applied yet. By closing the editor you will lose your edits.`, + } +); + +export const SwitchModal: FC = ({ onCancel, onConfirm }) => ( + +

{modalMessage}

+
+); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_settings/advanced_runtime_mappings_settings.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_settings/advanced_runtime_mappings_settings.tsx index 7965db99b335b..29e341fdaeaea 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_settings/advanced_runtime_mappings_settings.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/advanced_runtime_mappings_settings/advanced_runtime_mappings_settings.tsx @@ -29,9 +29,9 @@ import { isPivotAggConfigWithUiSupport } from '../../../../common/pivot_group_by const advancedEditorsSidebarWidth = '220px'; const COPY_TO_CLIPBOARD_RUNTIME_MAPPINGS = i18n.translate( - 'xpack.transform.indexPreview.copyRuntimeMappingsClipboardTooltip', + 'xpack.transform.indexPreview.copyRuntimeFieldsClipboardTooltip', { - defaultMessage: 'Copy Dev Console statement of the runtime mappings to the clipboard.', + defaultMessage: 'Copy Dev Console statement of the runtime fields to the clipboard.', } ); @@ -87,15 +87,15 @@ export const AdvancedRuntimeMappingsSettings: FC = (props) = {runtimeMappings !== undefined && Object.keys(runtimeMappings).length > 0 ? ( = (props) = ) : ( )} @@ -145,10 +145,10 @@ export const AdvancedRuntimeMappingsSettings: FC = (props) = {i18n.translate( - 'xpack.transform.stepDefineForm.advancedRuntimeMappingsEditorHelpText', + 'xpack.transform.stepDefineForm.advancedRuntimeFieldsEditorHelpText', { defaultMessage: - 'The advanced editor allows you to edit the runtime mappings of the transform configuration.', + 'The advanced editor allows you to edit the runtime fields of the transform configuration.', } )} diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/apply_transform_config_to_define_state.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/apply_transform_config_to_define_state.ts index 6298874a20366..497f37036725c 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/apply_transform_config_to_define_state.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/apply_transform_config_to_define_state.ts @@ -37,7 +37,7 @@ export function applyTransformConfigToDefineState( transformConfig?: TransformBaseConfig, indexPattern?: StepDefineFormProps['searchItems']['indexPattern'] ): StepDefineExposedState { - // apply runtime mappings from both the index pattern and inline configurations + // apply runtime fields from both the index pattern and inline configurations state.runtimeMappings = getCombinedRuntimeMappings( indexPattern, transformConfig?.source?.runtime_mappings diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx index 9b349541a78a3..e3e767a81b01d 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx @@ -39,7 +39,7 @@ export function getSupportedFilterAggs( ]; } - throw new Error(`The field ${fieldName} does not exist in the index or runtime mappings`); + throw new Error(`The field ${fieldName} does not exist in the index or runtime fields`); } /** diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_advanced_runtime_mappings_editor.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_advanced_runtime_mappings_editor.ts index 2ad7c4344a101..dd58456e15adb 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_advanced_runtime_mappings_editor.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_advanced_runtime_mappings_editor.ts @@ -62,11 +62,8 @@ export const useAdvancedRuntimeMappingsEditor = (defaults: StepDefineExposedStat const toggleRuntimeMappingsEditor = (reset = false) => { if (reset === true) { setRuntimeMappingsUpdated(false); + setAdvancedRuntimeMappingsConfig(advancedEditorRuntimeMappingsLastApplied); } - if (isRuntimeMappingsEditorEnabled === false) { - setAdvancedEditorRuntimeMappingsLastApplied(advancedRuntimeMappingsConfig); - } - setRuntimeMappingsEditorEnabled(!isRuntimeMappingsEditorEnabled); setRuntimeMappingsEditorApplyButtonEnabled(false); }; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts index 0ceea070df1b6..b56df5e395c88 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_step_define_form.ts @@ -51,7 +51,7 @@ export const useStepDefineForm = ({ overrides, onChange, searchItems }: StepDefi // source config hook const advancedSourceEditor = useAdvancedSourceEditor(defaults, previewRequest); - // runtime mappings config hook + // runtime fields config hook const runtimeMappingsEditor = useAdvancedRuntimeMappingsEditor(defaults); useEffect(() => { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 74803fda8df5c..73dcecfe28d2d 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -21758,7 +21758,6 @@ "xpack.transform.groupByLabelForm.editIntervalAriaLabel": "間隔を編集", "xpack.transform.home.breadcrumbTitle": "変換", "xpack.transform.indexPreview.copyClipboardTooltip": "インデックスプレビューの開発コンソールステートメントをクリップボードにコピーします。", - "xpack.transform.indexPreview.copyRuntimeMappingsClipboardTooltip": "ランタイムマッピングの開発コンソールステートメントをクリップボードにコピーします。", "xpack.transform.latestPreview.latestPreviewIncompleteConfigCalloutBody": "1 つ以上の一意キーと並べ替えフィールドを選択してください。", "xpack.transform.licenseCheckErrorMessage": "ライセンス確認失敗", "xpack.transform.list.emptyPromptButtonText": "初めての変換を作成してみましょう。", @@ -21818,14 +21817,12 @@ "xpack.transform.stepDefineForm.advancedEditorHelpText": "詳細エディターでは、変換のピボット構成を編集できます。", "xpack.transform.stepDefineForm.advancedEditorHelpTextLink": "使用可能なオプションの詳細を確認してください。", "xpack.transform.stepDefineForm.advancedEditorLabel": "ピボット構成オブジェクト", - "xpack.transform.stepDefineForm.advancedEditorRuntimeMappingsSwitchLabel": "ランタイムマッピングの編集", "xpack.transform.stepDefineForm.advancedEditorSourceConfigSwitchLabel": "JSONクエリを編集", "xpack.transform.stepDefineForm.advancedEditorSwitchLabel": "JSON構成を編集", "xpack.transform.stepDefineForm.advancedEditorSwitchModalBodyText": "詳細エディターの変更は適用されませんでした。詳細エディターを無効にすると、編集内容が失われます。", "xpack.transform.stepDefineForm.advancedEditorSwitchModalCancelButtonText": "キャンセル", "xpack.transform.stepDefineForm.advancedEditorSwitchModalConfirmButtonText": "詳細エディターを無効にする", "xpack.transform.stepDefineForm.advancedEditorSwitchModalTitle": "適用されていない変更", - "xpack.transform.stepDefineForm.advancedRuntimeMappingsEditorHelpText": "高度なエディターでは、変換構成のランタイムマッピングを編集できます。", "xpack.transform.stepDefineForm.advancedSourceEditorApplyButtonText": "変更を適用", "xpack.transform.stepDefineForm.advancedSourceEditorAriaLabel": "クエリの詳細エディター", "xpack.transform.stepDefineForm.advancedSourceEditorHelpText": "高度なエディターでは、変換構成のソースクエリ句を編集できます。", @@ -21851,8 +21848,6 @@ "xpack.transform.stepDefineForm.pivotLabel": "ピボット", "xpack.transform.stepDefineForm.queryPlaceholderKql": "例:{example}", "xpack.transform.stepDefineForm.queryPlaceholderLucene": "例:{example}", - "xpack.transform.stepDefineForm.runtimeMappingsLabel": "ランタイムマッピング", - "xpack.transform.stepDefineForm.runtimeMappingsListLabel": "{runtimeFields}", "xpack.transform.stepDefineForm.savedSearchLabel": "保存検索", "xpack.transform.stepDefineForm.sortFieldOptionsEmptyError": "並べ替えの条件にする日付フィールドがありません。別のフィールド型を使用するには、構成をクリップボードにコピーして、コンソールで変換を作成し続けます。", "xpack.transform.stepDefineForm.sortHelpText": "最新のドキュメントを特定するために使用する日付フィールドを選択してます。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index ef6d8f9707553..e7640c220a6c0 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -22106,7 +22106,6 @@ "xpack.transform.groupByLabelForm.editIntervalAriaLabel": "编辑时间间隔", "xpack.transform.home.breadcrumbTitle": "转换", "xpack.transform.indexPreview.copyClipboardTooltip": "将索引预览的开发控制台语句复制到剪贴板。", - "xpack.transform.indexPreview.copyRuntimeMappingsClipboardTooltip": "将运行时映射的开发控制台语句复制到剪贴板。", "xpack.transform.latestPreview.latestPreviewIncompleteConfigCalloutBody": "请选择至少一个唯一键和排序字段。", "xpack.transform.licenseCheckErrorMessage": "许可证检查失败", "xpack.transform.list.emptyPromptButtonText": "创建您的首个转换", @@ -22167,14 +22166,12 @@ "xpack.transform.stepDefineForm.advancedEditorHelpText": "高级编辑器允许您编辑数据帧转换的数据透视表配置。", "xpack.transform.stepDefineForm.advancedEditorHelpTextLink": "详细了解可用选项。", "xpack.transform.stepDefineForm.advancedEditorLabel": "数据透视表配置对象", - "xpack.transform.stepDefineForm.advancedEditorRuntimeMappingsSwitchLabel": "编辑运行时映射", "xpack.transform.stepDefineForm.advancedEditorSourceConfigSwitchLabel": "编辑 JSON 查询", "xpack.transform.stepDefineForm.advancedEditorSwitchLabel": "编辑 JSON 配置", "xpack.transform.stepDefineForm.advancedEditorSwitchModalBodyText": "高级编辑器中的更改尚未应用。禁用高级编辑器将会使您的编辑丢失。", "xpack.transform.stepDefineForm.advancedEditorSwitchModalCancelButtonText": "取消", "xpack.transform.stepDefineForm.advancedEditorSwitchModalConfirmButtonText": "禁用高级编辑器", "xpack.transform.stepDefineForm.advancedEditorSwitchModalTitle": "未应用的更改", - "xpack.transform.stepDefineForm.advancedRuntimeMappingsEditorHelpText": "高级编辑器允许您编辑转换配置的运行时映射。", "xpack.transform.stepDefineForm.advancedSourceEditorApplyButtonText": "应用更改", "xpack.transform.stepDefineForm.advancedSourceEditorAriaLabel": "高级查询编辑器", "xpack.transform.stepDefineForm.advancedSourceEditorHelpText": "高级编辑器允许您编辑转换配置的源查询子句。", @@ -22200,8 +22197,6 @@ "xpack.transform.stepDefineForm.pivotLabel": "数据透视表", "xpack.transform.stepDefineForm.queryPlaceholderKql": "例如,{example}", "xpack.transform.stepDefineForm.queryPlaceholderLucene": "例如,{example}", - "xpack.transform.stepDefineForm.runtimeMappingsLabel": "运行时映射", - "xpack.transform.stepDefineForm.runtimeMappingsListLabel": "{runtimeFields}", "xpack.transform.stepDefineForm.savedSearchLabel": "已保存搜索", "xpack.transform.stepDefineForm.sortFieldOptionsEmptyError": "没有日期字段可用于排序。要使用其他字段类型,请将配置复制到剪贴板,然后继续在控制台中创建转换。", "xpack.transform.stepDefineForm.sortHelpText": "选择要用于标识最新文档的日期字段。", diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts index 5e6a08751c932..80d64ffa15d49 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts @@ -62,6 +62,7 @@ export default function ({ getService }: FtrProviderContext) { { color: '#D3DAE6', percentage: 8 }, { color: '#F5F7FA', percentage: 15 }, ], + runtimeFieldsEditorContent: ['{', ' "uppercase_y": {', ' "type": "keyword",'], row: { type: 'classification', status: 'stopped', @@ -113,9 +114,9 @@ export default function ({ getService }: FtrProviderContext) { JSON.stringify(testData.runtimeFields) ); await ml.dataFrameAnalyticsCreation.applyRuntimeMappings(); - await ml.dataFrameAnalyticsCreation.assertRuntimeMappingsEditorContent([ - '{"uppercase_y":{"type":"keyword","script":"emit(params._source.y.toUpperCase())"}}', - ]); + await ml.dataFrameAnalyticsCreation.assertRuntimeMappingsEditorContent( + testData.expected.runtimeFieldsEditorContent + ); await ml.testExecution.logTestStep('inputs the dependent variable'); await ml.dataFrameAnalyticsCreation.assertDependentVariableInputExists(); diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts index e73a477d21b1b..3866642383b22 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts @@ -72,6 +72,11 @@ export default function ({ getService }: FtrProviderContext) { // anti-aliasing { color: '#F5F7FA', percentage: 30 }, ], + runtimeFieldsEditorContent: [ + '{', + ' "lowercase_central_air": {', + ' "type": "keyword",', + ], row: { type: 'outlier_detection', status: 'stopped', @@ -124,9 +129,9 @@ export default function ({ getService }: FtrProviderContext) { JSON.stringify(testData.runtimeFields) ); await ml.dataFrameAnalyticsCreation.applyRuntimeMappings(); - await ml.dataFrameAnalyticsCreation.assertRuntimeMappingsEditorContent([ - '{"lowercase_central_air":{"type":"keyword","script":"emit(params._source.CentralAir.toLowerCase())"}}', - ]); + await ml.dataFrameAnalyticsCreation.assertRuntimeMappingsEditorContent( + testData.expected.runtimeFieldsEditorContent + ); await ml.testExecution.logTestStep('does not display the dependent variable input'); await ml.dataFrameAnalyticsCreation.assertDependentVariableInputMissing(); diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts index 540fbc10fa0fc..a65d8986595cc 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts @@ -55,6 +55,7 @@ export default function ({ getService }: FtrProviderContext) { { color: '#F5F7FA', percentage: 10 }, { color: '#D3DAE6', percentage: 3 }, ], + runtimeFieldsEditorContent: ['{', ' "uppercase_stab": {', ' "type": "keyword",'], row: { type: 'regression', status: 'stopped', @@ -107,9 +108,9 @@ export default function ({ getService }: FtrProviderContext) { JSON.stringify(testData.runtimeFields) ); await ml.dataFrameAnalyticsCreation.applyRuntimeMappings(); - await ml.dataFrameAnalyticsCreation.assertRuntimeMappingsEditorContent([ - '{"uppercase_stab":{"type":"keyword","script":"emit(params._source.stabf.toUpperCase())"}}', - ]); + await ml.dataFrameAnalyticsCreation.assertRuntimeMappingsEditorContent( + testData.expected.runtimeFieldsEditorContent + ); await ml.testExecution.logTestStep('inputs the dependent variable'); await ml.dataFrameAnalyticsCreation.assertDependentVariableInputExists(); From 38ac8e5cc82613fea6dd3c0b57e6fce3bab9fbbc Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 19 Apr 2021 20:52:29 +0200 Subject: [PATCH 48/82] Add search deep links for APM, Metrics, Logs, and Dev Tools (#96135) * Add searchDeepLinks for APM * Add searchDeepLinks for Metrics and Logs * Add searchDeepLinks for Dev Tools Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/dev_tools/public/dev_tool.ts | 6 +- src/plugins/dev_tools/public/plugin.ts | 16 ++++- .../app/Main/route_config/index.tsx | 3 + x-pack/plugins/apm/public/plugin.ts | 27 +++++++++ .../infra/public/pages/logs/page_content.tsx | 1 + .../infra/public/pages/metrics/index.tsx | 1 + x-pack/plugins/infra/public/plugin.ts | 59 +++++++++++++++++++ 7 files changed, 110 insertions(+), 3 deletions(-) diff --git a/src/plugins/dev_tools/public/dev_tool.ts b/src/plugins/dev_tools/public/dev_tool.ts index 197e93f20a539..8adfd4c76482d 100644 --- a/src/plugins/dev_tools/public/dev_tool.ts +++ b/src/plugins/dev_tools/public/dev_tool.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { ReactNode } from 'react'; import { AppMount } from 'src/core/public'; /** @@ -26,8 +27,9 @@ export class DevToolApp { /** * The human readable name of the dev tool. Should be internationalized. * This will be used as a label in the tab above the actual tool. + * May also be a ReactNode. */ - public readonly title: string; + public readonly title: ReactNode; public readonly mount: AppMount; /** @@ -55,7 +57,7 @@ export class DevToolApp { constructor( id: string, - title: string, + title: ReactNode, mount: AppMount, enableRouting: boolean, order: number, diff --git a/src/plugins/dev_tools/public/plugin.ts b/src/plugins/dev_tools/public/plugin.ts index 6cf3c57d19ac8..e9f5d206de918 100644 --- a/src/plugins/dev_tools/public/plugin.ts +++ b/src/plugins/dev_tools/public/plugin.ts @@ -7,7 +7,7 @@ */ import { BehaviorSubject } from 'rxjs'; -import { Plugin, CoreSetup, AppMountParameters } from 'src/core/public'; +import { Plugin, CoreSetup, AppMountParameters, AppSearchDeepLink } from 'src/core/public'; import { AppUpdater } from 'kibana/public'; import { i18n } from '@kbn/i18n'; import { sortBy } from 'lodash'; @@ -84,6 +84,20 @@ export class DevToolsPlugin implements Plugin { public start() { if (this.getSortedDevTools().length === 0) { this.appStateUpdater.next(() => ({ navLinkStatus: AppNavLinkStatus.hidden })); + } else { + this.appStateUpdater.next(() => { + const deepLinks: AppSearchDeepLink[] = [...this.devTools.values()] + .filter( + // Some tools do not use a string title, so we filter those out + (tool) => !tool.enableRouting && !tool.isDisabled() && typeof tool.title === 'string' + ) + .map((tool) => ({ + id: tool.id, + title: tool.title as string, + path: `#/${tool.id}`, + })); + return { meta: { searchDeepLinks: deepLinks } }; + }); } } diff --git a/x-pack/plugins/apm/public/components/app/Main/route_config/index.tsx b/x-pack/plugins/apm/public/components/app/Main/route_config/index.tsx index 0ed9c5c919ddb..9410fd00411e3 100644 --- a/x-pack/plugins/apm/public/components/app/Main/route_config/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Main/route_config/index.tsx @@ -173,6 +173,7 @@ export const routes: APMRouteDefinition[] = [ render: renderAsRedirectTo('/services'), breadcrumb: 'APM', }, + // !! Need to be kept in sync with the searchDeepLinks in x-pack/plugins/apm/public/plugin.ts { exact: true, path: '/services', @@ -181,6 +182,7 @@ export const routes: APMRouteDefinition[] = [ defaultMessage: 'Services', }), }, + // !! Need to be kept in sync with the searchDeepLinks in x-pack/plugins/apm/public/plugin.ts { exact: true, path: '/traces', @@ -326,6 +328,7 @@ export const routes: APMRouteDefinition[] = [ component: TraceLink, breadcrumb: null, }, + // !! Need to be kept in sync with the searchDeepLinks in x-pack/plugins/apm/public/plugin.ts { exact: true, path: '/service-map', diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts index 143076e56c831..6ba9689535084 100644 --- a/x-pack/plugins/apm/public/plugin.ts +++ b/x-pack/plugins/apm/public/plugin.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { i18n } from '@kbn/i18n'; import type { ConfigSchema } from '.'; import { AppMountParameters, @@ -143,6 +144,32 @@ export class ApmPlugin implements Plugin { appRoute: '/app/apm', icon: 'plugins/apm/public/icon.svg', category: DEFAULT_APP_CATEGORIES.observability, + meta: { + // !! Need to be kept in sync with the routes in x-pack/plugins/apm/public/components/app/Main/route_config/index.tsx + searchDeepLinks: [ + { + id: 'services', + title: i18n.translate('xpack.apm.breadcrumb.servicesTitle', { + defaultMessage: 'Services', + }), + path: '/services', + }, + { + id: 'traces', + title: i18n.translate('xpack.apm.breadcrumb.tracesTitle', { + defaultMessage: 'Traces', + }), + path: '/traces', + }, + { + id: 'service-map', + title: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', { + defaultMessage: 'Service Map', + }), + path: '/service-map', + }, + ], + }, async mount(params: AppMountParameters) { // Load application bundle and Get start services diff --git a/x-pack/plugins/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/page_content.tsx index 648915ad4075c..d43fe198c5077 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_content.tsx @@ -40,6 +40,7 @@ export const LogsPageContent: React.FunctionComponent = () => { initialize(); }); + // !! Need to be kept in sync with the searchDeepLinks in x-pack/plugins/infra/public/plugin.ts const streamTab = { app: 'logs', title: streamTabTitle, diff --git a/x-pack/plugins/infra/public/pages/metrics/index.tsx b/x-pack/plugins/infra/public/pages/metrics/index.tsx index 51cc4ca098483..b43d7640f6390 100644 --- a/x-pack/plugins/infra/public/pages/metrics/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/index.tsx @@ -120,6 +120,7 @@ export const InfrastructurePage = ({ match }: RouteComponentProps) => { > + {/** !! Need to be kept in sync with the searchDeepLinks in x-pack/plugins/infra/public/plugin.ts */} { // mount callback should not use setup dependencies, get start dependencies instead @@ -82,6 +115,32 @@ export class Plugin implements InfraClientPluginClass { order: 8200, appRoute: '/app/metrics', category: DEFAULT_APP_CATEGORIES.observability, + meta: { + // !! Need to be kept in sync with the routes in x-pack/plugins/infra/public/pages/metrics/index.tsx + searchDeepLinks: [ + { + id: 'inventory', + title: i18n.translate('xpack.infra.homePage.inventoryTabTitle', { + defaultMessage: 'Inventory', + }), + path: '/inventory', + }, + { + id: 'metrics-explorer', + title: i18n.translate('xpack.infra.homePage.metricsExplorerTabTitle', { + defaultMessage: 'Metrics Explorer', + }), + path: '/explorer', + }, + { + id: 'settings', + title: i18n.translate('xpack.infra.homePage.settingsTabTitle', { + defaultMessage: 'Settings', + }), + path: '/settings', + }, + ], + }, mount: async (params: AppMountParameters) => { // mount callback should not use setup dependencies, get start dependencies instead const [coreStart, pluginsStart] = await core.getStartServices(); From bff02924b413bd987de51c41d1f393d91d03b36c Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Mon, 19 Apr 2021 15:52:53 -0400 Subject: [PATCH 49/82] [APM] Displays a column for service name in the logs tab in trace overview (#97451) * [APM] Displays a column for service name in the logs tab in trace overview (#94812) * Adds i18n --- .../WaterfallWithSummmary/TransactionTabs.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/TransactionTabs.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/TransactionTabs.tsx index 5d6e46bb2ffd2..7f8ffb62d9e72 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/TransactionTabs.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/TransactionTabs.tsx @@ -137,6 +137,19 @@ function LogsTabContent({ transaction }: { transaction: Transaction }) { endTimestamp={endTimestamp + framePaddingMs} query={`trace.id:"${transaction.trace.id}" OR "${transaction.trace.id}"`} height={640} + columns={[ + { type: 'timestamp' }, + { + type: 'field', + field: 'service.name', + header: i18n.translate( + 'xpack.apm.propertiesTable.tabs.logs.serviceName', + { defaultMessage: 'Service Name' } + ), + width: 200, + }, + { type: 'message' }, + ]} /> ); } From 7a11fac6f0c602a42dcf7c219b7aed65259baf88 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 19 Apr 2021 22:01:43 +0200 Subject: [PATCH 50/82] [Embeddable] Remove panel desaturation (#97473) * remove chart saturation styles * add z-index to embPanel label --- .../embeddable/public/lib/panel/_embeddable_panel.scss | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/plugins/embeddable/public/lib/panel/_embeddable_panel.scss b/src/plugins/embeddable/public/lib/panel/_embeddable_panel.scss index d21911f10f82e..f7ee1f3c741c4 100644 --- a/src/plugins/embeddable/public/lib/panel/_embeddable_panel.scss +++ b/src/plugins/embeddable/public/lib/panel/_embeddable_panel.scss @@ -162,12 +162,5 @@ .embPanel__label { position: absolute; padding-left: $euiSizeS; -} - -.embPanel__content[data-error], -.embPanel__content[data-loading] { - pointer-events: none; - filter: grayscale(100%); - /* stylelint-disable-next-line color-named */ - filter: gray; + z-index: $euiZLevel1; } From 7927923f0e104d0954e445de252f2a078876f4b7 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 19 Apr 2021 13:02:33 -0700 Subject: [PATCH 51/82] Use doc links service for Canvas (#97059) --- ...-plugin-core-public.doclinksstart.links.md | 3 +++ ...kibana-plugin-core-public.doclinksstart.md | 2 +- ...ublic.navigatetoappoptions.openinnewtab.md | 13 ++++++++++++ .../public/doc_links/doc_links_service.ts | 7 +++++++ src/core/public/public.api.md | 3 +++ x-pack/plugins/canvas/public/application.tsx | 5 +++-- .../canvas/public/lib/documentation_links.ts | 21 ------------------- 7 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 docs/development/core/public/kibana-plugin-core-public.navigatetoappoptions.openinnewtab.md delete mode 100644 x-pack/plugins/canvas/public/lib/documentation_links.ts diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md index 535bd8f11236d..3a383ee72b86a 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md @@ -8,6 +8,9 @@ ```typescript readonly links: { + readonly canvas: { + readonly guide: string; + }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md index b8d0d2288993e..c5bf4babd9da9 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md @@ -17,5 +17,5 @@ export interface DocLinksStart | --- | --- | --- | | [DOC\_LINK\_VERSION](./kibana-plugin-core-public.doclinksstart.doc_link_version.md) | string | | | [ELASTIC\_WEBSITE\_URL](./kibana-plugin-core-public.doclinksstart.elastic_website_url.md) | string | | -| [links](./kibana-plugin-core-public.doclinksstart.links.md) | {
readonly dashboard: {
readonly guide: string;
readonly drilldowns: string;
readonly drilldownsTriggerPicker: string;
readonly urlDrilldownTemplateSyntax: string;
readonly urlDrilldownVariables: string;
};
readonly discover: Record<string, string>;
readonly filebeat: {
readonly base: string;
readonly installation: string;
readonly configuration: string;
readonly elasticsearchOutput: string;
readonly elasticsearchModule: string;
readonly startup: string;
readonly exportedFields: string;
};
readonly auditbeat: {
readonly base: string;
};
readonly metricbeat: {
readonly base: string;
readonly configure: string;
readonly httpEndpoint: string;
readonly install: string;
readonly start: string;
};
readonly enterpriseSearch: {
readonly base: string;
readonly appSearchBase: string;
readonly workplaceSearchBase: string;
};
readonly heartbeat: {
readonly base: string;
};
readonly logstash: {
readonly base: string;
};
readonly functionbeat: {
readonly base: string;
};
readonly winlogbeat: {
readonly base: string;
};
readonly aggs: {
readonly composite: string;
readonly composite_missing_bucket: string;
readonly date_histogram: string;
readonly date_range: string;
readonly date_format_pattern: string;
readonly filter: string;
readonly filters: string;
readonly geohash_grid: string;
readonly histogram: string;
readonly ip_range: string;
readonly range: string;
readonly significant_terms: string;
readonly terms: string;
readonly avg: string;
readonly avg_bucket: string;
readonly max_bucket: string;
readonly min_bucket: string;
readonly sum_bucket: string;
readonly cardinality: string;
readonly count: string;
readonly cumulative_sum: string;
readonly derivative: string;
readonly geo_bounds: string;
readonly geo_centroid: string;
readonly max: string;
readonly median: string;
readonly min: string;
readonly moving_avg: string;
readonly percentile_ranks: string;
readonly serial_diff: string;
readonly std_dev: string;
readonly sum: string;
readonly top_hits: string;
};
readonly runtimeFields: {
readonly overview: string;
readonly mapping: string;
};
readonly scriptedFields: {
readonly scriptFields: string;
readonly scriptAggs: string;
readonly painless: string;
readonly painlessApi: string;
readonly painlessLangSpec: string;
readonly painlessSyntax: string;
readonly painlessWalkthrough: string;
readonly luceneExpressions: string;
};
readonly indexPatterns: {
readonly introduction: string;
readonly fieldFormattersNumber: string;
readonly fieldFormattersString: string;
};
readonly addData: string;
readonly kibana: string;
readonly upgradeAssistant: string;
readonly elasticsearch: Record<string, string>;
readonly siem: {
readonly guide: string;
readonly gettingStarted: string;
};
readonly query: {
readonly eql: string;
readonly kueryQuerySyntax: string;
readonly luceneQuerySyntax: string;
readonly percolate: string;
readonly queryDsl: string;
};
readonly date: {
readonly dateMath: string;
readonly dateMathIndexNames: string;
};
readonly management: Record<string, string>;
readonly ml: Record<string, string>;
readonly transforms: Record<string, string>;
readonly visualize: Record<string, string>;
readonly apis: Readonly<{
bulkIndexAlias: string;
createIndex: string;
createSnapshotLifecyclePolicy: string;
createRoleMapping: string;
createRoleMappingTemplates: string;
createApiKey: string;
createPipeline: string;
createTransformRequest: string;
cronExpressions: string;
executeWatchActionModes: string;
indexExists: string;
openIndex: string;
putComponentTemplate: string;
painlessExecute: string;
painlessExecuteAPIContexts: string;
putComponentTemplateMetadata: string;
putSnapshotLifecyclePolicy: string;
putIndexTemplateV1: string;
putWatch: string;
simulatePipeline: string;
updateTransform: string;
}>;
readonly observability: Record<string, string>;
readonly alerting: Record<string, string>;
readonly maps: Record<string, string>;
readonly monitoring: Record<string, string>;
readonly security: Readonly<{
apiKeyServiceSettings: string;
clusterPrivileges: string;
elasticsearchSettings: string;
elasticsearchEnableSecurity: string;
indicesPrivileges: string;
kibanaTLS: string;
kibanaPrivileges: string;
mappingRoles: string;
mappingRolesFieldRules: string;
runAsPrivilege: string;
}>;
readonly watcher: Record<string, string>;
readonly ccs: Record<string, string>;
readonly plugins: Record<string, string>;
readonly snapshotRestore: Record<string, string>;
readonly ingest: Record<string, string>;
} | | +| [links](./kibana-plugin-core-public.doclinksstart.links.md) | {
readonly canvas: {
readonly guide: string;
};
readonly dashboard: {
readonly guide: string;
readonly drilldowns: string;
readonly drilldownsTriggerPicker: string;
readonly urlDrilldownTemplateSyntax: string;
readonly urlDrilldownVariables: string;
};
readonly discover: Record<string, string>;
readonly filebeat: {
readonly base: string;
readonly installation: string;
readonly configuration: string;
readonly elasticsearchOutput: string;
readonly elasticsearchModule: string;
readonly startup: string;
readonly exportedFields: string;
};
readonly auditbeat: {
readonly base: string;
};
readonly metricbeat: {
readonly base: string;
readonly configure: string;
readonly httpEndpoint: string;
readonly install: string;
readonly start: string;
};
readonly enterpriseSearch: {
readonly base: string;
readonly appSearchBase: string;
readonly workplaceSearchBase: string;
};
readonly heartbeat: {
readonly base: string;
};
readonly logstash: {
readonly base: string;
};
readonly functionbeat: {
readonly base: string;
};
readonly winlogbeat: {
readonly base: string;
};
readonly aggs: {
readonly composite: string;
readonly composite_missing_bucket: string;
readonly date_histogram: string;
readonly date_range: string;
readonly date_format_pattern: string;
readonly filter: string;
readonly filters: string;
readonly geohash_grid: string;
readonly histogram: string;
readonly ip_range: string;
readonly range: string;
readonly significant_terms: string;
readonly terms: string;
readonly avg: string;
readonly avg_bucket: string;
readonly max_bucket: string;
readonly min_bucket: string;
readonly sum_bucket: string;
readonly cardinality: string;
readonly count: string;
readonly cumulative_sum: string;
readonly derivative: string;
readonly geo_bounds: string;
readonly geo_centroid: string;
readonly max: string;
readonly median: string;
readonly min: string;
readonly moving_avg: string;
readonly percentile_ranks: string;
readonly serial_diff: string;
readonly std_dev: string;
readonly sum: string;
readonly top_hits: string;
};
readonly runtimeFields: {
readonly overview: string;
readonly mapping: string;
};
readonly scriptedFields: {
readonly scriptFields: string;
readonly scriptAggs: string;
readonly painless: string;
readonly painlessApi: string;
readonly painlessLangSpec: string;
readonly painlessSyntax: string;
readonly painlessWalkthrough: string;
readonly luceneExpressions: string;
};
readonly indexPatterns: {
readonly introduction: string;
readonly fieldFormattersNumber: string;
readonly fieldFormattersString: string;
};
readonly addData: string;
readonly kibana: string;
readonly upgradeAssistant: string;
readonly elasticsearch: Record<string, string>;
readonly siem: {
readonly guide: string;
readonly gettingStarted: string;
};
readonly query: {
readonly eql: string;
readonly kueryQuerySyntax: string;
readonly luceneQuerySyntax: string;
readonly percolate: string;
readonly queryDsl: string;
};
readonly date: {
readonly dateMath: string;
readonly dateMathIndexNames: string;
};
readonly management: Record<string, string>;
readonly ml: Record<string, string>;
readonly transforms: Record<string, string>;
readonly visualize: Record<string, string>;
readonly apis: Readonly<{
bulkIndexAlias: string;
createIndex: string;
createSnapshotLifecyclePolicy: string;
createRoleMapping: string;
createRoleMappingTemplates: string;
createApiKey: string;
createPipeline: string;
createTransformRequest: string;
cronExpressions: string;
executeWatchActionModes: string;
indexExists: string;
openIndex: string;
putComponentTemplate: string;
painlessExecute: string;
painlessExecuteAPIContexts: string;
putComponentTemplateMetadata: string;
putSnapshotLifecyclePolicy: string;
putIndexTemplateV1: string;
putWatch: string;
simulatePipeline: string;
updateTransform: string;
}>;
readonly observability: Record<string, string>;
readonly alerting: Record<string, string>;
readonly maps: Record<string, string>;
readonly monitoring: Record<string, string>;
readonly security: Readonly<{
apiKeyServiceSettings: string;
clusterPrivileges: string;
elasticsearchSettings: string;
elasticsearchEnableSecurity: string;
indicesPrivileges: string;
kibanaTLS: string;
kibanaPrivileges: string;
mappingRoles: string;
mappingRolesFieldRules: string;
runAsPrivilege: string;
}>;
readonly watcher: Record<string, string>;
readonly ccs: Record<string, string>;
readonly plugins: Record<string, string>;
readonly snapshotRestore: Record<string, string>;
readonly ingest: Record<string, string>;
} | | diff --git a/docs/development/core/public/kibana-plugin-core-public.navigatetoappoptions.openinnewtab.md b/docs/development/core/public/kibana-plugin-core-public.navigatetoappoptions.openinnewtab.md new file mode 100644 index 0000000000000..4609fa68b3824 --- /dev/null +++ b/docs/development/core/public/kibana-plugin-core-public.navigatetoappoptions.openinnewtab.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-core-public](./kibana-plugin-core-public.md) > [NavigateToAppOptions](./kibana-plugin-core-public.navigatetoappoptions.md) > [openInNewTab](./kibana-plugin-core-public.navigatetoappoptions.openinnewtab.md) + +## NavigateToAppOptions.openInNewTab property + +if true, will open the app in new tab, will share session information via window.open if base + +Signature: + +```typescript +openInNewTab?: boolean; +``` diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 4220d3e490f63..1696db23d2278 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -21,12 +21,16 @@ export class DocLinksService { const DOC_LINK_VERSION = injectedMetadata.getKibanaBranch(); const ELASTIC_WEBSITE_URL = 'https://www.elastic.co/'; const ELASTICSEARCH_DOCS = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}/`; + const KIBANA_DOCS = `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/`; const PLUGIN_DOCS = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/plugins/${DOC_LINK_VERSION}/`; return deepFreeze({ DOC_LINK_VERSION, ELASTIC_WEBSITE_URL, links: { + canvas: { + guide: `${KIBANA_DOCS}canvas.html`, + }, dashboard: { guide: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/dashboard.html`, drilldowns: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/drilldowns.html`, @@ -397,6 +401,9 @@ export interface DocLinksStart { readonly DOC_LINK_VERSION: string; readonly ELASTIC_WEBSITE_URL: string; readonly links: { + readonly canvas: { + readonly guide: string; + }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 18133ebec3353..b3ded52a98171 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -490,6 +490,9 @@ export interface DocLinksStart { readonly ELASTIC_WEBSITE_URL: string; // (undocumented) readonly links: { + readonly canvas: { + readonly guide: string; + }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; diff --git a/x-pack/plugins/canvas/public/application.tsx b/x-pack/plugins/canvas/public/application.tsx index f910aff9a83fe..154beb6faa7b0 100644 --- a/x-pack/plugins/canvas/public/application.tsx +++ b/x-pack/plugins/canvas/public/application.tsx @@ -24,7 +24,6 @@ import { KibanaContextProvider } from '../../../../src/plugins/kibana_react/publ import { registerLanguage } from './lib/monaco_language_def'; import { SetupRegistries } from './plugin_api'; import { initRegistries, populateRegistries, destroyRegistries } from './registries'; -import { getDocumentationLinks } from './lib/documentation_links'; import { HelpMenu } from './components/help_menu/help_menu'; import { createStore } from './store'; @@ -127,6 +126,8 @@ export const initializeCanvas = async ( } ); + // Setup documentation links + const { docLinks } = coreStart; // Set help extensions coreStart.chrome.setHelpExtension({ appName: i18n.translate('xpack.canvas.helpMenu.appName', { @@ -135,7 +136,7 @@ export const initializeCanvas = async ( links: [ { linkType: 'documentation', - href: getDocumentationLinks().canvas, + href: docLinks.links.canvas.guide, }, ], content: (domNode) => { diff --git a/x-pack/plugins/canvas/public/lib/documentation_links.ts b/x-pack/plugins/canvas/public/lib/documentation_links.ts deleted file mode 100644 index e76ab6d1db54b..0000000000000 --- a/x-pack/plugins/canvas/public/lib/documentation_links.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { platformService } from '../services'; - -export const getDocumentationLinks = () => ({ - canvas: `${platformService - .getService() - .getElasticWebsiteUrl()}guide/en/kibana/${platformService - .getService() - .getDocLinkVersion()}/canvas.html`, - numeral: `${platformService - .getService() - .getElasticWebsiteUrl()}guide/en/kibana/${platformService - .getService() - .getDocLinkVersion()}/guide/numeral.html`, -}); From a90afbf1ec9792655d56f151899948325ba2bd46 Mon Sep 17 00:00:00 2001 From: Marshall Main <55718608+marshallmain@users.noreply.github.com> Date: Mon, 19 Apr 2021 16:10:59 -0400 Subject: [PATCH 52/82] [Security Solution][Detections] Add API integration tests for threshold and EQL rules (#97336) * Add API integration tests for threshold rules and more tests for EQL rules * Add API more tests for exceptions and value list exceptions * Fix unit test and add EQL api test checking multiple signal generation Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../detection_engine/get_query_filter.test.ts | 2 +- .../detection_engine/get_query_filter.ts | 12 +- .../tests/create_exceptions.ts | 232 +++++++- .../tests/generating_signals.ts | 545 +++++++++++++++++- .../detection_engine_api_integration/utils.ts | 28 +- 5 files changed, 763 insertions(+), 56 deletions(-) diff --git a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts index 3c04e2b0da9c3..63a38ad7d71c1 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts @@ -1161,8 +1161,8 @@ describe('get_filter', () => { expect(request).toEqual({ method: 'POST', path: `/testindex1,testindex2/_eql/search?allow_no_indices=true`, - event_category_field: 'event.other_category', body: { + event_category_field: 'event.other_category', size: 100, query: 'process where true', filter: { diff --git a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts index 70fe2b6187aa6..e562d186bc424 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts @@ -65,7 +65,6 @@ interface EqlSearchRequest { method: string; path: string; body: object; - event_category_field?: string; } export const buildEqlSearchRequest = ( @@ -109,7 +108,7 @@ export const buildEqlSearchRequest = ( }, }); } - const baseRequest = { + return { method: 'POST', path: `/${indexString}/_eql/search?allow_no_indices=true`, body: { @@ -120,14 +119,7 @@ export const buildEqlSearchRequest = ( filter: requestFilter, }, }, + event_category_field: eventCategoryOverride, }, }; - if (eventCategoryOverride) { - return { - ...baseRequest, - event_category_field: eventCategoryOverride, - }; - } else { - return baseRequest; - } }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts index e8beef3e58a43..18f9858726723 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts @@ -8,9 +8,20 @@ /* eslint-disable @typescript-eslint/naming-convention */ import expect from '@kbn/expect'; -import { CreateRulesSchema } from '../../../../plugins/security_solution/common/detection_engine/schemas/request'; +import { + CreateRulesSchema, + EqlCreateSchema, + QueryCreateSchema, + ThreatMatchCreateSchema, + ThresholdCreateSchema, +} from '../../../../plugins/security_solution/common/detection_engine/schemas/request'; import { getCreateExceptionListItemMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_item_schema.mock'; -import { deleteAllExceptions } from '../../../lists_api_integration/utils'; +import { + createListsIndex, + deleteAllExceptions, + deleteListsIndex, + importFile, +} from '../../../lists_api_integration/utils'; import { RulesSchema } from '../../../../plugins/security_solution/common/detection_engine/schemas/response'; import { getCreateExceptionListMinimalSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_exception_list_schema.mock'; import { CreateExceptionListItemSchema } from '../../../../plugins/lists/common'; @@ -39,6 +50,9 @@ import { getSignalsByIds, findImmutableRuleById, getPrePackagedRulesStatus, + getRuleForSignalTesting, + getOpenSignals, + createRuleWithExceptionEntries, } from '../../utils'; import { ROLES } from '../../../../plugins/security_solution/common/test'; import { createUserAndRole, deleteUserAndRole } from '../roles_users_utils'; @@ -576,49 +590,211 @@ export default ({ getService }: FtrProviderContext) => { }); it('should be able to execute against an exception list that does include valid entries and get back 0 signals', async () => { - const { id, list_id, namespace_type, type } = await createExceptionList( - supertest, - getCreateExceptionListMinimalSchemaMock() - ); - - const exceptionListItem: CreateExceptionListItemSchema = { - ...getCreateExceptionListItemMinimalSchemaMock(), - entries: [ + const rule: QueryCreateSchema = { + name: 'Simple Rule Query', + description: 'Simple Rule Query', + enabled: true, + risk_score: 1, + rule_id: 'rule-1', + severity: 'high', + index: ['auditbeat-*'], + type: 'query', + from: '1900-01-01T00:00:00.000Z', + query: 'host.name: "suricata-sensor-amsterdam"', + }; + const createdRule = await createRuleWithExceptionEntries(supertest, rule, [ + [ { - field: 'host.name', // This matches the query below which will exclude everything + field: 'host.name', // This matches the query above which will exclude everything operator: 'included', type: 'match', value: 'suricata-sensor-amsterdam', }, ], + ]); + const signalsOpen = await getOpenSignals(supertest, es, createdRule); + expect(signalsOpen.hits.hits.length).equal(0); + }); + + it('generates no signals when an exception is added for an EQL rule', async () => { + const rule: EqlCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: 'eql-rule', + type: 'eql', + language: 'eql', + query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', }; - await createExceptionListItem(supertest, exceptionListItem); + const createdRule = await createRuleWithExceptionEntries(supertest, rule, [ + [ + { + field: 'host.id', + operator: 'included', + type: 'match', + value: '8cc95778cce5407c809480e8e32ad76b', + }, + ], + ]); + const signalsOpen = await getOpenSignals(supertest, es, createdRule); + expect(signalsOpen.hits.hits.length).equal(0); + }); - const ruleWithException: CreateRulesSchema = { - name: 'Simple Rule Query', - description: 'Simple Rule Query', - enabled: true, - risk_score: 1, - rule_id: 'rule-1', + it('generates no signals when an exception is added for a threshold rule', async () => { + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: 'threshold-rule', + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: 'host.id', + value: 700, + }, + }; + const createdRule = await createRuleWithExceptionEntries(supertest, rule, [ + [ + { + field: 'host.id', + operator: 'included', + type: 'match', + value: '8cc95778cce5407c809480e8e32ad76b', + }, + ], + ]); + const signalsOpen = await getOpenSignals(supertest, es, createdRule); + expect(signalsOpen.hits.hits.length).equal(0); + }); + + it('generates no signals when an exception is added for a threat match rule', async () => { + const rule: ThreatMatchCreateSchema = { + description: 'Detecting root and admin users', + name: 'Query with a rule id', severity: 'high', index: ['auditbeat-*'], - type: 'query', + type: 'threat_match', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', from: '1900-01-01T00:00:00.000Z', - query: 'host.name: "suricata-sensor-amsterdam"', - exceptions_list: [ + query: '*:*', + threat_query: 'source.ip: "188.166.120.93"', // narrow things down with a query to a specific source ip + threat_index: ['auditbeat-*'], // We use auditbeat as both the matching index and the threat list for simplicity + threat_mapping: [ + // We match host.name against host.name { - id, - list_id, - namespace_type, - type, + entries: [ + { + field: 'host.name', + value: 'host.name', + type: 'mapping', + }, + ], }, ], + threat_filters: [], }; - const rule = await createRule(supertest, ruleWithException); - await waitForRuleSuccessOrStatus(supertest, rule.id); - const signalsOpen = await getSignalsByIds(supertest, [rule.id]); + + const createdRule = await createRuleWithExceptionEntries(supertest, rule, [ + [ + { + field: 'source.ip', + operator: 'included', + type: 'match', + value: '188.166.120.93', + }, + ], + ]); + const signalsOpen = await getOpenSignals(supertest, es, createdRule); expect(signalsOpen.hits.hits.length).equal(0); }); + describe('rules with value list exceptions', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('generates no signals when a value list exception is added for a query rule', async () => { + const valueListId = 'value-list-id'; + await importFile(supertest, 'keyword', ['suricata-sensor-amsterdam'], valueListId); + const rule: QueryCreateSchema = { + name: 'Simple Rule Query', + description: 'Simple Rule Query', + enabled: true, + risk_score: 1, + rule_id: 'rule-1', + severity: 'high', + index: ['auditbeat-*'], + type: 'query', + from: '1900-01-01T00:00:00.000Z', + query: 'host.name: "suricata-sensor-amsterdam"', + }; + const createdRule = await createRuleWithExceptionEntries(supertest, rule, [ + [ + { + field: 'host.name', + operator: 'included', + type: 'list', + list: { + id: valueListId, + type: 'keyword', + }, + }, + ], + ]); + const signalsOpen = await getOpenSignals(supertest, es, createdRule); + expect(signalsOpen.hits.hits.length).equal(0); + }); + + it('generates no signals when a value list exception is added for a threat match rule', async () => { + const valueListId = 'value-list-id'; + await importFile(supertest, 'keyword', ['zeek-sensor-amsterdam'], valueListId); + const rule: ThreatMatchCreateSchema = { + description: 'Detecting root and admin users', + name: 'Query with a rule id', + severity: 'high', + index: ['auditbeat-*'], + type: 'threat_match', + risk_score: 55, + language: 'kuery', + rule_id: 'rule-1', + from: '1900-01-01T00:00:00.000Z', + query: '*:*', + threat_query: 'source.ip: "188.166.120.93"', // narrow things down with a query to a specific source ip + threat_index: ['auditbeat-*'], // We use auditbeat as both the matching index and the threat list for simplicity + threat_mapping: [ + // We match host.name against host.name + { + entries: [ + { + field: 'host.name', + value: 'host.name', + type: 'mapping', + }, + ], + }, + ], + threat_filters: [], + }; + + const createdRule = await createRuleWithExceptionEntries(supertest, rule, [ + [ + { + field: 'host.name', + operator: 'included', + type: 'list', + list: { + id: valueListId, + type: 'keyword', + }, + }, + ], + ]); + const signalsOpen = await getOpenSignals(supertest, es, createdRule); + expect(signalsOpen.hits.hits.length).equal(0); + }); + }); }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts index 08fb9222e1789..6f437f7bcc8e5 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/generating_signals.ts @@ -6,11 +6,12 @@ */ import expect from '@kbn/expect'; -import { orderBy } from 'lodash'; +import { orderBy, get } from 'lodash'; import { EqlCreateSchema, QueryCreateSchema, + ThresholdCreateSchema, } from '../../../../plugins/security_solution/common/detection_engine/schemas/request'; import { DEFAULT_SIGNALS_INDEX } from '../../../../plugins/security_solution/common/constants'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -216,19 +217,286 @@ export default ({ getService }: FtrProviderContext) => { }); describe('EQL Rules', () => { - it('generates signals from EQL sequences in the expected form', async () => { + it('generates a correctly formatted signal from EQL non-sequence queries', async () => { const rule: EqlCreateSchema = { ...getRuleForSignalTesting(['auditbeat-*']), rule_id: 'eql-rule', type: 'eql', language: 'eql', - query: 'sequence by host.name [any where true] [any where true]', + query: 'configuration where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, 1, [id]); + const signals = await getSignalsByRuleIds(supertest, ['eql-rule']); + expect(signals.hits.hits.length).eql(1); + const fullSignal = signals.hits.hits[0]._source; + + expect(fullSignal).eql({ + '@timestamp': fullSignal['@timestamp'], + agent: { + ephemeral_id: '0010d67a-14f7-41da-be30-489fea735967', + hostname: 'suricata-zeek-sensor-toronto', + id: 'a1d7b39c-f898-4dbe-a761-efb61939302d', + type: 'auditbeat', + version: '8.0.0', + }, + auditd: { + data: { + audit_enabled: '1', + old: '1', + }, + message_type: 'config_change', + result: 'success', + sequence: 1496, + session: 'unset', + summary: { + actor: { + primary: 'unset', + }, + object: { + primary: '1', + type: 'audit-config', + }, + }, + }, + cloud: { + instance: { + id: '133555295', + }, + provider: 'digitalocean', + region: 'tor1', + }, + ecs: { + version: '1.0.0-beta2', + }, + event: { + action: 'changed-audit-configuration', + category: 'configuration', + module: 'auditd', + kind: 'signal', + }, + host: { + architecture: 'x86_64', + containerized: false, + hostname: 'suricata-zeek-sensor-toronto', + id: '8cc95778cce5407c809480e8e32ad76b', + name: 'suricata-zeek-sensor-toronto', + os: { + codename: 'bionic', + family: 'debian', + kernel: '4.15.0-45-generic', + name: 'Ubuntu', + platform: 'ubuntu', + version: '18.04.2 LTS (Bionic Beaver)', + }, + }, + service: { + type: 'auditd', + }, + user: { + audit: { + id: 'unset', + }, + }, + signal: { + rule: fullSignal.signal.rule, + original_time: fullSignal.signal.original_time, + status: 'open', + depth: 1, + ancestors: [ + { + depth: 0, + id: '9xbRBmkBR346wHgngz2D', + index: 'auditbeat-8.0.0-2019.02.19-000001', + type: 'event', + }, + ], + original_event: { + action: 'changed-audit-configuration', + category: 'configuration', + module: 'auditd', + }, + parent: { + depth: 0, + id: '9xbRBmkBR346wHgngz2D', + index: 'auditbeat-8.0.0-2019.02.19-000001', + type: 'event', + }, + parents: [ + { + depth: 0, + id: '9xbRBmkBR346wHgngz2D', + index: 'auditbeat-8.0.0-2019.02.19-000001', + type: 'event', + }, + ], + _meta: { + version: SIGNALS_TEMPLATE_VERSION, + }, + }, + }); + }); + + it('generates up to max_signals for non-sequence EQL queries', async () => { + const rule: EqlCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: 'eql-rule', + type: 'eql', + language: 'eql', + query: 'any where true', + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, 100, [id]); + const signals = await getSignalsByIds(supertest, [id], 1000); + const filteredSignals = signals.hits.hits.filter( + (signal) => signal._source.signal.depth === 1 + ); + expect(filteredSignals.length).eql(100); + }); + + it('uses the provided event_category_override', async () => { + const rule: EqlCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: 'eql-rule', + type: 'eql', + language: 'eql', + query: 'config_change where agent.id=="a1d7b39c-f898-4dbe-a761-efb61939302d"', + event_category_override: 'auditd.message_type', }; const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 1, [id]); const signals = await getSignalsByRuleIds(supertest, ['eql-rule']); - const signal = signals.hits.hits[0]._source.signal; + expect(signals.hits.hits.length).eql(1); + const fullSignal = signals.hits.hits[0]._source; + + expect(fullSignal).eql({ + '@timestamp': fullSignal['@timestamp'], + agent: { + ephemeral_id: '0010d67a-14f7-41da-be30-489fea735967', + hostname: 'suricata-zeek-sensor-toronto', + id: 'a1d7b39c-f898-4dbe-a761-efb61939302d', + type: 'auditbeat', + version: '8.0.0', + }, + auditd: { + data: { + audit_enabled: '1', + old: '1', + }, + message_type: 'config_change', + result: 'success', + sequence: 1496, + session: 'unset', + summary: { + actor: { + primary: 'unset', + }, + object: { + primary: '1', + type: 'audit-config', + }, + }, + }, + cloud: { + instance: { + id: '133555295', + }, + provider: 'digitalocean', + region: 'tor1', + }, + ecs: { + version: '1.0.0-beta2', + }, + event: { + action: 'changed-audit-configuration', + category: 'configuration', + module: 'auditd', + kind: 'signal', + }, + host: { + architecture: 'x86_64', + containerized: false, + hostname: 'suricata-zeek-sensor-toronto', + id: '8cc95778cce5407c809480e8e32ad76b', + name: 'suricata-zeek-sensor-toronto', + os: { + codename: 'bionic', + family: 'debian', + kernel: '4.15.0-45-generic', + name: 'Ubuntu', + platform: 'ubuntu', + version: '18.04.2 LTS (Bionic Beaver)', + }, + }, + service: { + type: 'auditd', + }, + user: { + audit: { + id: 'unset', + }, + }, + signal: { + rule: fullSignal.signal.rule, + original_time: fullSignal.signal.original_time, + status: 'open', + depth: 1, + ancestors: [ + { + depth: 0, + id: '9xbRBmkBR346wHgngz2D', + index: 'auditbeat-8.0.0-2019.02.19-000001', + type: 'event', + }, + ], + original_event: { + action: 'changed-audit-configuration', + category: 'configuration', + module: 'auditd', + }, + parent: { + depth: 0, + id: '9xbRBmkBR346wHgngz2D', + index: 'auditbeat-8.0.0-2019.02.19-000001', + type: 'event', + }, + parents: [ + { + depth: 0, + id: '9xbRBmkBR346wHgngz2D', + index: 'auditbeat-8.0.0-2019.02.19-000001', + type: 'event', + }, + ], + _meta: { + version: SIGNALS_TEMPLATE_VERSION, + }, + }, + }); + }); + + it('generates building block signals from EQL sequences in the expected form', async () => { + const rule: EqlCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: 'eql-rule', + type: 'eql', + language: 'eql', + query: 'sequence by host.name [anomoly where true] [any where true]', + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, 3, [id]); + const signals = await getSignalsByRuleIds(supertest, ['eql-rule']); + const buildingBlock = signals.hits.hits.find( + (signal) => + signal._source.signal.depth === 1 && + get(signal._source, 'signal.original_event.category') === 'anomoly' + ); + expect(buildingBlock).not.eql(undefined); + const signal = buildingBlock!._source.signal; expect(signal).eql({ rule: signal.rule, @@ -239,26 +507,26 @@ export default ({ getService }: FtrProviderContext) => { ancestors: [ { depth: 0, - id: 'gCF0B2kBR346wHgnb7m0', + id: 'VhXOBmkBR346wHgnLP8T', index: 'auditbeat-8.0.0-2019.02.19-000001', type: 'event', }, ], original_event: { - action: 'error', - category: 'user-login', + action: 'changed-promiscuous-mode-on-device', + category: 'anomoly', module: 'auditd', }, parent: { depth: 0, - id: 'gCF0B2kBR346wHgnb7m0', + id: 'VhXOBmkBR346wHgnLP8T', index: 'auditbeat-8.0.0-2019.02.19-000001', type: 'event', }, parents: [ { depth: 0, - id: 'gCF0B2kBR346wHgnb7m0', + id: 'VhXOBmkBR346wHgnLP8T', index: 'auditbeat-8.0.0-2019.02.19-000001', type: 'event', }, @@ -269,24 +537,23 @@ export default ({ getService }: FtrProviderContext) => { }); }); - it('generates building block signals from EQL sequences in the expected form', async () => { + it('generates shell signals from EQL sequences in the expected form', async () => { const rule: EqlCreateSchema = { ...getRuleForSignalTesting(['auditbeat-*']), rule_id: 'eql-rule', type: 'eql', language: 'eql', - query: 'sequence by host.name [any where true] [any where true]', + query: 'sequence by host.name [anomoly where true] [any where true]', }; const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); - await waitForSignalsToBePresent(supertest, 10, [id]); + await waitForSignalsToBePresent(supertest, 3, [id]); const signalsOpen = await getSignalsByRuleIds(supertest, ['eql-rule']); const sequenceSignal = signalsOpen.hits.hits.find( (signal) => signal._source.signal.depth === 2 ); const signal = sequenceSignal!._source.signal; const eventIds = signal.parents.map((event) => event.id); - expect(signal).eql({ status: 'open', depth: 2, @@ -295,7 +562,7 @@ export default ({ getService }: FtrProviderContext) => { ancestors: [ { depth: 0, - id: 'gCF0B2kBR346wHgnb7m0', + id: 'VhXOBmkBR346wHgnLP8T', index: 'auditbeat-8.0.0-2019.02.19-000001', type: 'event', }, @@ -308,7 +575,7 @@ export default ({ getService }: FtrProviderContext) => { }, { depth: 0, - id: 'CCF0B2kBR346wHgngLtX', + id: '4hbXBmkBR346wHgn6fdp', index: 'auditbeat-8.0.0-2019.02.19-000001', type: 'event', }, @@ -341,6 +608,254 @@ export default ({ getService }: FtrProviderContext) => { }, }); }); + + it('generates up to max_signals with an EQL rule', async () => { + const rule: EqlCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: 'eql-rule', + type: 'eql', + language: 'eql', + query: 'sequence by host.name [any where true] [any where true]', + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + // For EQL rules, max_signals is the maximum number of detected sequences: each sequence has a building block + // alert for each event in the sequence, so max_signals=100 results in 200 building blocks in addition to + // 100 regular alerts + await waitForSignalsToBePresent(supertest, 300, [id]); + const signalsOpen = await getSignalsByIds(supertest, [id], 1000); + expect(signalsOpen.hits.hits.length).eql(300); + const shellSignals = signalsOpen.hits.hits.filter( + (signal) => signal._source.signal.depth === 2 + ); + const buildingBlocks = signalsOpen.hits.hits.filter( + (signal) => signal._source.signal.depth === 1 + ); + expect(shellSignals.length).eql(100); + expect(buildingBlocks.length).eql(200); + }); + }); + + describe('Threshold Rules', () => { + it('generates 1 signal from Threshold rules when threshold is met', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: 'host.id', + value: 700, + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, 1, [id]); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(1); + const signal = signalsOpen.hits.hits[0]; + expect(signal._source.signal.threshold_result).eql({ + terms: [ + { + field: 'host.id', + value: '8cc95778cce5407c809480e8e32ad76b', + }, + ], + count: 788, + from: '1900-01-01T00:00:00.000Z', + }); + }); + + it('generates 2 signals from Threshold rules when threshold is met', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: 'host.id', + value: 100, + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, 2, [id]); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(2); + }); + + it('applies the provided query before bucketing ', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: 'host.id:"2ab45fc1c41e4c84bbd02202a7e5761f"', + threshold: { + field: 'process.name', + value: 21, + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + await waitForSignalsToBePresent(supertest, 1, [id]); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(1); + }); + + it('generates no signals from Threshold rules when threshold is met and cardinality is not met', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: 'host.id', + value: 100, + cardinality: [ + { + field: 'destination.ip', + value: 100, + }, + ], + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(0); + }); + + it('generates no signals from Threshold rules when cardinality is met and threshold is not met', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: 'host.id', + value: 1000, + cardinality: [ + { + field: 'destination.ip', + value: 5, + }, + ], + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(0); + }); + + it('generates signals from Threshold rules when threshold and cardinality are both met', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: 'host.id', + value: 100, + cardinality: [ + { + field: 'destination.ip', + value: 5, + }, + ], + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(1); + const signal = signalsOpen.hits.hits[0]; + expect(signal._source.signal.threshold_result).eql({ + terms: [ + { + field: 'host.id', + value: '8cc95778cce5407c809480e8e32ad76b', + }, + ], + cardinality: [ + { + field: 'destination.ip', + value: 7, + }, + ], + count: 788, + from: '1900-01-01T00:00:00.000Z', + }); + }); + + it('should not generate signals if only one field meets the threshold requirement', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: ['host.id', 'process.name'], + value: 22, + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(0); + }); + + it('generates signals from Threshold rules when bucketing by multiple fields', async () => { + const ruleId = 'threshold-rule'; + const rule: ThresholdCreateSchema = { + ...getRuleForSignalTesting(['auditbeat-*']), + rule_id: ruleId, + type: 'threshold', + language: 'kuery', + query: '*:*', + threshold: { + field: ['host.id', 'process.name', 'event.module'], + value: 21, + }, + }; + const { id } = await createRule(supertest, rule); + await waitForRuleSuccessOrStatus(supertest, id); + const signalsOpen = await getSignalsByRuleIds(supertest, [ruleId]); + expect(signalsOpen.hits.hits.length).eql(1); + const signal = signalsOpen.hits.hits[0]; + expect(signal._source.signal.threshold_result).eql({ + terms: [ + { + field: 'event.module', + value: 'system', + }, + { + field: 'host.id', + value: '2ab45fc1c41e4c84bbd02202a7e5761f', + }, + { + field: 'process.name', + value: 'sshd', + }, + ], + count: 21, + from: '1900-01-01T00:00:00.000Z', + }); + }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/utils.ts b/x-pack/test/detection_engine_api_integration/utils.ts index d821b57faf225..55011ec055190 100644 --- a/x-pack/test/detection_engine_api_integration/utils.ts +++ b/x-pack/test/detection_engine_api_integration/utils.ts @@ -778,6 +778,17 @@ export const countDownES = async ( ); }; +/** + * Refresh an index, making changes available to search. + * Useful for tests where we want to ensure that a rule does NOT create alerts, e.g. testing exceptions. + * @param es The ElasticSearch handle + */ +export const refreshIndex = async (es: KibanaClient, index?: string) => { + await es.indices.refresh({ + index, + }); +}; + /** * Does a plain countdown and checks against a boolean to determine if to wait and try again. * This is useful for over the wire things that can cause issues such as conflict or timeouts @@ -1107,7 +1118,7 @@ export const installPrePackagedRules = async ( */ export const createRuleWithExceptionEntries = async ( supertest: SuperTest, - rule: QueryCreateSchema, + rule: CreateRulesSchema, entries: NonEmptyEntriesArray[] ): Promise => { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -1141,7 +1152,7 @@ export const createRuleWithExceptionEntries = async ( // the rule to sometimes not filter correctly the first time with an exception list // or other timing issues. Then afterwards wait for the rule to have succeeded before // returning. - const ruleWithException: QueryCreateSchema = { + const ruleWithException: CreateRulesSchema = { ...rule, enabled: false, exceptions_list: [ @@ -1202,3 +1213,16 @@ export const deleteMigrations = async ({ ) ); }; + +export const getOpenSignals = async ( + supertest: SuperTest, + es: KibanaClient, + rule: FullResponseSchema +) => { + await waitForRuleSuccessOrStatus(supertest, rule.id); + // Critically important that we wait for rule success AND refresh the write index in that order before we + // assert that no signals were created. Otherwise, signals could be written but not available to query yet + // when we search, causing tests that check that signals are NOT created to pass when they should fail. + await refreshIndex(es, rule.output_index); + return getSignalsByIds(supertest, [rule.id]); +}; From c67cda194f3bf225cf80b42acf679b22ea587d82 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 19 Apr 2021 15:12:05 -0500 Subject: [PATCH 53/82] Flyout and alerts table improvements (#96976) * Extend the TopAlert interface to include all the properties of the alert as well as the computed properties we add. Use these in the table and flyout. * Create a severity badge and use it in the table and flyout ![image](https://user-images.githubusercontent.com/9912/114796499-bc7d2b00-9d56-11eb-89fa-17c0240819ee.png) * Fix the query language toggle in the search bar ![image](https://user-images.githubusercontent.com/9912/114796507-c69f2980-9d56-11eb-8cfc-8432e4a71e77.png) # Table * Update status badges to match design ![image](https://user-images.githubusercontent.com/9912/114796518-ce5ece00-9d56-11eb-80a7-b8c8aa63d6b5.png) * Remove checkbox column * Make flyout open when clicking the reason * Change alert details link to a view in app link ![image](https://user-images.githubusercontent.com/9912/114796530-d74f9f80-9d56-11eb-951c-91e544c6e1d5.png) # Flyout * Add action button to flyout * Replace table on flyout with description list * Remove unused tabs on flyout * Add rule type to flyout heading * Add expected and actual value to the flyout ![image](https://user-images.githubusercontent.com/9912/114796550-e59dbb80-9d56-11eb-9825-25da979c3b22.png) Fixes #96907. --- .../public/pages/alerts/alerts.stories.tsx | 13 +- .../public/pages/alerts/alerts_flyout.tsx | 120 ----------------- .../alerts_flyout/alerts_flyout.stories.tsx | 86 ++++++++++++ .../pages/alerts/alerts_flyout/index.tsx | 126 ++++++++++++++++++ .../public/pages/alerts/alerts_search_bar.tsx | 6 +- .../public/pages/alerts/alerts_table.tsx | 100 ++++++++------ .../public/pages/alerts/example_data.ts | 11 +- .../public/pages/alerts/index.tsx | 15 ++- .../pages/alerts/severity_badge.stories.tsx | 21 +++ .../public/pages/alerts/severity_badge.tsx | 30 +++++ .../rules/observability_rule_registry_mock.ts | 2 +- 11 files changed, 339 insertions(+), 191 deletions(-) delete mode 100644 x-pack/plugins/observability/public/pages/alerts/alerts_flyout.tsx create mode 100644 x-pack/plugins/observability/public/pages/alerts/alerts_flyout/alerts_flyout.stories.tsx create mode 100644 x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx create mode 100644 x-pack/plugins/observability/public/pages/alerts/severity_badge.stories.tsx create mode 100644 x-pack/plugins/observability/public/pages/alerts/severity_badge.tsx diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts.stories.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts.stories.tsx index 33eec65c40dce..6940f6aaad692 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts.stories.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts.stories.tsx @@ -16,18 +16,12 @@ import { PluginContext, PluginContextValue } from '../../context/plugin_context' import { createObservabilityRuleRegistryMock } from '../../rules/observability_rule_registry_mock'; import { createCallObservabilityApi } from '../../services/call_observability_api'; import type { ObservabilityAPIReturnType } from '../../services/call_observability_api/types'; -import { AlertsFlyout } from './alerts_flyout'; -import { TopAlert } from './alerts_table'; -import { apmAlertResponseExample, dynamicIndexPattern, flyoutItemExample } from './example_data'; +import { apmAlertResponseExample, dynamicIndexPattern } from './example_data'; interface PageArgs { items: ObservabilityAPIReturnType<'GET /api/observability/rules/alerts/top'>; } -interface FlyoutArgs { - alert: TopAlert; -} - export default { title: 'app/Alerts', component: AlertsPage, @@ -95,8 +89,3 @@ export function EmptyState(_args: PageArgs) { return ; } EmptyState.args = { items: [] } as PageArgs; - -export function Flyout({ alert }: FlyoutArgs) { - return {}} />; -} -Flyout.args = { alert: flyoutItemExample } as FlyoutArgs; diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_flyout.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout.tsx deleted file mode 100644 index 4b383283c4d4b..0000000000000 --- a/x-pack/plugins/observability/public/pages/alerts/alerts_flyout.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiFlyout, - EuiFlyoutHeader, - EuiFlyoutProps, - EuiInMemoryTable, - EuiSpacer, - EuiTabbedContent, - EuiTitle, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import { asDuration } from '../../../common/utils/formatters'; -import { TopAlert } from './alerts_table'; - -type AlertsFlyoutProps = { alert: TopAlert } & EuiFlyoutProps; - -export function AlertsFlyout(props: AlertsFlyoutProps) { - const { onClose, alert } = props; - - const overviewListItems = [ - { - title: 'Status', - description: alert.active ? 'Active' : 'Recovered', - }, - { - title: 'Severity', - description: alert.severityLevel || '-', // TODO: badge and "(changed 2 min ago)" - }, - // { - // title: 'Affected entity', - // description: affectedEntity || '-', // TODO: link to entity - // }, - { - title: 'Triggered', - description: alert.start, // TODO: format date - }, - { - title: 'Duration', - description: asDuration(alert.duration, { extended: true }) || '-', // TODO: format duration - }, - // { - // title: 'Expected value', - // description: expectedValue || '-', - // }, - // { - // title: 'Actual value', - // description: actualValue || '-', - // }, - { - title: 'Rule type', - description: alert.ruleCategory || '-', - }, - ]; - - const tabs = [ - { - id: 'overview', - name: i18n.translate('xpack.observability.alerts.flyoutOverviewTabTitle', { - defaultMessage: 'Overview', - }), - content: ( - <> - - - {/* - -

Severity log

-
- ( - <> - {item.severity} {item.message} - - ), - }, - ]} - items={severityLog ?? []} - /> */} - - ), - }, - { - id: 'metadata', - name: i18n.translate('xpack.observability.alerts.flyoutMetadataTabTitle', { - defaultMessage: 'Metadata', - }), - disabled: true, - content: <>, - }, - ]; - - return ( - - - -

{alert.ruleName}

-
- -
-
- ); -} diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/alerts_flyout.stories.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/alerts_flyout.stories.tsx new file mode 100644 index 0000000000000..96d3c1fc9c390 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/alerts_flyout.stories.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ComponentType } from 'react'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; +import { PluginContext, PluginContextValue } from '../../../context/plugin_context'; +import { TopAlert } from '../'; +import { AlertsFlyout } from './'; + +interface Args { + alert: TopAlert; +} + +export default { + title: 'app/Alerts/AlertsFlyout', + component: AlertsFlyout, + decorators: [ + (Story: ComponentType) => { + return ( + {} }, + uiSettings: { + get: (setting: string) => { + if (setting === 'dateFormat') { + return 'MMM D, YYYY @ HH:mm:ss.SSS'; + } + }, + }, + }} + > + {' '} + '' } }, + }, + } as unknown) as PluginContextValue + } + > + + + + // + ); + }, + ], +}; + +export function Example({ alert }: Args) { + return {}} />; +} +Example.args = { + alert: { + link: '/app/apm/services/opbeans-java?rangeFrom=now-15m&rangeTo=now', + reason: 'Error count for opbeans-java was above the threshold', + active: true, + start: 1618235449493, + + 'rule.id': 'apm.error_rate', + 'service.environment': 'production', + 'service.name': 'opbeans-java', + 'rule.name': 'Error count threshold | opbeans-java (smith test)', + 'kibana.rac.alert.duration.us': 61787000, + 'kibana.observability.evaluation.threshold': 0, + 'kibana.rac.alert.status': 'open', + tags: ['apm', 'service.name:opbeans-java'], + 'kibana.rac.alert.uuid': 'c50fbc70-0d77-462d-ac0a-f2bd0b8512e4', + 'rule.uuid': '474920d0-93e9-11eb-ac86-0b455460de81', + 'event.action': 'active', + '@timestamp': '2021-04-14T21:43:42.966Z', + 'kibana.rac.alert.id': 'apm.error_rate_opbeans-java_production', + 'processor.event': 'error', + 'kibana.rac.alert.start': '2021-04-14T21:42:41.179Z', + 'kibana.rac.producer': 'apm', + 'event.kind': 'state', + 'rule.category': 'Error count threshold', + 'kibana.observability.evaluation.value': 1, + }, +} as Args; diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx new file mode 100644 index 0000000000000..892274b2fb8b0 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButton, + EuiDescriptionList, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiFlyoutProps, + EuiSpacer, + EuiTabbedContent, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import moment from 'moment-timezone'; +import React from 'react'; +import { useUiSetting } from '../../../../../../../src/plugins/kibana_react/public'; +import { asDuration } from '../../../../common/utils/formatters'; +import { usePluginContext } from '../../../hooks/use_plugin_context'; +import { TopAlert } from '../'; +import { SeverityBadge } from '../severity_badge'; + +type AlertsFlyoutProps = { alert: TopAlert } & EuiFlyoutProps; + +export function AlertsFlyout({ onClose, alert }: AlertsFlyoutProps) { + const dateFormat = useUiSetting('dateFormat'); + const { core } = usePluginContext(); + const { prepend } = core.http.basePath; + + const overviewListItems = [ + { + title: i18n.translate('xpack.observability.alertsFlyout.statusLabel', { + defaultMessage: 'Status', + }), + description: alert.active ? 'Active' : 'Recovered', + }, + { + title: i18n.translate('xpack.observability.alertsFlyout.severityLabel', { + defaultMessage: 'Severity', + }), + description: , + }, + { + title: i18n.translate('xpack.observability.alertsFlyout.triggeredLabel', { + defaultMessage: 'Triggered', + }), + description: ( + {moment(alert.start).format(dateFormat)} + ), + }, + { + title: i18n.translate('xpack.observability.alertsFlyout.durationLabel', { + defaultMessage: 'Duration', + }), + description: asDuration(alert['kibana.rac.alert.duration.us'], { extended: true }), + }, + { + title: i18n.translate('xpack.observability.alertsFlyout.expectedValueLabel', { + defaultMessage: 'Expected value', + }), + description: alert['kibana.observability.evaluation.threshold'] ?? '-', + }, + { + title: i18n.translate('xpack.observability.alertsFlyout.actualValueLabel', { + defaultMessage: 'Actual value', + }), + description: alert['kibana.observability.evaluation.value'] ?? '-', + }, + { + title: i18n.translate('xpack.observability.alertsFlyout.ruleTypeLabel', { + defaultMessage: 'Rule type', + }), + description: alert['rule.category'] ?? '-', + }, + ]; + + const tabs = [ + { + id: 'overview', + name: i18n.translate('xpack.observability.alerts.flyoutOverviewTabTitle', { + defaultMessage: 'Overview', + }), + content: ( + <> + + + + ), + }, + ]; + + return ( + + + +

{alert['rule.name']}

+
+ + {alert.reason} +
+ + + + {alert.link && ( + + + + + View in app + + + + + )} +
+ ); +} diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_search_bar.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_search_bar.tsx index 97595b456d503..c0a08fa7faac7 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts_search_bar.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts_search_bar.tsx @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; import { SearchBar, TimeHistory } from '../../../../../../src/plugins/data/public'; import { Storage } from '../../../../../../src/plugins/kibana_utils/public'; import { useFetcher } from '../../hooks/use_fetcher'; @@ -29,6 +29,7 @@ export function AlertsSearchBar({ const timeHistory = useMemo(() => { return new TimeHistory(new Storage(localStorage)); }, []); + const [queryLanguage, setQueryLanguage] = useState<'lucene' | 'kuery'>('kuery'); const { data: dynamicIndexPattern } = useFetcher(({ signal }) => { return callObservabilityApi({ @@ -43,7 +44,7 @@ export function AlertsSearchBar({ placeholder={i18n.translate('xpack.observability.alerts.searchBarPlaceholder', { defaultMessage: '"domain": "ecommerce" AND ("service.name": "ProductCatalogService" …)', })} - query={{ query: query ?? '', language: 'kuery' }} + query={{ query: query ?? '', language: queryLanguage }} timeHistory={timeHistory} dateRangeFrom={rangeFrom} dateRangeTo={rangeTo} @@ -55,6 +56,7 @@ export function AlertsSearchBar({ dateRange, query: typeof nextQuery?.query === 'string' ? nextQuery.query : '', }); + setQueryLanguage((nextQuery?.language || 'kuery') as 'kuery' | 'lucene'); }} /> ); diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_table.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_table.tsx index 0985597cc4b69..b0ff156fde377 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts_table.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts_table.tsx @@ -6,31 +6,22 @@ */ import { + CustomItemAction, EuiBasicTable, EuiBasicTableColumn, EuiBasicTableProps, - DefaultItemAction, - EuiTableSelectionType, + EuiButton, + EuiIconTip, EuiLink, - EuiBadge, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useState } from 'react'; import { asDuration } from '../../../common/utils/formatters'; import { TimestampTooltip } from '../../components/shared/timestamp_tooltip'; import { usePluginContext } from '../../hooks/use_plugin_context'; +import type { TopAlert } from './'; import { AlertsFlyout } from './alerts_flyout'; - -export interface TopAlert { - start: number; - duration: number; - reason: string; - link?: string; - severityLevel?: string; - active: boolean; - ruleName: string; - ruleCategory: string; -} +import { SeverityBadge } from './severity_badge'; type AlertsTableProps = Omit< EuiBasicTableProps, @@ -43,13 +34,18 @@ export function AlertsTable(props: AlertsTableProps) { const { core } = usePluginContext(); const { prepend } = core.http.basePath; - const actions: Array> = [ + const actions: Array> = [ { - name: 'Alert details', - description: 'Alert details', - onClick: (item) => { - setFlyoutAlert(item); - }, + render: (alert) => + alert.link ? ( + + {i18n.translate('xpack.observability.alertsTable.viewInAppButtonLabel', { + defaultMessage: 'View in app', + })} + + ) : ( + <> + ), isPrimary: true, }, ]; @@ -57,54 +53,76 @@ export function AlertsTable(props: AlertsTableProps) { const columns: Array> = [ { field: 'active', - name: 'Status', - width: '112px', - render: (_, { active }) => { - const style = { - width: '96px', - textAlign: 'center' as const, - }; + name: i18n.translate('xpack.observability.alertsTable.statusColumnDescription', { + defaultMessage: 'Status', + }), + align: 'center', + render: (_, alert) => { + const { active } = alert; return active ? ( - - {i18n.translate('xpack.observability.alertsTable.status.active', { + + color="danger" + type="alert" + /> ) : ( - - {i18n.translate('xpack.observability.alertsTable.status.recovered', { + + type="check" + /> ); }, }, { field: 'start', - name: 'Triggered', + name: i18n.translate('xpack.observability.alertsTable.triggeredColumnDescription', { + defaultMessage: 'Triggered', + }), render: (_, item) => { return ; }, }, { field: 'duration', - name: 'Duration', - render: (_, { duration, active }) => { - return active ? null : asDuration(duration, { extended: true }); + name: i18n.translate('xpack.observability.alertsTable.durationColumnDescription', { + defaultMessage: 'Duration', + }), + render: (_, alert) => { + const { active } = alert; + return active + ? null + : asDuration(alert['kibana.rac.alert.duration.us'], { extended: true }); + }, + }, + { + field: 'severity', + name: i18n.translate('xpack.observability.alertsTable.severityColumnDescription', { + defaultMessage: 'Severity', + }), + render: (_, alert) => { + return ; }, }, { field: 'reason', - name: 'Reason', + name: i18n.translate('xpack.observability.alertsTable.reasonColumnDescription', { + defaultMessage: 'Reason', + }), dataType: 'string', render: (_, item) => { - return item.link ? {item.reason} : item.reason; + return setFlyoutAlert(item)}>{item.reason}; }, }, { actions, - name: 'Actions', + name: i18n.translate('xpack.observability.alertsTable.actionsColumnDescription', { + defaultMessage: 'Actions', + }), }, ]; @@ -113,8 +131,6 @@ export function AlertsTable(props: AlertsTableProps) { {flyoutAlert && } {...props} - isSelectable={true} - selection={{} as EuiTableSelectionType} columns={columns} tableLayout="auto" pagination={{ pageIndex: 0, pageSize: 0, totalItemCount: 0 }} diff --git a/x-pack/plugins/observability/public/pages/alerts/example_data.ts b/x-pack/plugins/observability/public/pages/alerts/example_data.ts index 860c8d059f00d..dba6f1e9aaa2f 100644 --- a/x-pack/plugins/observability/public/pages/alerts/example_data.ts +++ b/x-pack/plugins/observability/public/pages/alerts/example_data.ts @@ -12,6 +12,7 @@ export const apmAlertResponseExample = [ 'rule.name': 'Error count threshold | opbeans-java (smith test)', 'kibana.rac.alert.duration.us': 180057000, 'kibana.rac.alert.status': 'open', + 'kibana.rac.alert.severity.level': 'warning', tags: ['apm', 'service.name:opbeans-java'], 'kibana.rac.alert.uuid': '0175ec0a-a3b1-4d41-b557-e21c2d024352', 'rule.uuid': '474920d0-93e9-11eb-ac86-0b455460de81', @@ -47,16 +48,6 @@ export const apmAlertResponseExample = [ }, ]; -export const flyoutItemExample = { - link: '/app/apm/services/opbeans-java?rangeFrom=now-15m&rangeTo=now', - reason: 'Error count for opbeans-java was above the threshold', - active: true, - start: 1618235449493, - duration: 180057000, - ruleCategory: 'Error count threshold', - ruleName: 'Error count threshold | opbeans-java (smith test)', -}; - export const dynamicIndexPattern = { fields: [ { diff --git a/x-pack/plugins/observability/public/pages/alerts/index.tsx b/x-pack/plugins/observability/public/pages/alerts/index.tsx index aa5fb2c32ea11..76e5d62369029 100644 --- a/x-pack/plugins/observability/public/pages/alerts/index.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/index.tsx @@ -18,6 +18,7 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { useHistory } from 'react-router-dom'; import { format, parse } from 'url'; +import type { ObservabilityAPIReturnType } from '../../services/call_observability_api/types'; import { ExperimentalBadge } from '../../components/shared/experimental_badge'; import { useFetcher } from '../../hooks/use_fetcher'; import { usePluginContext } from '../../hooks/use_plugin_context'; @@ -28,6 +29,15 @@ import { asDuration, asPercent } from '../../../common/utils/formatters'; import { AlertsSearchBar } from './alerts_search_bar'; import { AlertsTable } from './alerts_table'; +export type TopAlertResponse = ObservabilityAPIReturnType<'GET /api/observability/rules/alerts/top'>[number]; + +export interface TopAlert extends TopAlertResponse { + start: number; + reason: string; + link?: string; + active: boolean; +} + interface AlertsPageProps { routeParams: RouteParams<'/alerts'>; } @@ -75,6 +85,7 @@ export function AlertsPage({ routeParams }: AlertsPageProps) { const parsedLink = formatted.link ? parse(formatted.link, true) : undefined; return { + ...alert, ...formatted, link: parsedLink ? format({ @@ -87,11 +98,7 @@ export function AlertsPage({ routeParams }: AlertsPageProps) { }) : undefined, active: alert['event.action'] !== 'close', - severityLevel: alert['kibana.rac.alert.severity.level'], start: new Date(alert['kibana.rac.alert.start']).getTime(), - duration: alert['kibana.rac.alert.duration.us'], - ruleCategory: alert['rule.category'], - ruleName: alert['rule.name'], }; }); }); diff --git a/x-pack/plugins/observability/public/pages/alerts/severity_badge.stories.tsx b/x-pack/plugins/observability/public/pages/alerts/severity_badge.stories.tsx new file mode 100644 index 0000000000000..3f7357fe607e6 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/alerts/severity_badge.stories.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ComponentProps } from 'react'; +import { SeverityBadge } from './severity_badge'; + +type Args = ComponentProps; + +export default { + title: 'app/Alerts/SeverityBadge', + component: SeverityBadge, +}; + +export function Example({ severityLevel }: Args) { + return ; +} +Example.args = { severityLevel: 'critical' } as Args; diff --git a/x-pack/plugins/observability/public/pages/alerts/severity_badge.tsx b/x-pack/plugins/observability/public/pages/alerts/severity_badge.tsx new file mode 100644 index 0000000000000..931b9396f912a --- /dev/null +++ b/x-pack/plugins/observability/public/pages/alerts/severity_badge.tsx @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiBadge } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; + +export interface SeverityBadgeProps { + severityLevel?: string; +} + +const colorMap: { [key: string]: string } = { + critical: 'danger', + warning: 'warning', +}; + +export function SeverityBadge({ severityLevel }: SeverityBadgeProps) { + return ( + + {severityLevel ?? + i18n.translate('xpack.observability.severityBadge.unknownDescription', { + defaultMessage: 'unknown', + })} + + ); +} diff --git a/x-pack/plugins/observability/public/rules/observability_rule_registry_mock.ts b/x-pack/plugins/observability/public/rules/observability_rule_registry_mock.ts index 939e3a3608f8b..389b581b5fb60 100644 --- a/x-pack/plugins/observability/public/rules/observability_rule_registry_mock.ts +++ b/x-pack/plugins/observability/public/rules/observability_rule_registry_mock.ts @@ -9,7 +9,7 @@ import { ObservabilityRuleRegistry } from '../plugin'; const createRuleRegistryMock = () => ({ registerType: () => {}, - getTypeByRuleId: () => {}, + getTypeByRuleId: () => ({ format: () => ({ link: '/test/example' }) }), create: () => createRuleRegistryMock(), }); From c3decc011064071cc76e04c6160509addb614b97 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 19 Apr 2021 16:35:32 -0400 Subject: [PATCH 54/82] [Fleet] Fleet Server migration modal (#97413) --- .../fleet/common/types/models/settings.ts | 1 + .../applications/fleet/hooks/use_link.ts | 4 +- .../components/fleet_server_upgrade_modal.tsx | 167 ++++++++++++++++++ .../fleet/sections/agents/index.tsx | 28 ++- .../fleet/public/assets/announcement.jpg | Bin 0 -> 10645 bytes .../fleet/server/saved_objects/index.ts | 1 + .../fleet_server/saved_object_migrations.ts | 12 ++ .../fleet/server/types/rest_spec/settings.ts | 1 + 8 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_upgrade_modal.tsx create mode 100644 x-pack/plugins/fleet/public/assets/announcement.jpg diff --git a/x-pack/plugins/fleet/common/types/models/settings.ts b/x-pack/plugins/fleet/common/types/models/settings.ts index 2d7e90a3424d7..15d7492868797 100644 --- a/x-pack/plugins/fleet/common/types/models/settings.ts +++ b/x-pack/plugins/fleet/common/types/models/settings.ts @@ -9,6 +9,7 @@ import type { SavedObjectAttributes } from 'src/core/public'; export interface BaseSettings { has_seen_add_data_notice?: boolean; + has_seen_fleet_migration_notice?: boolean; fleet_server_hosts: string[]; } diff --git a/x-pack/plugins/fleet/public/applications/fleet/hooks/use_link.ts b/x-pack/plugins/fleet/public/applications/fleet/hooks/use_link.ts index 440cd693d7af2..5c31f6fc4158e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/hooks/use_link.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/hooks/use_link.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { BASE_PATH, pagePathGetters } from '../constants'; +import { BASE_PATH, pagePathGetters, PLUGIN_ID } from '../constants'; import type { StaticPage, DynamicPage, DynamicPagePathValues } from '../constants'; import { useStartServices } from './'; @@ -18,6 +18,8 @@ export const useLink = () => { const core = useStartServices(); return { getPath, + getAssetsPath: (path: string) => + core.http.basePath.prepend(`/plugins/${PLUGIN_ID}/assets/${path}`), getHref: (page: StaticPage | DynamicPage, values?: DynamicPagePathValues) => { const path = getPath(page, values); return core.http.basePath.prepend(`${BASE_PATH}#${path}`); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_upgrade_modal.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_upgrade_modal.tsx new file mode 100644 index 0000000000000..4d6ac864ee8b5 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/fleet_server_upgrade_modal.tsx @@ -0,0 +1,167 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useState } from 'react'; +import { + EuiButton, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiImage, + EuiLink, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiSpacer, + EuiText, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; + +import { sendPutSettings, useLink, useStartServices } from '../../../hooks'; + +interface Props { + onClose: () => void; +} + +export const FleetServerUpgradeModal: React.FunctionComponent = ({ onClose }) => { + const { getAssetsPath } = useLink(); + const { notifications, cloud } = useStartServices(); + + const isCloud = !!cloud?.cloudId; + + const [checked, setChecked] = useState(false); + const onChange = useCallback(async () => { + try { + setChecked(!checked); + await sendPutSettings({ + has_seen_fleet_migration_notice: !checked, + }); + } catch (error) { + notifications.toasts.addError(error, { + title: i18n.translate('xpack.fleet.fleetServerUpgradeModal.failedUpdateTitle', { + defaultMessage: `Error saving settings`, + }), + }); + } + }, [checked, setChecked, notifications]); + + return ( + + + + + + + + + + + {isCloud ? ( + + + + ), + link: ( + + + + ), + }} + /> + ) : ( + + + + ), + link: ( + + + + ), + }} + /> + )} + + + + + + + ), + }} + /> + + + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx index b8c9ead6773f5..56eb4072c3847 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx @@ -5,13 +5,19 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { HashRouter as Router, Route, Switch, Redirect } from 'react-router-dom'; import { PAGE_ROUTING_PATHS } from '../../constants'; import { Loading, Error } from '../../components'; -import { useConfig, useFleetStatus, useBreadcrumbs, useCapabilities } from '../../hooks'; +import { + useConfig, + useFleetStatus, + useBreadcrumbs, + useCapabilities, + useGetSettings, +} from '../../hooks'; import { WithoutHeaderLayout } from '../../layouts'; import { AgentListPage } from './agent_list_page'; @@ -20,6 +26,7 @@ import { AgentDetailsPage } from './agent_details_page'; import { NoAccessPage } from './error_pages/no_access'; import { EnrollmentTokenListPage } from './enrollment_token_list_page'; import { ListLayout } from './components/list_layout'; +import { FleetServerUpgradeModal } from './components/fleet_server_upgrade_modal'; const REFRESH_INTERVAL_MS = 30000; @@ -31,6 +38,20 @@ export const FleetApp: React.FunctionComponent = () => { const fleetStatus = useFleetStatus(); + const settings = useGetSettings(); + + const [fleetServerModalVisible, setFleetServerModalVisible] = useState(false); + const onCloseFleetServerModal = useCallback(() => { + setFleetServerModalVisible(false); + }, [setFleetServerModalVisible]); + + useEffect(() => { + // if it's undefined do not show the modal + if (settings.data && settings.data?.item.has_seen_fleet_migration_notice === false) { + setFleetServerModalVisible(true); + } + }, [settings.data]); + useEffect(() => { if ( !agents.enabled || @@ -99,6 +120,9 @@ export const FleetApp: React.FunctionComponent = () => { + {fleetServerModalVisible && ( + + )} {hasOnlyFleetServerMissingRequirement ? ( ) : ( diff --git a/x-pack/plugins/fleet/public/assets/announcement.jpg b/x-pack/plugins/fleet/public/assets/announcement.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65191f1da6c539f92a66800a64fc76cc970a8068 GIT binary patch literal 10645 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index 27725bfc637ee..f55de4b691999 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -61,6 +61,7 @@ const getSavedObjectTypes = ( properties: { fleet_server_hosts: { type: 'keyword' }, has_seen_add_data_notice: { type: 'boolean', index: false }, + has_seen_fleet_migration_notice: { type: 'boolean', index: false }, }, }, migrations: { diff --git a/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts b/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts index 7ccee39aa815c..e9a73783e32fc 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts @@ -25,6 +25,7 @@ import { listEnrollmentApiKeys, getEnrollmentAPIKey } from '../api_keys/enrollme import { appContextService } from '../app_context'; import { agentPolicyService } from '../agent_policy'; import { invalidateAPIKeys } from '../api_keys'; +import { settingsService } from '..'; export async function runFleetServerMigration() { await Promise.all([migrateEnrollmentApiKeys(), migrateAgentPolicies(), migrateAgents()]); @@ -54,6 +55,9 @@ async function migrateAgents() { const soClient = getInternalUserSOClient(); const logger = appContextService.getLogger(); let hasMore = true; + + let hasAgents = false; + while (hasMore) { const res = await soClient.find({ type: AGENT_SAVED_OBJECT_TYPE, @@ -64,6 +68,7 @@ async function migrateAgents() { if (res.total === 0) { hasMore = false; } + hasAgents = true; for (const so of res.saved_objects) { try { const { @@ -115,6 +120,13 @@ async function migrateAgents() { } } } + + // Update settings to show migration modal + if (hasAgents) { + await settingsService.saveSettings(soClient, { + has_seen_fleet_migration_notice: false, + }); + } } async function migrateEnrollmentApiKeys() { diff --git a/x-pack/plugins/fleet/server/types/rest_spec/settings.ts b/x-pack/plugins/fleet/server/types/rest_spec/settings.ts index 551cc37551da2..fbadac2353b02 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/settings.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/settings.ts @@ -23,6 +23,7 @@ export const PutSettingsRequestSchema = { }) ), has_seen_add_data_notice: schema.maybe(schema.boolean()), + has_seen_fleet_migration_notice: schema.maybe(schema.boolean()), additional_yaml_config: schema.maybe(schema.string()), // Deprecated not used kibana_urls: schema.maybe( From b5effc20a49871d92a99ef0ab132d0fe9c8d0be6 Mon Sep 17 00:00:00 2001 From: Bhavya RM Date: Mon, 19 Apr 2021 16:59:51 -0400 Subject: [PATCH 55/82] unskipping login and spaces a11y tests (#97190) --- x-pack/test/accessibility/apps/login_page.ts | 3 +-- x-pack/test/accessibility/apps/spaces.ts | 11 ++++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/x-pack/test/accessibility/apps/login_page.ts b/x-pack/test/accessibility/apps/login_page.ts index f46a684194810..02d817612671c 100644 --- a/x-pack/test/accessibility/apps/login_page.ts +++ b/x-pack/test/accessibility/apps/login_page.ts @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const PageObjects = getPageObjects(['common', 'security']); - // FLAKY: https://github.com/elastic/kibana/issues/96372 - describe.skip('Security', () => { + describe('Security', () => { describe('Login Page', () => { before(async () => { await esArchiver.load('empty_kibana'); diff --git a/x-pack/test/accessibility/apps/spaces.ts b/x-pack/test/accessibility/apps/spaces.ts index a2f0e835c0b3e..a08ae474497e5 100644 --- a/x-pack/test/accessibility/apps/spaces.ts +++ b/x-pack/test/accessibility/apps/spaces.ts @@ -18,17 +18,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const toasts = getService('toasts'); - // flaky - // https://github.com/elastic/kibana/issues/77933 - // https://github.com/elastic/kibana/issues/96625 - describe.skip('Kibana spaces page meets a11y validations', () => { + describe('Kibana spaces page meets a11y validations', () => { before(async () => { await esArchiver.load('empty_kibana'); await PageObjects.common.navigateToApp('home'); }); - it.skip('a11y test for manage spaces menu from top nav on Kibana home', async () => { - await PageObjects.spaceSelector.openSpacesNav(); + it('a11y test for manage spaces menu from top nav on Kibana home', async () => { + await testSubjects.click('space-avatar-default'); await retry.waitFor( 'Manage spaces option visible', async () => await testSubjects.exists('manageSpaces') @@ -36,7 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await a11y.testAppSnapshot(); }); - it.skip('a11y test for manage spaces page', async () => { + it('a11y test for manage spaces page', async () => { await PageObjects.spaceSelector.clickManageSpaces(); await PageObjects.header.waitUntilLoadingHasFinished(); await toasts.dismissAllToasts(); From a254f0f810f87df14000f786513fe20dad76d6f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ece=20=C3=96zalp?= Date: Mon, 19 Apr 2021 17:03:56 -0400 Subject: [PATCH 56/82] [CTI] Adds Threat Intel Tab to Alert Summary Flyout (#97185) --- .../security_solution/common/cti/constants.ts | 14 +- .../event_details/alert_summary_view.tsx | 10 +- .../empty_threat_details_view.test.tsx | 52 ++++ .../empty_threat_details_view.tsx | 50 ++++ .../event_details/event_details.test.tsx | 33 +-- .../event_details/event_details.tsx | 250 +++++++++--------- .../components/event_details/helpers.tsx | 2 +- .../components/event_details/summary_view.tsx | 45 +++- .../threat_details_view.test.tsx | 86 +++++- .../event_details/threat_details_view.tsx | 111 +++++--- .../threat_summary_view.test.tsx | 5 +- .../event_details/threat_summary_view.tsx | 83 +++--- .../components/event_details/translations.ts | 27 +- .../event_details/expandable_event.tsx | 16 +- 14 files changed, 503 insertions(+), 281 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.tsx diff --git a/x-pack/plugins/security_solution/common/cti/constants.ts b/x-pack/plugins/security_solution/common/cti/constants.ts index cdd4a564f3d73..3423f17e3f683 100644 --- a/x-pack/plugins/security_solution/common/cti/constants.ts +++ b/x-pack/plugins/security_solution/common/cti/constants.ts @@ -19,10 +19,14 @@ export const INDICATOR_MATCHED_TYPE = `${INDICATOR_DESTINATION_PATH}.${MATCHED_T export const EVENT_DATASET = 'event.dataset'; export const EVENT_REFERENCE = 'event.reference'; export const PROVIDER = 'provider'; +export const FIRSTSEEN = 'first_seen'; export const INDICATOR_DATASET = `${INDICATOR_DESTINATION_PATH}.${EVENT_DATASET}`; -export const INDICATOR_REFERENCE = `${INDICATOR_DESTINATION_PATH}.${EVENT_REFERENCE}`; +export const INDICATOR_EVENT_URL = `${INDICATOR_DESTINATION_PATH}.event.url`; +export const INDICATOR_FIRSTSEEN = `${INDICATOR_DESTINATION_PATH}.${FIRSTSEEN}`; +export const INDICATOR_LASTSEEN = `${INDICATOR_DESTINATION_PATH}.last_seen`; export const INDICATOR_PROVIDER = `${INDICATOR_DESTINATION_PATH}.${PROVIDER}`; +export const INDICATOR_REFERENCE = `${INDICATOR_DESTINATION_PATH}.${EVENT_REFERENCE}`; export const CTI_ROW_RENDERER_FIELDS = [ INDICATOR_MATCHED_ATOMIC, @@ -32,3 +36,11 @@ export const CTI_ROW_RENDERER_FIELDS = [ INDICATOR_REFERENCE, INDICATOR_PROVIDER, ]; + +export const SORTED_THREAT_SUMMARY_FIELDS = [ + INDICATOR_MATCHED_FIELD, + INDICATOR_MATCHED_TYPE, + INDICATOR_PROVIDER, + INDICATOR_FIRSTSEEN, + INDICATOR_LASTSEEN, +]; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx index 091049b967f02..5578264152c39 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx @@ -10,10 +10,13 @@ import { EuiDescriptionList, EuiDescriptionListDescription, EuiDescriptionListTitle, + EuiSpacer, } from '@elastic/eui'; import { get, getOr } from 'lodash/fp'; import React, { useMemo } from 'react'; import styled from 'styled-components'; + +import * as i18n from './translations'; import { FormattedFieldValue } from '../../../timelines/components/timeline/body/renderers/formatted_field'; import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { BrowserFields } from '../../../../common/search_strategy/index_fields'; @@ -33,7 +36,6 @@ import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../../../networ import { SummaryView } from './summary_view'; import { AlertSummaryRow, getSummaryColumns, SummaryRow } from './helpers'; import { useRuleAsync } from '../../../detections/containers/detection_engine/rules/use_rule_async'; -import * as i18n from './translations'; import { LineClamp } from '../line_clamp'; const StyledEuiDescriptionList = styled(EuiDescriptionList)` @@ -166,7 +168,8 @@ const AlertSummaryViewComponent: React.FC<{ data: TimelineEventsDetailsItem[]; eventId: string; timelineId: string; -}> = ({ browserFields, data, eventId, timelineId }) => { + title?: string; +}> = ({ browserFields, data, eventId, timelineId, title }) => { const summaryRows = useMemo(() => getSummaryRows({ browserFields, data, eventId, timelineId }), [ browserFields, data, @@ -184,7 +187,8 @@ const AlertSummaryViewComponent: React.FC<{ return ( <> - + + {maybeRule?.note && ( {i18n.INVESTIGATION_GUIDE} diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.test.tsx new file mode 100644 index 0000000000000..b3e70fd17c0e1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.test.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; + +import { useMountAppended } from '../../utils/use_mount_appended'; +import { getMockTheme } from '../../lib/kibana/kibana_react.mock'; +import { EmptyThreatDetailsView } from './empty_threat_details_view'; + +jest.mock('../../lib/kibana'); + +describe('EmptyThreatDetailsView', () => { + const mount = useMountAppended(); + const mockTheme = getMockTheme({ + eui: { + euiBreakpoints: { + l: '1200px', + }, + paddingSizes: { + m: '8px', + xl: '32px', + }, + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('renders correct items', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find('[data-test-subj="empty-threat-details-view"]').exists()).toEqual(true); + }); + + test('renders link to docs', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find('a').exists()).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.tsx new file mode 100644 index 0000000000000..c78df92dceb3c --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/empty_threat_details_view.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLink, EuiSpacer, EuiTitle } from '@elastic/eui'; +import React from 'react'; +import styled from 'styled-components'; +import * as i18n from './translations'; +import { useKibana } from '../../lib/kibana'; + +const EmptyThreatDetailsViewContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; +`; + +const Span = styled.span` + color: ${({ theme }) => theme.eui.euiColorDarkShade}; + line-height: 1.8em; + text-align: center; + padding: ${({ theme }) => `${theme.eui.paddingSizes.m} ${theme.eui.paddingSizes.xl}`}; +`; + +const EmptyThreatDetailsViewComponent: React.FC<{}> = () => { + const threatIntelDocsUrl = `${ + useKibana().services.docLinks.links.filebeat.base + }/filebeat-module-threatintel.html`; + + return ( + + + +

{i18n.NO_ENRICHMENT_FOUND}

+
+ + {i18n.IF_CTI_NOT_ENABLED} + + {i18n.CHECK_DOCS} + + +
+ ); +}; + +EmptyThreatDetailsViewComponent.displayName = 'EmptyThreatDetailsView'; + +export const EmptyThreatDetailsView = React.memo(EmptyThreatDetailsViewComponent); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.test.tsx index e799df0fdd10d..0c7515fe75d86 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.test.tsx @@ -13,7 +13,7 @@ import '../../mock/match_media'; import '../../mock/react_beautiful_dnd'; import { mockDetailItemData, mockDetailItemDataId, TestProviders } from '../../mock'; -import { EventDetails, EventsViewType, EventView, ThreatView } from './event_details'; +import { EventDetails, EventsViewType } from './event_details'; import { mockBrowserFields } from '../../containers/source/mock'; import { useMountAppended } from '../../utils/use_mount_appended'; import { mockAlertDetailsData } from './__mocks__'; @@ -32,8 +32,7 @@ describe('EventDetails', () => { onThreatViewSelected: jest.fn(), timelineTabType: TimelineTabs.query, timelineId: 'test', - eventView: EventsViewType.summaryView as EventView, - threatView: EventsViewType.threatSummaryView as ThreatView, + eventView: EventsViewType.summaryView, }; const alertsProps = { @@ -78,13 +77,14 @@ describe('EventDetails', () => { }); describe('alerts tabs', () => { - ['Summary', 'Table', 'JSON View'].forEach((tab) => { + ['Summary', 'Threat Intel', 'Table', 'JSON View'].forEach((tab) => { test(`it renders the ${tab} tab`, () => { + const expectedCopy = tab === 'Threat Intel' ? `${tab} (1)` : tab; expect( alertsWrapper .find('[data-test-subj="eventDetails"]') .find('[role="tablist"]') - .containsMatchingElement({tab}) + .containsMatchingElement({expectedCopy}) ).toBeTruthy(); }); }); @@ -99,27 +99,4 @@ describe('EventDetails', () => { ).toEqual('Summary'); }); }); - - describe('threat tabs', () => { - ['Threat Summary', 'Threat Details'].forEach((tab) => { - test(`it renders the ${tab} tab`, () => { - expect( - alertsWrapper - .find('[data-test-subj="threatDetails"]') - .find('[role="tablist"]') - .containsMatchingElement({tab}) - ).toBeTruthy(); - }); - }); - - test('the Summary tab is selected by default', () => { - expect( - alertsWrapper - .find('[data-test-subj="threatDetails"]') - .find('.euiTab-isSelected') - .first() - .text() - ).toEqual('Threat Summary'); - }); - }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx index 0e4cf7f4ae2fe..91ebec72d3845 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx @@ -6,31 +6,37 @@ */ import { EuiTabbedContent, EuiTabbedContentTab, EuiSpacer } from '@elastic/eui'; -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; -import { TimelineEventsDetailsItem } from '../../../../common/search_strategy/timeline'; import { EventFieldsBrowser } from './event_fields_browser'; import { JsonView } from './json_view'; -import * as i18n from './translations'; -import { AlertSummaryView } from './alert_summary_view'; import { ThreatSummaryView } from './threat_summary_view'; import { ThreatDetailsView } from './threat_details_view'; +import * as i18n from './translations'; +import { AlertSummaryView } from './alert_summary_view'; +import { BrowserFields } from '../../containers/source'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy/timeline'; import { TimelineTabs } from '../../../../common/types/timeline'; import { INDICATOR_DESTINATION_PATH } from '../../../../common/constants'; +import { getDataFromSourceHits } from '../../../../common/utils/field_formatters'; + +interface EventViewTab { + id: EventViewId; + name: string; + content: JSX.Element; +} -export type EventView = +export type EventViewId = | EventsViewType.tableView | EventsViewType.jsonView - | EventsViewType.summaryView; -export type ThreatView = EventsViewType.threatSummaryView | EventsViewType.threatDetailsView; + | EventsViewType.summaryView + | EventsViewType.threatIntelView; export enum EventsViewType { tableView = 'table-view', jsonView = 'json-view', summaryView = 'summary-view', - threatSummaryView = 'threat-summary-view', - threatDetailsView = 'threat-details-view', + threatIntelView = 'threat-intel-view', } interface Props { @@ -38,10 +44,6 @@ interface Props { data: TimelineEventsDetailsItem[]; id: string; isAlert: boolean; - eventView: EventView; - threatView: ThreatView; - onEventViewSelected: (selected: EventView) => void; - onThreatViewSelected: (selected: ThreatView) => void; timelineTabType: TimelineTabs | 'flyout'; timelineId: string; } @@ -56,7 +58,8 @@ const StyledEuiTabbedContent = styled(EuiTabbedContent)` display: flex; flex: 1; flex-direction: column; - overflow: scroll; + overflow: hidden; + overflow-y: auto; ::-webkit-scrollbar { -webkit-appearance: none; width: 7px; @@ -77,132 +80,125 @@ const TabContentWrapper = styled.div` const EventDetailsComponent: React.FC = ({ browserFields, data, - eventView, id, isAlert, - onEventViewSelected, - onThreatViewSelected, - threatView, timelineId, timelineTabType, }) => { - const handleEventTabClick = useCallback((e) => onEventViewSelected(e.id), [onEventViewSelected]); - const handleThreatTabClick = useCallback((e) => onThreatViewSelected(e.id), [ - onThreatViewSelected, - ]); - - const alerts = useMemo( - () => [ - { - id: EventsViewType.summaryView, - name: i18n.SUMMARY, - content: ( - <> - - - - ), - }, - ], - [data, id, browserFields, timelineId] - ); - const tabs: EuiTabbedContentTab[] = useMemo( - () => [ - ...(isAlert ? alerts : []), - { - id: EventsViewType.tableView, - name: i18n.TABLE, - content: ( - <> - - - - ), - }, - { - id: EventsViewType.jsonView, - 'data-test-subj': 'jsonViewTab', - name: i18n.JSON_VIEW, - content: ( - <> - - - - - - ), - }, - ], - [alerts, browserFields, data, id, isAlert, timelineId, timelineTabType] + const [selectedTabId, setSelectedTabId] = useState(EventsViewType.summaryView); + const handleTabClick = useCallback( + (tab: EuiTabbedContentTab) => setSelectedTabId(tab.id as EventViewId), + [setSelectedTabId] ); - const selectedEventTab = useMemo(() => tabs.find((t) => t.id === eventView) ?? tabs[0], [ - tabs, - eventView, - ]); + const threatData = useMemo(() => { + if (isAlert && data) { + const threatIndicator = data.find( + ({ field, originalValue }) => field === INDICATOR_DESTINATION_PATH && originalValue + ); + if (!threatIndicator) return []; + const { originalValue } = threatIndicator; + const values = Array.isArray(originalValue) ? originalValue : [originalValue]; + return values.map((value) => getDataFromSourceHits(JSON.parse(value))); + } + return []; + }, [data, isAlert]); + + const threatCount = useMemo(() => threatData.length, [threatData.length]); + + const summaryTab = useMemo( + () => + isAlert + ? { + id: EventsViewType.summaryView, + name: i18n.SUMMARY, + content: ( + <> + + {threatCount > 0 && } + + ), + } + : undefined, + [browserFields, data, id, isAlert, timelineId, threatCount] + ); - const isThreatPresent: boolean = useMemo( + const threatIntelTab = useMemo( () => - selectedEventTab.id === tabs[0].id && - isAlert && - data.some((item) => item.field === INDICATOR_DESTINATION_PATH), - [tabs, selectedEventTab, isAlert, data] + isAlert + ? { + id: EventsViewType.threatIntelView, + name: `${i18n.THREAT_INTEL} (${threatCount})`, + content: , + } + : undefined, + [isAlert, threatCount, threatData] ); - const threatTabs: EuiTabbedContentTab[] = useMemo(() => { - return isAlert && isThreatPresent - ? [ - { - id: EventsViewType.threatSummaryView, - name: i18n.THREAT_SUMMARY, - content: , - }, - { - id: EventsViewType.threatDetailsView, - name: i18n.THREAT_DETAILS, - content: , - }, - ] - : []; - }, [data, id, isAlert, timelineId, isThreatPresent]); - - const selectedThreatTab = useMemo( - () => threatTabs.find((t) => t.id === threatView) ?? threatTabs[0], - [threatTabs, threatView] + const tableTab = useMemo( + () => ({ + id: EventsViewType.tableView, + name: i18n.TABLE, + content: ( + <> + + + + ), + }), + [browserFields, data, id, timelineId, timelineTabType] ); + const jsonTab = useMemo( + () => ({ + id: EventsViewType.jsonView, + 'data-test-subj': 'jsonViewTab', + name: i18n.JSON_VIEW, + content: ( + <> + + + + + + ), + }), + [data] + ); + + const tabs = useMemo(() => { + return [summaryTab, threatIntelTab, tableTab, jsonTab].filter( + (tab: EventViewTab | undefined): tab is EventViewTab => !!tab + ); + }, [summaryTab, threatIntelTab, tableTab, jsonTab]); + + const selectedTab = useMemo(() => tabs.find((tab) => tab.id === selectedTabId), [ + tabs, + selectedTabId, + ]); + return ( - <> - - {isThreatPresent && ( - - )} - + ); }; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx index 67e67584849cc..1642dcef29227 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx @@ -225,7 +225,7 @@ export const getSummaryColumns = ( field: 'title', truncateText: false, render: getTitle, - width: '120px', + width: '160px', name: '', }, { diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.tsx index 3b2c55e9a6b67..1dda40ae4b19d 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiInMemoryTable, EuiBasicTableColumn } from '@elastic/eui'; +import { EuiInMemoryTable, EuiBasicTableColumn, EuiTitle, EuiHorizontalRule } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; @@ -27,18 +27,47 @@ const StyledEuiInMemoryTable = styled(EuiInMemoryTable as any)` } `; +const StyledEuiTitle = styled(EuiTitle)` + color: ${({ theme }) => theme.eui.euiColorDarkShade}; + text-transform: lowercase; + padding-top: ${({ theme }) => theme.eui.paddingSizes.s}; + h2 { + min-width: 120px; + } + hr { + max-width: 75%; + } +`; + +const FlexDiv = styled.div` + display: flex; + align-items: center; + justify-content: flex-start; +`; + export const SummaryViewComponent: React.FC<{ + title?: string; summaryColumns: Array>; summaryRows: SummaryRow[]; dataTestSubj?: string; -}> = ({ summaryColumns, summaryRows, dataTestSubj = 'summary-view' }) => { +}> = ({ summaryColumns, summaryRows, dataTestSubj = 'summary-view', title }) => { return ( - + <> + {title && ( + + +

{title}

+ +
+
+ )} + + ); }; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.test.tsx index 81bffe9b66638..4b2f56a205042 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.test.tsx @@ -8,8 +8,6 @@ import React from 'react'; import { ThreatDetailsView } from './threat_details_view'; -import { mockAlertDetailsData } from './__mocks__'; -import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { TestProviders } from '../../mock'; import { useMountAppended } from '../../utils/use_mount_appended'; @@ -20,11 +18,56 @@ jest.mock('../../../detections/containers/detection_engine/rules/use_rule_async' }; }); -const props = { - data: mockAlertDetailsData as TimelineEventsDetailsItem[], - eventId: '5d1d53da502f56aacc14c3cb5c669363d102b31f99822e5d369d4804ed370a31', - timelineId: 'detections-page', -}; +const mostRecentDate = '2021-04-25T18:17:00.000Z'; + +const threatData = [ + [ + { + category: 'matched', + field: 'matched.field', + isObjectArray: false, + originalValue: ['test_field_2'], + values: ['test_field_2'], + }, + { + category: 'first_seen', + field: 'first_seen', + isObjectArray: false, + originalValue: ['2019-04-25T18:17:00.000Z'], + values: ['2019-04-25T18:17:00.000Z'], + }, + { + category: 'event', + field: 'event.reference', + isObjectArray: false, + originalValue: ['https://test.com/'], + values: ['https://test.com/'], + }, + { + category: 'event', + field: 'event.url', + isObjectArray: false, + originalValue: ['https://test2.com/'], + values: ['https://test2.com/'], + }, + ], + [ + { + category: 'first_seen', + field: 'first_seen', + isObjectArray: false, + originalValue: [mostRecentDate], + values: [mostRecentDate], + }, + { + category: 'matched', + field: 'matched.field', + isObjectArray: false, + originalValue: ['test_field'], + values: ['test_field'], + }, + ], +]; describe('ThreatDetailsView', () => { const mount = useMountAppended(); @@ -36,9 +79,36 @@ describe('ThreatDetailsView', () => { test('render correct items', () => { const wrapper = mount( - + ); expect(wrapper.find('[data-test-subj="threat-details-view-0"]').exists()).toEqual(true); }); + + test('renders empty view if there are no items', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find('[data-test-subj="empty-threat-details-view"]').exists()).toEqual(true); + }); + + test('renders link for event.url and event.reference', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find('a').length).toEqual(2); + }); + + test('orders items by first_seen', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find('.euiToolTipAnchor span').at(0).text()).toEqual(mostRecentDate); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.tsx index 0889986237442..0f577200b7b47 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/threat_details_view.tsx @@ -10,51 +10,50 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, + EuiSpacer, EuiToolTip, + EuiLink, } from '@elastic/eui'; -import React, { useMemo } from 'react'; +import React from 'react'; -import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; +import { isEmpty } from 'fp-ts/Array'; import { SummaryView } from './summary_view'; import { getSummaryColumns, SummaryRow, ThreatDetailsRow } from './helpers'; -import { getDataFromSourceHits } from '../../../../common/utils/field_formatters'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { INDICATOR_DESTINATION_PATH } from '../../../../common/constants'; +import { + FIRSTSEEN, + INDICATOR_EVENT_URL, + INDICATOR_REFERENCE, +} from '../../../../common/cti/constants'; +import { EmptyThreatDetailsView } from './empty_threat_details_view'; const ThreatDetailsDescription: React.FC = ({ fieldName, value, -}) => ( - - - {fieldName} - -
- } - > +}) => { + const tooltipChild = [INDICATOR_EVENT_URL, INDICATOR_REFERENCE].some( + (field) => field === fieldName + ) ? ( + + {value} + + ) : ( {value} - -); - -const getSummaryRowsArray = ({ - data, -}: { - data: TimelineEventsDetailsItem[]; -}): ThreatDetailsRow[][] => { - if (!data) return [[]]; - const threatInfo = data.find( - ({ field, originalValue }) => field === INDICATOR_DESTINATION_PATH && originalValue ); - if (!threatInfo) return [[]]; - const { originalValue } = threatInfo; - const values = Array.isArray(originalValue) ? originalValue : [originalValue]; - return values.map((value) => - getDataFromSourceHits(JSON.parse(value)).map((threatInfoItem) => ({ - title: threatInfoItem.field.replace(`${INDICATOR_DESTINATION_PATH}.`, ''), - description: { fieldName: threatInfoItem.field, value: threatInfoItem.originalValue }, - })) + return ( + + + {fieldName} + +
+ } + > + {tooltipChild} + ); }; @@ -62,17 +61,51 @@ const summaryColumns: Array> = getSummaryColumns ThreatDetailsDescription ); +const getISOStringFromThreatDataItem = (threatDataItem: TimelineEventsDetailsItem[]) => { + const firstSeen = threatDataItem.find( + (item: TimelineEventsDetailsItem) => item.field === FIRSTSEEN + ); + if (firstSeen) { + const { originalValue } = firstSeen; + const firstSeenValue = Array.isArray(originalValue) ? originalValue[0] : originalValue; + if (!Number.isNaN(Date.parse(firstSeenValue))) { + return firstSeenValue; + } + } + return new Date(-1).toString(); +}; + +const getThreatDetailsRowsArray = (threatData: TimelineEventsDetailsItem[][]) => + threatData + .sort( + (a, b) => + Date.parse(getISOStringFromThreatDataItem(b)) - + Date.parse(getISOStringFromThreatDataItem(a)) + ) + .map((items) => + items.map(({ field, originalValue }) => ({ + title: field, + description: { + fieldName: `${INDICATOR_DESTINATION_PATH}.${field}`, + value: Array.isArray(originalValue) ? originalValue[0] : originalValue, + }, + })) + ); + const ThreatDetailsViewComponent: React.FC<{ - data: TimelineEventsDetailsItem[]; -}> = ({ data }) => { - const summaryRowsArray = useMemo(() => getSummaryRowsArray({ data }), [data]); - return ( + threatData: TimelineEventsDetailsItem[][]; +}> = ({ threatData }) => { + const threatDetailsRowsArray = getThreatDetailsRowsArray(threatData); + return isEmpty(threatDetailsRowsArray) || isEmpty(threatDetailsRowsArray[0]) ? ( + + ) : ( <> - {summaryRowsArray.map((summaryRows, index, arr) => { + {threatDetailsRowsArray.map((summaryRows, index, arr) => { const key = summaryRows.find((threat) => threat.title === 'matched.id')?.description .value[0]; return ( -
+ {agentPolicy.name}, + }} + /> +
+
+ {index === 0 && } { return { diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/threat_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/threat_summary_view.tsx index 96ae2071c449b..67b09e8e59699 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/threat_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/threat_summary_view.tsx @@ -5,16 +5,39 @@ * 2.0. */ -import { EuiBasicTableColumn } from '@elastic/eui'; -import React, { useMemo } from 'react'; +import { EuiBasicTableColumn, EuiSpacer } from '@elastic/eui'; +import React from 'react'; -import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; -import { FormattedFieldValue } from '../../../timelines/components/timeline/body/renderers/formatted_field'; -import { BrowserFields } from '../../../../common/search_strategy/index_fields'; +import * as i18n from './translations'; import { SummaryView } from './summary_view'; import { getSummaryColumns, SummaryRow, ThreatSummaryRow } from './helpers'; +import { FormattedFieldValue } from '../../../timelines/components/timeline/body/renderers/formatted_field'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy/timeline'; +import { SORTED_THREAT_SUMMARY_FIELDS } from '../../../../common/cti/constants'; import { INDICATOR_DESTINATION_PATH } from '../../../../common/constants'; +const getThreatSummaryRows = ( + data: TimelineEventsDetailsItem[], + timelineId: string, + eventId: string +) => + SORTED_THREAT_SUMMARY_FIELDS.map((threatSummaryField) => { + const item = data.find(({ field }) => field === threatSummaryField); + if (item) { + const { field, originalValue } = item; + return { + title: field.replace(`${INDICATOR_DESTINATION_PATH}.`, ''), + description: { + values: Array.isArray(originalValue) ? originalValue : [originalValue], + contextId: timelineId, + eventId, + fieldName: field, + }, + }; + } + return null; + }).filter((item: ThreatSummaryRow | null): item is ThreatSummaryRow => !!item); + const getDescription = ({ contextId, eventId, @@ -34,56 +57,22 @@ const getDescription = ({ ); -const getSummaryRows = ({ - data, - timelineId: contextId, - eventId, -}: { - data: TimelineEventsDetailsItem[]; - browserFields?: BrowserFields; - timelineId: string; - eventId: string; -}) => { - if (!data) return []; - return data.reduce((acc, { field, originalValue }) => { - if (field.startsWith(`${INDICATOR_DESTINATION_PATH}.`) && originalValue) { - return [ - ...acc, - { - title: field.replace(`${INDICATOR_DESTINATION_PATH}.`, ''), - description: { - values: Array.isArray(originalValue) ? originalValue : [originalValue], - contextId, - eventId, - fieldName: field, - }, - }, - ]; - } - return acc; - }, []); -}; - const summaryColumns: Array> = getSummaryColumns(getDescription); const ThreatSummaryViewComponent: React.FC<{ data: TimelineEventsDetailsItem[]; - eventId: string; timelineId: string; -}> = ({ data, eventId, timelineId }) => { - const summaryRows = useMemo(() => getSummaryRows({ data, eventId, timelineId }), [ - data, - eventId, - timelineId, - ]); - - return ( + eventId: string; +}> = ({ data, timelineId, eventId }) => ( + <> + - ); -}; + +); export const ThreatSummaryView = React.memo(ThreatSummaryViewComponent); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts b/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts index 73a2e0d57307c..1ff88d9c2018b 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts @@ -11,12 +11,35 @@ export const SUMMARY = i18n.translate('xpack.securitySolution.alertDetails.summa defaultMessage: 'Summary', }); +export const ALERT_SUMMARY = i18n.translate('xpack.securitySolution.alertDetails.alertSummary', { + defaultMessage: 'Alert Summary', +}); + +export const THREAT_INTEL = i18n.translate('xpack.securitySolution.alertDetails.threatIntel', { + defaultMessage: 'Threat Intel', +}); + export const THREAT_SUMMARY = i18n.translate('xpack.securitySolution.alertDetails.threatSummary', { defaultMessage: 'Threat Summary', }); -export const THREAT_DETAILS = i18n.translate('xpack.securitySolution.alertDetails.threatDetails', { - defaultMessage: 'Threat Details', +export const NO_ENRICHMENT_FOUND = i18n.translate( + 'xpack.securitySolution.alertDetails.noEnrichmentFound', + { + defaultMessage: 'No Threat Intel Enrichment Found', + } +); + +export const IF_CTI_NOT_ENABLED = i18n.translate( + 'xpack.securitySolution.alertDetails.ifCtiNotEnabled', + { + defaultMessage: + "If you haven't enabled any threat intelligence sources and want to learn more about this capability, ", + } +); + +export const CHECK_DOCS = i18n.translate('xpack.securitySolution.alertDetails.checkDocs', { + defaultMessage: 'please check out our documentation.', }); export const INVESTIGATION_GUIDE = i18n.translate( diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx index 86175c0e06ad2..d1d5bffc6bd0a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx @@ -18,17 +18,12 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; -import React, { useMemo, useState } from 'react'; +import React, { useMemo } from 'react'; import styled from 'styled-components'; import { TimelineTabs } from '../../../../../common/types/timeline'; import { BrowserFields } from '../../../../common/containers/source'; -import { - EventDetails, - EventsViewType, - EventView, - ThreatView, -} from '../../../../common/components/event_details/event_details'; +import { EventDetails } from '../../../../common/components/event_details/event_details'; import { TimelineEventsDetailsItem } from '../../../../../common/search_strategy/timeline'; import { LineClamp } from '../../../../common/components/line_clamp'; import * as i18n from './translations'; @@ -88,9 +83,6 @@ ExpandableEventTitle.displayName = 'ExpandableEventTitle'; export const ExpandableEvent = React.memo( ({ browserFields, event, timelineId, timelineTabType, isAlert, loading, detailsData }) => { - const [eventView, setEventView] = useState(EventsViewType.summaryView); - const [threatView, setThreatView] = useState(EventsViewType.threatSummaryView); - const message = useMemo(() => { if (detailsData) { const messageField = find({ category: 'base', field: 'message' }, detailsData) as @@ -133,12 +125,8 @@ export const ExpandableEvent = React.memo( data={detailsData!} id={event.eventId!} isAlert={isAlert} - onThreatViewSelected={setThreatView} - onEventViewSelected={setEventView} - threatView={threatView} timelineId={timelineId} timelineTabType={timelineTabType} - eventView={eventView} /> From f0070be7d6e5344eee1cff2c4e882ad6df34e6f8 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 19 Apr 2021 22:09:43 +0100 Subject: [PATCH 57/82] docs(NA): add requirements for windows development into the getting started developer guide (#97264) * docs(NA): add requirements for windows development into the getting started developer docs * chore(NA): change docs id for the new introduced section Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/developer/getting-started/index.asciidoc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/developer/getting-started/index.asciidoc b/docs/developer/getting-started/index.asciidoc index d5fe7ebf47038..bc191fa828b58 100644 --- a/docs/developer/getting-started/index.asciidoc +++ b/docs/developer/getting-started/index.asciidoc @@ -3,6 +3,18 @@ Get started building your own plugins, or contributing directly to the {kib} repo. +[discrete] +[[developing-on-windows]] +=== Developing on Windows + +In order to support Windows development we currently require you to use one of the following: + +- https://git-scm.com/download/win[Git bash] (other bash emulators like https://cmder.net/[Cmder] could work but we did not test them) +- https://docs.microsoft.com/en-us/windows/wsl/about[WSL] + +Before running the steps listed below, please make sure you have installed Git bash or WSL and that +you are running the mentioned commands through one of them. + [discrete] [[get-kibana-code]] === Get the code From 8db333147c8dcac9f81daef0d138a04ab49f29b3 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Mon, 19 Apr 2021 17:38:14 -0400 Subject: [PATCH 58/82] Don't show 'Upgrade available' for agents in hosted policies (#97517) ## Summary Close item 3 on https://github.com/elastic/kibana/issues/91906. Don't show icon & "upgrade available" for agents in hosted agent policies ### Local testing I'll try to come back and post the exact commands if anyone wants them, but my rough flow was 1. start ES in 7.13 2. checkout kibana 7.x branch and start 3. create agents in kibana 4. stop kibana & ES 5. start ES in 8.0.0-SNAPSHOT 6. switch to kibana `master` branch & start 7. Navigate to http://localhost:5601/app/fleet#/fleet/agents and observe agents with upgrade available 8. assign agent(s) to a hosted agent policy 9. Observe behavior shown in two screenshots ### Don't show "upgrade available" for hosted agents in list Screen Shot 2021-04-19 at 3 08 12 PM ### Don't show agent in list when "Upgrade available" filter is selected Screen Shot 2021-04-19 at 3 08 40 PM closes https://github.com/elastic/kibana/issues/91906 --- .../fleet/sections/agents/agent_list_page/index.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index b3c0cf93c88ef..88249f7f5d5ce 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -407,7 +407,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { {safeMetadata(version)} - {isAgentUpgradeable(agent, kibanaVersion) ? ( + {isAgentSelectable(agent) && isAgentUpgradeable(agent, kibanaVersion) ? ( @@ -593,7 +593,15 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { emptyPrompt ) } - items={totalAgents ? agents : []} + items={ + totalAgents + ? showUpgradeable + ? agents.filter( + (agent) => isAgentSelectable(agent) && isAgentUpgradeable(agent, kibanaVersion) + ) + : agents + : [] + } itemId="id" columns={columns} pagination={{ From 6885ad1fc01a188030ca0568fb7393c8a00a9dd0 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 19 Apr 2021 14:47:05 -0700 Subject: [PATCH 59/82] Pass force unenrollment option as new `revoke` param (#97516) --- x-pack/plugins/fleet/common/types/rest_spec/agent.ts | 2 ++ .../sections/agents/components/agent_unenroll_modal/index.tsx | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/common/types/rest_spec/agent.ts b/x-pack/plugins/fleet/common/types/rest_spec/agent.ts index 4616e92925b3a..47f9112d4ab59 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/agent.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/agent.ts @@ -108,6 +108,7 @@ export interface PostAgentUnenrollRequest { }; body: { force?: boolean; + revoke?: boolean; }; } @@ -118,6 +119,7 @@ export interface PostBulkAgentUnenrollRequest { body: { agents: string[] | string; force?: boolean; + revoke?: boolean; }; } diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx index 696acb49abef3..5507fd6395c6f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx @@ -40,11 +40,11 @@ export const AgentUnenrollAgentModal: React.FunctionComponent = ({ setIsSubmitting(true); const { error } = isSingleAgent ? await sendPostAgentUnenroll((agents[0] as Agent).id, { - force: forceUnenroll, + revoke: forceUnenroll, }) : await sendPostBulkAgentUnenroll({ agents: Array.isArray(agents) ? agents.map((agent) => agent.id) : agents, - force: forceUnenroll, + revoke: forceUnenroll, }); if (error) { throw error; From 41d55ef2e0af2e3ef4e50d75b4ce844b46b5a4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 19 Apr 2021 17:50:10 -0400 Subject: [PATCH 60/82] [APM] Comparisons: Change the legend dot color to the line instead of the area viz color (#97481) * changing legend color * fixing unit test --- .../app/service_overview/service_overview_throughput_chart.tsx | 2 +- .../shared/charts/transaction_error_rate_chart/index.tsx | 2 +- .../plugins/apm/public/selectors/latency_chart_selector.test.ts | 2 +- x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx index 4f6f41f862e19..ac364a21bae46 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx @@ -98,7 +98,7 @@ export function ServiceOverviewThroughputChart({ { data: data.previousPeriod, type: 'area', - color: theme.eui.euiColorLightestShade, + color: theme.eui.euiColorMediumShade, title: i18n.translate( 'xpack.apm.serviceOverview.throughtputChart.previousPeriodLabel', { defaultMessage: 'Previous period' } diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx index fd9435db57bfd..c585ed1f401de 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx @@ -121,7 +121,7 @@ export function TransactionErrorRateChart({ { data: data.previousPeriod.transactionErrorRate, type: 'area', - color: theme.eui.euiColorLightestShade, + color: theme.eui.euiColorMediumShade, title: i18n.translate( 'xpack.apm.errorRate.chart.errorRate.previousPeriodLabel', { defaultMessage: 'Previous period' } diff --git a/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts b/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts index 252ced2be5e0e..808beb72f2e7a 100644 --- a/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts +++ b/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts @@ -18,7 +18,7 @@ const theme = { euiColorVis5: 'red', euiColorVis7: 'black', euiColorVis9: 'yellow', - euiColorLightestShade: 'green', + euiColorMediumShade: 'green', }, } as EuiTheme; diff --git a/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts b/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts index 2ee4a717106eb..a84a4abfe5810 100644 --- a/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts +++ b/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts @@ -65,7 +65,7 @@ function getPreviousPeriodTimeseries({ return { data: previousPeriod.latencyTimeseries ?? [], type: 'area', - color: theme.eui.euiColorLightestShade, + color: theme.eui.euiColorMediumShade, title: i18n.translate( 'xpack.apm.serviceOverview.latencyChartTitle.previousPeriodLabel', { defaultMessage: 'Previous period' } From 83824ab13a24da809e152a15ac4269d78f09a37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 19 Apr 2021 17:50:48 -0400 Subject: [PATCH 61/82] [APM] Stop fetching previous period data when comparison is disabled (#97469) * stopping fetching previous period data when comparison is disabled * addressing PR comments * refactoring comparison and primary API names --- .../service_overview.test.tsx | 6 +- .../get_column.tsx | 14 ++-- .../service_overview_errors_table/index.tsx | 30 ++++---- ...ice_overview_instances_chart_and_table.tsx | 73 ++++++++++--------- .../get_columns.tsx | 30 ++++---- .../index.tsx | 28 +++---- .../service_overview_throughput_chart.tsx | 1 + .../get_columns.tsx | 29 ++++---- .../index.tsx | 23 +++--- .../custom_tooltip.stories.tsx | 4 +- .../custom_tooltip.tsx | 6 +- .../index.tsx | 4 +- .../transaction_error_rate_chart/index.tsx | 1 + .../get_time_range_comparison.test.ts | 18 +++++ .../get_time_range_comparison.ts | 4 +- .../shared/time_comparison/index.tsx | 10 ++- .../use_transaction_latency_chart_fetcher.ts | 2 + ...ervice_error_group_detailed_statistics.ts} | 8 +- ...et_service_error_group_main_statistics.ts} | 4 +- ...n_statistics.ts => detailed_statistics.ts} | 51 ++++++------- ...imary_statistics.ts => main_statistics.ts} | 8 +- ..._transaction_group_detailed_statistics.ts} | 10 +-- x-pack/plugins/apm/server/routes/services.ts | 39 +++++----- .../plugins/apm/server/routes/transactions.ts | 18 ++--- .../test/apm_api_integration/tests/index.ts | 24 +++--- ...nap => instances_detailed_statistics.snap} | 4 +- ...cs.ts => instances_detailed_statistics.ts} | 12 +-- ...istics.ts => instances_main_statistics.ts} | 14 ++-- ... => error_groups_detailed_statistics.snap} | 4 +- ...ts => error_groups_detailed_statistics.ts} | 26 +++---- ...ics.ts => error_groups_main_statistics.ts} | 22 +++--- ...nsactions_groups_detailed_statistics.snap} | 20 ++--- ...ransactions_groups_detailed_statistics.ts} | 24 +++--- ...=> transactions_groups_main_statistics.ts} | 12 +-- 34 files changed, 310 insertions(+), 273 deletions(-) rename x-pack/plugins/apm/server/lib/services/get_service_error_groups/{get_service_error_group_comparison_statistics.ts => get_service_error_group_detailed_statistics.ts} (94%) rename x-pack/plugins/apm/server/lib/services/get_service_error_groups/{get_service_error_group_primary_statistics.ts => get_service_error_group_main_statistics.ts} (95%) rename x-pack/plugins/apm/server/lib/services/get_service_instances/{comparison_statistics.ts => detailed_statistics.ts} (80%) rename x-pack/plugins/apm/server/lib/services/get_service_instances/{primary_statistics.ts => main_statistics.ts} (87%) rename x-pack/plugins/apm/server/lib/services/{get_service_transaction_group_comparison_statistics.ts => get_service_transaction_group_detailed_statistics.ts} (95%) rename x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/{instances_comparison_statistics.snap => instances_detailed_statistics.snap} (99%) rename x-pack/test/apm_api_integration/tests/service_overview/{instances_comparison_statistics.ts => instances_detailed_statistics.ts} (95%) rename x-pack/test/apm_api_integration/tests/service_overview/{instances_primary_statistics.ts => instances_main_statistics.ts} (94%) rename x-pack/test/apm_api_integration/tests/services/__snapshots__/{error_groups_comparison_statistics.snap => error_groups_detailed_statistics.snap} (91%) rename x-pack/test/apm_api_integration/tests/services/{error_groups_comparison_statistics.ts => error_groups_detailed_statistics.ts} (90%) rename x-pack/test/apm_api_integration/tests/services/{error_groups_primary_statistics.ts => error_groups_main_statistics.ts} (84%) rename x-pack/test/apm_api_integration/tests/transactions/__snapshots__/{transactions_groups_comparison_statistics.snap => transactions_groups_detailed_statistics.snap} (88%) rename x-pack/test/apm_api_integration/tests/transactions/{transactions_groups_comparison_statistics.ts => transactions_groups_detailed_statistics.ts} (93%) rename x-pack/test/apm_api_integration/tests/transactions/{transactions_groups_primary_statistics.ts => transactions_groups_main_statistics.ts} (94%) diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx index c6ed4e640693f..d95d0c8503fc4 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx @@ -85,16 +85,16 @@ describe('ServiceOverview', () => { /* eslint-disable @typescript-eslint/naming-convention */ const calls = { - 'GET /api/apm/services/{serviceName}/error_groups/primary_statistics': { + 'GET /api/apm/services/{serviceName}/error_groups/main_statistics': { error_groups: [] as any[], }, - 'GET /api/apm/services/{serviceName}/transactions/groups/primary_statistics': { + 'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics': { transactionGroups: [] as any[], totalTransactionGroups: 0, isAggregationAccurate: true, }, 'GET /api/apm/services/{serviceName}/dependencies': [], - 'GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics': [], + 'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics': [], }; /* eslint-enable @typescript-eslint/naming-convention */ diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx index fd1120808db9e..4ad83f7d87426 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx @@ -16,18 +16,18 @@ import { TimestampTooltip } from '../../../shared/TimestampTooltip'; import { TruncateWithTooltip } from '../../../shared/truncate_with_tooltip'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -type ErrorGroupPrimaryStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/primary_statistics'>; -type ErrorGroupComparisonStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/comparison_statistics'>; +type ErrorGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; +type ErrorGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; export function getColumns({ serviceName, - errorGroupComparisonStatistics, + errorGroupDetailedStatistics, comparisonEnabled, }: { serviceName: string; - errorGroupComparisonStatistics: ErrorGroupComparisonStatistics; + errorGroupDetailedStatistics: ErrorGroupDetailedStatistics; comparisonEnabled?: boolean; -}): Array> { +}): Array> { return [ { field: 'name', @@ -74,10 +74,10 @@ export function getColumns({ width: px(unit * 12), render: (_, { occurrences, group_id: errorGroupId }) => { const currentPeriodTimeseries = - errorGroupComparisonStatistics?.currentPeriod?.[errorGroupId] + errorGroupDetailedStatistics?.currentPeriod?.[errorGroupId] ?.timeseries; const previousPeriodTimeseries = - errorGroupComparisonStatistics?.previousPeriod?.[errorGroupId] + errorGroupDetailedStatistics?.previousPeriod?.[errorGroupId] ?.timeseries; return ( diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx index d36bee8d6be73..7c222f85133e3 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx @@ -28,8 +28,8 @@ import { getColumns } from './get_column'; interface Props { serviceName: string; } -type ErrorGroupPrimaryStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/primary_statistics'>; -type ErrorGroupComparisonStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/comparison_statistics'>; +type ErrorGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; +type ErrorGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; type SortDirection = 'asc' | 'desc'; type SortField = 'name' | 'last_seen' | 'occurrences'; @@ -40,8 +40,8 @@ const DEFAULT_SORT = { field: 'occurrences' as const, }; -const INITIAL_STATE_PRIMARY_STATISTICS: { - items: ErrorGroupPrimaryStatistics['error_groups']; +const INITIAL_STATE_MAIN_STATISTICS: { + items: ErrorGroupMainStatistics['error_groups']; totalItems: number; requestId?: string; } = { @@ -50,7 +50,7 @@ const INITIAL_STATE_PRIMARY_STATISTICS: { requestId: undefined, }; -const INITIAL_STATE_COMPARISON_STATISTICS: ErrorGroupComparisonStatistics = { +const INITIAL_STATE_DETAILED_STATISTICS: ErrorGroupDetailedStatistics = { currentPeriod: {}, previousPeriod: {}, }; @@ -82,19 +82,20 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { start, end, comparisonType, + comparisonEnabled, }); const { pageIndex, sort } = tableOptions; const { direction, field } = sort; - const { data = INITIAL_STATE_PRIMARY_STATISTICS, status } = useFetcher( + const { data = INITIAL_STATE_MAIN_STATISTICS, status } = useFetcher( (callApmApi) => { if (!start || !end || !transactionType) { return; } return callApmApi({ endpoint: - 'GET /api/apm/services/{serviceName}/error_groups/primary_statistics', + 'GET /api/apm/services/{serviceName}/error_groups/main_statistics', params: { path: { serviceName }, query: { @@ -113,13 +114,13 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); return { + // Everytime the main statistics is refetched, updates the requestId making the comparison API to be refetched. requestId: uuid(), items: currentPageErrorGroups, totalItems: response.error_groups.length, }; }); }, - // comparisonType is listed as dependency even thought it is not used. This is needed to trigger the comparison api when it is changed. // eslint-disable-next-line react-hooks/exhaustive-deps [ environment, @@ -131,21 +132,24 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { pageIndex, direction, field, + // not used, but needed to trigger an update when comparisonType is changed either manually by user or when time range is changed comparisonType, + // not used, but needed to trigger an update when comparison feature is disabled/enabled by user + comparisonEnabled, ] ); const { requestId, items, totalItems } = data; const { - data: errorGroupComparisonStatistics = INITIAL_STATE_COMPARISON_STATISTICS, - status: errorGroupComparisonStatisticsStatus, + data: errorGroupDetailedStatistics = INITIAL_STATE_DETAILED_STATISTICS, + status: errorGroupDetailedStatisticsStatus, } = useFetcher( (callApmApi) => { if (requestId && items.length && start && end && transactionType) { return callApmApi({ endpoint: - 'GET /api/apm/services/{serviceName}/error_groups/comparison_statistics', + 'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics', params: { path: { serviceName }, query: { @@ -173,7 +177,7 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { const columns = getColumns({ serviceName, - errorGroupComparisonStatistics, + errorGroupDetailedStatistics, comparisonEnabled, }); @@ -218,7 +222,7 @@ export function ServiceOverviewErrorsTable({ serviceName }: Props) { }} loading={ status === FETCH_STATUS.LOADING || - errorGroupComparisonStatisticsStatus === FETCH_STATUS.LOADING + errorGroupDetailedStatisticsStatus === FETCH_STATUS.LOADING } onChange={(newTableOptions: { page?: { diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx index 55eb2e3ddab73..8305b5a0dde3b 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx @@ -25,7 +25,7 @@ interface ServiceOverviewInstancesChartAndTableProps { serviceName: string; } -export interface PrimaryStatsServiceInstanceItem { +export interface MainStatsServiceInstanceItem { serviceNodeName: string; errorRate: number; throughput: number; @@ -34,15 +34,15 @@ export interface PrimaryStatsServiceInstanceItem { memoryUsage: number; } -const INITIAL_STATE_PRIMARY_STATS = { - primaryStatsItems: [] as PrimaryStatsServiceInstanceItem[], - primaryStatsRequestId: undefined, - primaryStatsItemCount: 0, +const INITIAL_STATE_MAIN_STATS = { + mainStatsItems: [] as MainStatsServiceInstanceItem[], + mainStatsRequestId: undefined, + mainStatsItemCount: 0, }; -type ApiResponseComparisonStats = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/comparison_statistics'>; +type ApiResponseDetailedStats = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; -const INITIAL_STATE_COMPARISON_STATISTICS: ApiResponseComparisonStats = { +const INITIAL_STATE_DETAILED_STATISTICS: ApiResponseDetailedStats = { currentPeriod: {}, previousPeriod: {}, }; @@ -83,6 +83,7 @@ export function ServiceOverviewInstancesChartAndTable({ start, end, comparisonType, + comparisonEnabled, }, } = useUrlParams(); @@ -90,11 +91,12 @@ export function ServiceOverviewInstancesChartAndTable({ start, end, comparisonType, + comparisonEnabled, }); const { - data: primaryStatsData = INITIAL_STATE_PRIMARY_STATS, - status: primaryStatsStatus, + data: mainStatsData = INITIAL_STATE_MAIN_STATS, + status: mainStatsStatus, } = useFetcher( (callApmApi) => { if (!start || !end || !transactionType || !latencyAggregationType) { @@ -103,7 +105,7 @@ export function ServiceOverviewInstancesChartAndTable({ return callApmApi({ endpoint: - 'GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics', + 'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics', params: { path: { serviceName, @@ -118,7 +120,7 @@ export function ServiceOverviewInstancesChartAndTable({ }, }, }).then((response) => { - const primaryStatsItems = orderBy( + const mainStatsItems = orderBy( // need top-level sortable fields for the managed table response.serviceInstances.map((item) => ({ ...item, @@ -133,13 +135,13 @@ export function ServiceOverviewInstancesChartAndTable({ ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); return { - primaryStatsRequestId: uuid(), - primaryStatsItems, - primaryStatsItemCount: response.serviceInstances.length, + // Everytime the main statistics is refetched, updates the requestId making the detailed API to be refetched. + mainStatsRequestId: uuid(), + mainStatsItems, + mainStatsItemCount: response.serviceInstances.length, }; }); }, - // comparisonType is listed as dependency even thought it is not used. This is needed to trigger the comparison api when it is changed. // eslint-disable-next-line react-hooks/exhaustive-deps [ environment, @@ -152,19 +154,22 @@ export function ServiceOverviewInstancesChartAndTable({ pageIndex, field, direction, + // not used, but needed to trigger an update when comparisonType is changed either manually by user or when time range is changed comparisonType, + // not used, but needed to trigger an update when comparison feature is disabled/enabled by user + comparisonEnabled, ] ); const { - primaryStatsItems, - primaryStatsRequestId, - primaryStatsItemCount, - } = primaryStatsData; + mainStatsItems, + mainStatsRequestId, + mainStatsItemCount, + } = mainStatsData; const { - data: comparisonStatsData = INITIAL_STATE_COMPARISON_STATISTICS, - status: comparisonStatisticsStatus, + data: detailedStatsData = INITIAL_STATE_DETAILED_STATISTICS, + status: detailedStatsStatus, } = useFetcher( (callApmApi) => { if ( @@ -172,14 +177,14 @@ export function ServiceOverviewInstancesChartAndTable({ !end || !transactionType || !latencyAggregationType || - !primaryStatsItemCount + !mainStatsItemCount ) { return; } return callApmApi({ endpoint: - 'GET /api/apm/services/{serviceName}/service_overview_instances/comparison_statistics', + 'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics', params: { path: { serviceName, @@ -193,7 +198,7 @@ export function ServiceOverviewInstancesChartAndTable({ numBuckets: 20, transactionType, serviceNodeIds: JSON.stringify( - primaryStatsItems.map((item) => item.serviceNodeName) + mainStatsItems.map((item) => item.serviceNodeName) ), comparisonStart, comparisonEnd, @@ -201,9 +206,9 @@ export function ServiceOverviewInstancesChartAndTable({ }, }); }, - // only fetches comparison statistics when requestId is invalidated by primary statistics api call + // only fetches detailed statistics when requestId is invalidated by main statistics api call // eslint-disable-next-line react-hooks/exhaustive-deps - [primaryStatsRequestId], + [mainStatsRequestId], { preservePreviousData: false } ); @@ -212,22 +217,22 @@ export function ServiceOverviewInstancesChartAndTable({ { setTableOptions({ diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx index d61593f52b2ed..f52c2b083330f 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx @@ -26,23 +26,23 @@ import { MetricOverviewLink } from '../../../shared/Links/apm/MetricOverviewLink import { ServiceNodeMetricOverviewLink } from '../../../shared/Links/apm/ServiceNodeMetricOverviewLink'; import { TruncateWithTooltip } from '../../../shared/truncate_with_tooltip'; import { getLatencyColumnLabel } from '../get_latency_column_label'; -import { PrimaryStatsServiceInstanceItem } from '../service_overview_instances_chart_and_table'; +import { MainStatsServiceInstanceItem } from '../service_overview_instances_chart_and_table'; -type ServiceInstanceComparisonStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/comparison_statistics'>; +type ServiceInstanceDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; export function getColumns({ serviceName, agentName, latencyAggregationType, - comparisonStatsData, + detailedStatsData, comparisonEnabled, }: { serviceName: string; agentName?: string; latencyAggregationType?: LatencyAggregationType; - comparisonStatsData?: ServiceInstanceComparisonStatistics; + detailedStatsData?: ServiceInstanceDetailedStatistics; comparisonEnabled?: boolean; -}): Array> { +}): Array> { return [ { field: 'serviceNodeName', @@ -87,9 +87,9 @@ export function getColumns({ width: px(unit * 10), render: (_, { serviceNodeName, latency }) => { const currentPeriodTimestamp = - comparisonStatsData?.currentPeriod?.[serviceNodeName]?.latency; + detailedStatsData?.currentPeriod?.[serviceNodeName]?.latency; const previousPeriodTimestamp = - comparisonStatsData?.previousPeriod?.[serviceNodeName]?.latency; + detailedStatsData?.previousPeriod?.[serviceNodeName]?.latency; return ( { const currentPeriodTimestamp = - comparisonStatsData?.currentPeriod?.[serviceNodeName]?.throughput; + detailedStatsData?.currentPeriod?.[serviceNodeName]?.throughput; const previousPeriodTimestamp = - comparisonStatsData?.previousPeriod?.[serviceNodeName]?.throughput; + detailedStatsData?.previousPeriod?.[serviceNodeName]?.throughput; return ( { const currentPeriodTimestamp = - comparisonStatsData?.currentPeriod?.[serviceNodeName]?.errorRate; + detailedStatsData?.currentPeriod?.[serviceNodeName]?.errorRate; const previousPeriodTimestamp = - comparisonStatsData?.previousPeriod?.[serviceNodeName]?.errorRate; + detailedStatsData?.previousPeriod?.[serviceNodeName]?.errorRate; return ( { const currentPeriodTimestamp = - comparisonStatsData?.currentPeriod?.[serviceNodeName]?.cpuUsage; + detailedStatsData?.currentPeriod?.[serviceNodeName]?.cpuUsage; const previousPeriodTimestamp = - comparisonStatsData?.previousPeriod?.[serviceNodeName]?.cpuUsage; + detailedStatsData?.previousPeriod?.[serviceNodeName]?.cpuUsage; return ( { const currentPeriodTimestamp = - comparisonStatsData?.currentPeriod?.[serviceNodeName]?.memoryUsage; + detailedStatsData?.currentPeriod?.[serviceNodeName]?.memoryUsage; const previousPeriodTimestamp = - comparisonStatsData?.previousPeriod?.[serviceNodeName]?.memoryUsage; + detailedStatsData?.previousPeriod?.[serviceNodeName]?.memoryUsage; return ( ; +type ServiceInstanceDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; export interface TableOptions { pageIndex: number; @@ -38,26 +38,26 @@ export interface TableOptions { } interface Props { - primaryStatsItems: PrimaryStatsServiceInstanceItem[]; + mainStatsItems: MainStatsServiceInstanceItem[]; serviceName: string; - primaryStatsStatus: FETCH_STATUS; - primaryStatsItemCount: number; + mainStatsStatus: FETCH_STATUS; + mainStatsItemCount: number; tableOptions: TableOptions; onChangeTableOptions: (newTableOptions: { page?: { index: number }; sort?: { field: string; direction: SortDirection }; }) => void; - comparisonStatsData?: ServiceInstanceComparisonStatistics; + detailedStatsData?: ServiceInstanceDetailedStatistics; isLoading: boolean; } export function ServiceOverviewInstancesTable({ - primaryStatsItems = [], - primaryStatsItemCount, + mainStatsItems = [], + mainStatsItemCount, serviceName, - primaryStatsStatus: status, + mainStatsStatus: status, tableOptions, onChangeTableOptions, - comparisonStatsData: comparisonStatsData, + detailedStatsData: detailedStatsData, isLoading, }: Props) { const { agentName } = useApmServiceContext(); @@ -72,14 +72,14 @@ export function ServiceOverviewInstancesTable({ agentName, serviceName, latencyAggregationType, - comparisonStatsData, + detailedStatsData, comparisonEnabled, }); const pagination = { pageIndex, pageSize: PAGE_SIZE, - totalItemCount: primaryStatsItemCount, + totalItemCount: mainStatsItemCount, hidePerPageOptions: true, }; @@ -97,11 +97,11 @@ export function ServiceOverviewInstancesTable({ ; +type TransactionGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; type ServiceTransactionGroupItem = ValuesType< - TransactionGroupPrimaryStatistics['transactionGroups'] + TransactionGroupMainStatistics['transactionGroups'] >; -type TransactionGroupComparisonStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/comparison_statistics'>; +type TransactionGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/detailed_statistics'>; export function getColumns({ serviceName, latencyAggregationType, - transactionGroupComparisonStatistics, + transactionGroupDetailedStatistics, comparisonEnabled, }: { serviceName: string; latencyAggregationType?: LatencyAggregationType; - transactionGroupComparisonStatistics?: TransactionGroupComparisonStatistics; + transactionGroupDetailedStatistics?: TransactionGroupDetailedStatistics; comparisonEnabled?: boolean; }): Array> { return [ @@ -74,9 +74,9 @@ export function getColumns({ width: px(unit * 10), render: (_, { latency, name }) => { const currentTimeseries = - transactionGroupComparisonStatistics?.currentPeriod?.[name]?.latency; + transactionGroupDetailedStatistics?.currentPeriod?.[name]?.latency; const previousTimeseries = - transactionGroupComparisonStatistics?.previousPeriod?.[name]?.latency; + transactionGroupDetailedStatistics?.previousPeriod?.[name]?.latency; return ( { const currentTimeseries = - transactionGroupComparisonStatistics?.currentPeriod?.[name] - ?.throughput; + transactionGroupDetailedStatistics?.currentPeriod?.[name]?.throughput; const previousTimeseries = - transactionGroupComparisonStatistics?.previousPeriod?.[name] + transactionGroupDetailedStatistics?.previousPeriod?.[name] ?.throughput; return ( { const currentTimeseries = - transactionGroupComparisonStatistics?.currentPeriod?.[name] - ?.errorRate; + transactionGroupDetailedStatistics?.currentPeriod?.[name]?.errorRate; const previousTimeseries = - transactionGroupComparisonStatistics?.previousPeriod?.[name] - ?.errorRate; + transactionGroupDetailedStatistics?.previousPeriod?.[name]?.errorRate; return ( { const currentImpact = - transactionGroupComparisonStatistics?.currentPeriod?.[name]?.impact ?? + transactionGroupDetailedStatistics?.currentPeriod?.[name]?.impact ?? 0; const previousImpact = - transactionGroupComparisonStatistics?.previousPeriod?.[name]?.impact; + transactionGroupDetailedStatistics?.previousPeriod?.[name]?.impact; return ( diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx index 121b96b0361b2..0a4a735c117d2 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/index.tsx @@ -29,7 +29,7 @@ interface Props { serviceName: string; } -type ApiResponse = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/primary_statistics'>; +type ApiResponse = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; const INITIAL_STATE = { transactionGroups: [] as ApiResponse['transactionGroups'], isAggregationAccurate: true, @@ -77,6 +77,7 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { start, end, comparisonType, + comparisonEnabled, }); const { data = INITIAL_STATE, status } = useFetcher( @@ -86,7 +87,7 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { } return callApmApi({ endpoint: - 'GET /api/apm/services/{serviceName}/transactions/groups/primary_statistics', + 'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics', params: { path: { serviceName }, query: { @@ -107,14 +108,13 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { return { ...response, - // Everytime the primary statistics is refetched, updates the requestId making the comparison API to be refetched. + // Everytime the main statistics is refetched, updates the requestId making the detailed API to be refetched. requestId: uuid(), transactionGroupsTotalItems: response.transactionGroups.length, transactionGroups: currentPageTransactionGroups, }; }); }, - // comparisonType is listed as dependency even thought it is not used. This is needed to trigger the comparison api when it is changed. // eslint-disable-next-line react-hooks/exhaustive-deps [ environment, @@ -127,15 +127,18 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { pageIndex, direction, field, + // not used, but needed to trigger an update when comparisonType is changed either manually by user or when time range is changed comparisonType, + // not used, but needed to trigger an update when comparison feature is disabled/enabled by user + comparisonEnabled, ] ); const { transactionGroups, requestId, transactionGroupsTotalItems } = data; const { - data: transactionGroupComparisonStatistics, - status: transactionGroupComparisonStatisticsStatus, + data: transactionGroupDetailedStatistics, + status: transactionGroupDetailedStatisticsStatus, } = useFetcher( (callApmApi) => { if ( @@ -147,7 +150,7 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { ) { return callApmApi({ endpoint: - 'GET /api/apm/services/{serviceName}/transactions/groups/comparison_statistics', + 'GET /api/apm/services/{serviceName}/transactions/groups/detailed_statistics', params: { path: { serviceName }, query: { @@ -168,7 +171,7 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { }); } }, - // only fetches comparison statistics when requestId is invalidated by primary statistics api call + // only fetches detailed statistics when requestId is invalidated by main statistics api call // eslint-disable-next-line react-hooks/exhaustive-deps [requestId], { preservePreviousData: false } @@ -177,13 +180,13 @@ export function ServiceOverviewTransactionsTable({ serviceName }: Props) { const columns = getColumns({ serviceName, latencyAggregationType, - transactionGroupComparisonStatistics, + transactionGroupDetailedStatistics, comparisonEnabled, }); const isLoading = status === FETCH_STATUS.LOADING || - transactionGroupComparisonStatisticsStatus === FETCH_STATUS.LOADING; + transactionGroupDetailedStatisticsStatus === FETCH_STATUS.LOADING; const pagination = { pageIndex, diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx index 0e24c8e51c543..0eb5b0e84ff39 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx @@ -9,13 +9,13 @@ import { TooltipInfo } from '@elastic/charts'; import React, { ComponentType } from 'react'; import { EuiThemeProvider } from '../../../../../../../../src/plugins/kibana_react/common'; import { getDurationFormatter } from '../../../../../common/utils/formatters'; -import { PrimaryStatsServiceInstanceItem } from '../../../app/service_overview/service_overview_instances_chart_and_table'; +import { MainStatsServiceInstanceItem } from '../../../app/service_overview/service_overview_instances_chart_and_table'; import { CustomTooltip } from './custom_tooltip'; function getLatencyFormatter(props: TooltipInfo) { const maxLatency = Math.max( ...props.values.map((value) => { - const datum = (value.datum as unknown) as PrimaryStatsServiceInstanceItem; + const datum = (value.datum as unknown) as MainStatsServiceInstanceItem; return datum.latency ?? 0; }) ); diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx index 2280fa91a659c..027f764317e46 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx @@ -15,7 +15,7 @@ import { TimeFormatter, } from '../../../../../common/utils/formatters'; import { useTheme } from '../../../../hooks/use_theme'; -import { PrimaryStatsServiceInstanceItem } from '../../../app/service_overview/service_overview_instances_chart_and_table'; +import { MainStatsServiceInstanceItem } from '../../../app/service_overview/service_overview_instances_chart_and_table'; const latencyLabel = i18n.translate( 'xpack.apm.instancesLatencyDistributionChartTooltipLatencyLabel', @@ -48,7 +48,7 @@ function SingleInstanceCustomTooltip({ }) { const value = values[0]; const { color } = value; - const datum = (value.datum as unknown) as PrimaryStatsServiceInstanceItem; + const datum = (value.datum as unknown) as MainStatsServiceInstanceItem; const { latency, serviceNodeName, throughput } = datum; return ( @@ -119,7 +119,7 @@ function MultipleInstanceCustomTooltip({
{values.map((value) => { const { color } = value; - const datum = (value.datum as unknown) as PrimaryStatsServiceInstanceItem; + const datum = (value.datum as unknown) as MainStatsServiceInstanceItem; const { latency, serviceNodeName, throughput } = datum; return (
diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx index 57ecbd4ca0b78..394d5b5410d41 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx @@ -30,7 +30,7 @@ import { } from '../../../../../common/utils/formatters'; import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { useTheme } from '../../../../hooks/use_theme'; -import { PrimaryStatsServiceInstanceItem } from '../../../app/service_overview/service_overview_instances_chart_and_table'; +import { MainStatsServiceInstanceItem } from '../../../app/service_overview/service_overview_instances_chart_and_table'; import * as urlHelpers from '../../Links/url_helpers'; import { ChartContainer } from '../chart_container'; import { getResponseTimeTickFormatter } from '../transaction_charts/helper'; @@ -38,7 +38,7 @@ import { CustomTooltip } from './custom_tooltip'; export interface InstancesLatencyDistributionChartProps { height: number; - items?: PrimaryStatsServiceInstanceItem[]; + items?: MainStatsServiceInstanceItem[]; status: FETCH_STATUS; } diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx index c585ed1f401de..ec4b39aa871bb 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx @@ -68,6 +68,7 @@ export function TransactionErrorRateChart({ start, end, comparisonType, + comparisonEnabled, }); const { data = INITIAL_STATE, status } = useFetcher( diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts index 7234e94881ce7..77ae49bff7d84 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts @@ -11,12 +11,23 @@ import { describe('getTimeRangeComparison', () => { describe('return empty object', () => { + it('when comparison is disabled', () => { + const end = '2021-01-28T15:00:00.000Z'; + const result = getTimeRangeComparison({ + start: undefined, + end, + comparisonType: TimeRangeComparisonType.DayBefore, + comparisonEnabled: false, + }); + expect(result).toEqual({}); + }); it('when start is not defined', () => { const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ start: undefined, end, comparisonType: TimeRangeComparisonType.DayBefore, + comparisonEnabled: true, }); expect(result).toEqual({}); }); @@ -27,6 +38,7 @@ describe('getTimeRangeComparison', () => { start, end: undefined, comparisonType: TimeRangeComparisonType.DayBefore, + comparisonEnabled: true, }); expect(result).toEqual({}); }); @@ -39,6 +51,7 @@ describe('getTimeRangeComparison', () => { const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ comparisonType: TimeRangeComparisonType.DayBefore, + comparisonEnabled: true, start, end, }); @@ -52,6 +65,7 @@ describe('getTimeRangeComparison', () => { const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonEnabled: true, start, end, }); @@ -67,6 +81,7 @@ describe('getTimeRangeComparison', () => { start, end, comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonEnabled: true, }); expect(result).toEqual({ comparisonStart: '2021-02-09T14:24:02.174Z', @@ -83,6 +98,7 @@ describe('getTimeRangeComparison', () => { const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonEnabled: true, start, end, }); @@ -98,6 +114,7 @@ describe('getTimeRangeComparison', () => { const end = '2021-01-18T15:00:00.000Z'; const result = getTimeRangeComparison({ comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonEnabled: true, start, end, }); @@ -110,6 +127,7 @@ describe('getTimeRangeComparison', () => { const end = '2021-01-31T15:00:00.000Z'; const result = getTimeRangeComparison({ comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonEnabled: true, start, end, }); diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts index e436f65e85ad9..025e8c2a9935d 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts @@ -39,15 +39,17 @@ const oneDayInMilliseconds = moment.duration(1, 'day').asMilliseconds(); const oneWeekInMilliseconds = moment.duration(1, 'week').asMilliseconds(); export function getTimeRangeComparison({ + comparisonEnabled, comparisonType, start, end, }: { + comparisonEnabled?: boolean; comparisonType?: TimeRangeComparisonType; start?: string; end?: string; }) { - if (!comparisonType || !start || !end) { + if (!comparisonEnabled || !comparisonType || !start || !end) { return {}; } diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx b/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx index 84a2dad278a9b..98fbd4f399d98 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx @@ -63,10 +63,12 @@ function getSelectOptions({ start, end, rangeTo, + comparisonEnabled, }: { start?: string; end?: string; rangeTo?: string; + comparisonEnabled?: boolean; }) { const momentStart = moment(start); const momentEnd = moment(end); @@ -112,6 +114,7 @@ function getSelectOptions({ comparisonType: TimeRangeComparisonType.PeriodBefore, start, end, + comparisonEnabled, }); const dateFormat = getDateFormat({ @@ -140,7 +143,12 @@ export function TimeComparison() { urlParams: { start, end, comparisonEnabled, comparisonType, rangeTo }, } = useUrlParams(); - const selectOptions = getSelectOptions({ start, end, rangeTo }); + const selectOptions = getSelectOptions({ + start, + end, + rangeTo, + comparisonEnabled, + }); // Sets default values if (comparisonEnabled === undefined || comparisonType === undefined) { diff --git a/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts index 16a82b1d4972b..0f1592ca2679f 100644 --- a/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_transaction_latency_chart_fetcher.ts @@ -27,6 +27,7 @@ export function useTransactionLatencyChartsFetcher() { transactionName, latencyAggregationType, comparisonType, + comparisonEnabled, }, } = useUrlParams(); @@ -34,6 +35,7 @@ export function useTransactionLatencyChartsFetcher() { start, end, comparisonType, + comparisonEnabled, }); const { data, error, status } = useFetcher( diff --git a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_detailed_statistics.ts similarity index 94% rename from x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts rename to x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_detailed_statistics.ts index b559f55bbe78e..dd41269f0bad6 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_comparison_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_detailed_statistics.ts @@ -22,7 +22,7 @@ import { withApmSpan } from '../../../utils/with_apm_span'; import { getBucketSize } from '../../helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; -export async function getServiceErrorGroupComparisonStatistics({ +export async function getServiceErrorGroupDetailedStatistics({ kuery, serviceName, setup, @@ -44,7 +44,7 @@ export async function getServiceErrorGroupComparisonStatistics({ end: number; }): Promise> { return withApmSpan( - 'get_service_error_group_comparison_statistics', + 'get_service_error_group_detailed_statistics', async () => { const { apmEventClient } = setup; @@ -147,7 +147,7 @@ export async function getServiceErrorGroupPeriods({ groupIds, }; - const currentPeriodPromise = getServiceErrorGroupComparisonStatistics({ + const currentPeriodPromise = getServiceErrorGroupDetailedStatistics({ ...commonProps, start, end, @@ -155,7 +155,7 @@ export async function getServiceErrorGroupPeriods({ const previousPeriodPromise = comparisonStart && comparisonEnd - ? getServiceErrorGroupComparisonStatistics({ + ? getServiceErrorGroupDetailedStatistics({ ...commonProps, start: comparisonStart, end: comparisonEnd, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_main_statistics.ts similarity index 95% rename from x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts rename to x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_main_statistics.ts index 13a6069876369..361c92244aee0 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_primary_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/get_service_error_group_main_statistics.ts @@ -23,7 +23,7 @@ import { withApmSpan } from '../../../utils/with_apm_span'; import { getErrorName } from '../../helpers/get_error_name'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; -export function getServiceErrorGroupPrimaryStatistics({ +export function getServiceErrorGroupMainStatistics({ kuery, serviceName, setup, @@ -36,7 +36,7 @@ export function getServiceErrorGroupPrimaryStatistics({ transactionType: string; environment?: string; }) { - return withApmSpan('get_service_error_group_primary_statistics', async () => { + return withApmSpan('get_service_error_group_main_statistics', async () => { const { apmEventClient, start, end } = setup; const response = await apmEventClient.search({ diff --git a/x-pack/plugins/apm/server/lib/services/get_service_instances/comparison_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_instances/detailed_statistics.ts similarity index 80% rename from x-pack/plugins/apm/server/lib/services/get_service_instances/comparison_statistics.ts rename to x-pack/plugins/apm/server/lib/services/get_service_instances/detailed_statistics.ts index 6fca42723b9cc..85414100a1563 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_instances/comparison_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_instances/detailed_statistics.ts @@ -15,7 +15,7 @@ import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { getServiceInstancesSystemMetricStatistics } from './get_service_instances_system_metric_statistics'; import { getServiceInstancesTransactionStatistics } from './get_service_instances_transaction_statistics'; -interface ServiceInstanceComparisonStatisticsParams { +interface ServiceInstanceDetailedStatisticsParams { environment?: string; kuery?: string; latencyAggregationType: LatencyAggregationType; @@ -29,8 +29,8 @@ interface ServiceInstanceComparisonStatisticsParams { serviceNodeIds: string[]; } -async function getServiceInstancesComparisonStatistics( - params: ServiceInstanceComparisonStatisticsParams +async function getServiceInstancesDetailedStatistics( + params: ServiceInstanceDetailedStatisticsParams ): Promise< Array<{ serviceNodeName: string; @@ -41,31 +41,28 @@ async function getServiceInstancesComparisonStatistics( memoryUsage?: Coordinate[]; }> > { - return withApmSpan( - 'get_service_instances_comparison_statistics', - async () => { - const [transactionStats, systemMetricStats = []] = await Promise.all([ - getServiceInstancesTransactionStatistics({ - ...params, - isComparisonSearch: true, - }), - getServiceInstancesSystemMetricStatistics({ - ...params, - isComparisonSearch: true, - }), - ]); + return withApmSpan('get_service_instances_detailed_statistics', async () => { + const [transactionStats, systemMetricStats = []] = await Promise.all([ + getServiceInstancesTransactionStatistics({ + ...params, + isComparisonSearch: true, + }), + getServiceInstancesSystemMetricStatistics({ + ...params, + isComparisonSearch: true, + }), + ]); - const stats = joinByKey( - [...transactionStats, ...systemMetricStats], - 'serviceNodeName' - ); + const stats = joinByKey( + [...transactionStats, ...systemMetricStats], + 'serviceNodeName' + ); - return stats; - } - ); + return stats; + }); } -export async function getServiceInstancesComparisonStatisticsPeriods({ +export async function getServiceInstancesDetailedStatisticsPeriods({ environment, kuery, latencyAggregationType, @@ -91,7 +88,7 @@ export async function getServiceInstancesComparisonStatisticsPeriods({ comparisonEnd?: number; }) { return withApmSpan( - 'get_service_instances_comparison_statistics_periods', + 'get_service_instances_detailed_statistics_periods', async () => { const { start, end } = setup; @@ -107,7 +104,7 @@ export async function getServiceInstancesComparisonStatisticsPeriods({ serviceNodeIds, }; - const currentPeriodPromise = getServiceInstancesComparisonStatistics({ + const currentPeriodPromise = getServiceInstancesDetailedStatistics({ ...commonParams, start, end, @@ -115,7 +112,7 @@ export async function getServiceInstancesComparisonStatisticsPeriods({ const previousPeriodPromise = comparisonStart && comparisonEnd - ? getServiceInstancesComparisonStatistics({ + ? getServiceInstancesDetailedStatistics({ ...commonParams, start: comparisonStart, end: comparisonEnd, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_instances/primary_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_instances/main_statistics.ts similarity index 87% rename from x-pack/plugins/apm/server/lib/services/get_service_instances/primary_statistics.ts rename to x-pack/plugins/apm/server/lib/services/get_service_instances/main_statistics.ts index 3cd98558eff02..8bfa67f8c6247 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_instances/primary_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_instances/main_statistics.ts @@ -12,7 +12,7 @@ import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { getServiceInstancesSystemMetricStatistics } from './get_service_instances_system_metric_statistics'; import { getServiceInstancesTransactionStatistics } from './get_service_instances_transaction_statistics'; -interface ServiceInstancePrimaryStatisticsParams { +interface ServiceInstanceMainStatisticsParams { environment?: string; kuery?: string; latencyAggregationType: LatencyAggregationType; @@ -25,8 +25,8 @@ interface ServiceInstancePrimaryStatisticsParams { end: number; } -export async function getServiceInstancesPrimaryStatistics( - params: Omit +export async function getServiceInstancesMainStatistics( + params: Omit ): Promise< Array<{ serviceNodeName: string; @@ -37,7 +37,7 @@ export async function getServiceInstancesPrimaryStatistics( memoryUsage?: number | null; }> > { - return withApmSpan('get_service_instances_primary_statistics', async () => { + return withApmSpan('get_service_instances_main_statistics', async () => { const paramsForSubQueries = { ...params, size: 50, diff --git a/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts similarity index 95% rename from x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts rename to x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts index 54e882d1dd6da..314d6c7bd1458 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_comparison_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts @@ -35,7 +35,7 @@ import { import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { calculateTransactionErrorPercentage } from '../helpers/transaction_error_rate'; -export async function getServiceTransactionGroupComparisonStatistics({ +export async function getServiceTransactionGroupDetailedStatistics({ environment, kuery, serviceName, @@ -69,7 +69,7 @@ export async function getServiceTransactionGroupComparisonStatistics({ }> > { return withApmSpan( - 'get_service_transaction_group_comparison_statistics', + 'get_service_transaction_group_detailed_statistics', async () => { const { apmEventClient } = setup; const { intervalString } = getBucketSize({ start, end, numBuckets }); @@ -185,7 +185,7 @@ export async function getServiceTransactionGroupComparisonStatistics({ ); } -export async function getServiceTransactionGroupComparisonStatisticsPeriods({ +export async function getServiceTransactionGroupDetailedStatisticsPeriods({ serviceName, transactionNames, setup, @@ -224,7 +224,7 @@ export async function getServiceTransactionGroupComparisonStatisticsPeriods({ kuery, }; - const currentPeriodPromise = getServiceTransactionGroupComparisonStatistics({ + const currentPeriodPromise = getServiceTransactionGroupDetailedStatistics({ ...commonProps, start, end, @@ -232,7 +232,7 @@ export async function getServiceTransactionGroupComparisonStatisticsPeriods({ const previousPeriodPromise = comparisonStart && comparisonEnd - ? getServiceTransactionGroupComparisonStatistics({ + ? getServiceTransactionGroupDetailedStatistics({ ...commonProps, start: comparisonStart, end: comparisonEnd, diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts index 3ac76d4a5b4c2..07f951c4c1c86 100644 --- a/x-pack/plugins/apm/server/routes/services.ts +++ b/x-pack/plugins/apm/server/routes/services.ts @@ -17,10 +17,10 @@ import { getServiceAnnotations } from '../lib/services/annotations'; import { getServices } from '../lib/services/get_services'; import { getServiceAgentName } from '../lib/services/get_service_agent_name'; import { getServiceDependencies } from '../lib/services/get_service_dependencies'; -import { getServiceErrorGroupPeriods } from '../lib/services/get_service_error_groups/get_service_error_group_comparison_statistics'; -import { getServiceErrorGroupPrimaryStatistics } from '../lib/services/get_service_error_groups/get_service_error_group_primary_statistics'; -import { getServiceInstancesComparisonStatisticsPeriods } from '../lib/services/get_service_instances/comparison_statistics'; -import { getServiceInstancesPrimaryStatistics } from '../lib/services/get_service_instances/primary_statistics'; +import { getServiceErrorGroupPeriods } from '../lib/services/get_service_error_groups/get_service_error_group_detailed_statistics'; +import { getServiceErrorGroupMainStatistics } from '../lib/services/get_service_error_groups/get_service_error_group_main_statistics'; +import { getServiceInstancesDetailedStatisticsPeriods } from '../lib/services/get_service_instances/detailed_statistics'; +import { getServiceInstancesMainStatistics } from '../lib/services/get_service_instances/main_statistics'; import { getServiceMetadataDetails } from '../lib/services/get_service_metadata_details'; import { getServiceMetadataIcons } from '../lib/services/get_service_metadata_icons'; import { getServiceNodeMetadata } from '../lib/services/get_service_node_metadata'; @@ -292,9 +292,8 @@ const serviceAnnotationsCreateRoute = createApmServerRoute({ }, }); -const serviceErrorGroupsPrimaryStatisticsRoute = createApmServerRoute({ - endpoint: - 'GET /api/apm/services/{serviceName}/error_groups/primary_statistics', +const serviceErrorGroupsMainStatisticsRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/services/{serviceName}/error_groups/main_statistics', params: t.type({ path: t.type({ serviceName: t.string, @@ -317,7 +316,7 @@ const serviceErrorGroupsPrimaryStatisticsRoute = createApmServerRoute({ path: { serviceName }, query: { kuery, transactionType, environment }, } = params; - return getServiceErrorGroupPrimaryStatistics({ + return getServiceErrorGroupMainStatistics({ kuery, serviceName, setup, @@ -327,9 +326,9 @@ const serviceErrorGroupsPrimaryStatisticsRoute = createApmServerRoute({ }, }); -const serviceErrorGroupsComparisonStatisticsRoute = createApmServerRoute({ +const serviceErrorGroupsDetailedStatisticsRoute = createApmServerRoute({ endpoint: - 'GET /api/apm/services/{serviceName}/error_groups/comparison_statistics', + 'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics', params: t.type({ path: t.type({ serviceName: t.string, @@ -444,9 +443,9 @@ const serviceThroughputRoute = createApmServerRoute({ }, }); -const serviceInstancesPrimaryStatisticsRoute = createApmServerRoute({ +const serviceInstancesMainStatisticsRoute = createApmServerRoute({ endpoint: - 'GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics', + 'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics', params: t.type({ path: t.type({ serviceName: t.string, @@ -479,7 +478,7 @@ const serviceInstancesPrimaryStatisticsRoute = createApmServerRoute({ const { start, end } = setup; - const serviceInstances = await getServiceInstancesPrimaryStatistics({ + const serviceInstances = await getServiceInstancesMainStatistics({ environment, kuery, latencyAggregationType, @@ -495,9 +494,9 @@ const serviceInstancesPrimaryStatisticsRoute = createApmServerRoute({ }, }); -const serviceInstancesComparisonStatisticsRoute = createApmServerRoute({ +const serviceInstancesDetailedStatisticsRoute = createApmServerRoute({ endpoint: - 'GET /api/apm/services/{serviceName}/service_overview_instances/comparison_statistics', + 'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics', params: t.type({ path: t.type({ serviceName: t.string, @@ -535,7 +534,7 @@ const serviceInstancesComparisonStatisticsRoute = createApmServerRoute({ setup ); - return getServiceInstancesComparisonStatisticsPeriods({ + return getServiceInstancesDetailedStatisticsPeriods({ environment, kuery, latencyAggregationType, @@ -671,11 +670,11 @@ export const serviceRouteRepository = createApmServerRouteRepository() .add(serviceNodeMetadataRoute) .add(serviceAnnotationsRoute) .add(serviceAnnotationsCreateRoute) - .add(serviceErrorGroupsPrimaryStatisticsRoute) - .add(serviceErrorGroupsComparisonStatisticsRoute) + .add(serviceErrorGroupsMainStatisticsRoute) + .add(serviceErrorGroupsDetailedStatisticsRoute) .add(serviceThroughputRoute) - .add(serviceInstancesPrimaryStatisticsRoute) - .add(serviceInstancesComparisonStatisticsRoute) + .add(serviceInstancesMainStatisticsRoute) + .add(serviceInstancesDetailedStatisticsRoute) .add(serviceDependenciesRoute) .add(serviceProfilingTimelineRoute) .add(serviceProfilingStatisticsRoute); diff --git a/x-pack/plugins/apm/server/routes/transactions.ts b/x-pack/plugins/apm/server/routes/transactions.ts index b323801430dba..bcc554e552fc3 100644 --- a/x-pack/plugins/apm/server/routes/transactions.ts +++ b/x-pack/plugins/apm/server/routes/transactions.ts @@ -15,7 +15,7 @@ import { import { getSearchAggregatedTransactions } from '../lib/helpers/aggregated_transactions'; import { setupRequest } from '../lib/helpers/setup_request'; import { getServiceTransactionGroups } from '../lib/services/get_service_transaction_groups'; -import { getServiceTransactionGroupComparisonStatisticsPeriods } from '../lib/services/get_service_transaction_group_comparison_statistics'; +import { getServiceTransactionGroupDetailedStatisticsPeriods } from '../lib/services/get_service_transaction_group_detailed_statistics'; import { getTransactionBreakdown } from '../lib/transactions/breakdown'; import { getTransactionDistribution } from '../lib/transactions/distribution'; import { getAnomalySeries } from '../lib/transactions/get_anomaly_data'; @@ -34,7 +34,7 @@ import { /** * Returns a list of transactions grouped by name - * //TODO: delete this once we moved away from the old table in the transaction overview page. It should be replaced by /transactions/groups/primary_statistics/ + * //TODO: delete this once we moved away from the old table in the transaction overview page. It should be replaced by /transactions/groups/main_statistics/ */ const transactionGroupsRoute = createApmServerRoute({ endpoint: 'GET /api/apm/services/{serviceName}/transactions/groups', @@ -74,9 +74,9 @@ const transactionGroupsRoute = createApmServerRoute({ }, }); -const transactionGroupsPrimaryStatisticsRoute = createApmServerRoute({ +const transactionGroupsMainStatisticsRoute = createApmServerRoute({ endpoint: - 'GET /api/apm/services/{serviceName}/transactions/groups/primary_statistics', + 'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics', params: t.type({ path: t.type({ serviceName: t.string }), query: t.intersection([ @@ -117,9 +117,9 @@ const transactionGroupsPrimaryStatisticsRoute = createApmServerRoute({ }, }); -const transactionGroupsComparisonStatisticsRoute = createApmServerRoute({ +const transactionGroupsDetailedStatisticsRoute = createApmServerRoute({ endpoint: - 'GET /api/apm/services/{serviceName}/transactions/groups/comparison_statistics', + 'GET /api/apm/services/{serviceName}/transactions/groups/detailed_statistics', params: t.type({ path: t.type({ serviceName: t.string }), query: t.intersection([ @@ -161,7 +161,7 @@ const transactionGroupsComparisonStatisticsRoute = createApmServerRoute({ }, } = params; - return await getServiceTransactionGroupComparisonStatisticsPeriods({ + return await getServiceTransactionGroupDetailedStatisticsPeriods({ environment, kuery, setup, @@ -431,8 +431,8 @@ const transactionChartsErrorRateRoute = createApmServerRoute({ export const transactionRouteRepository = createApmServerRouteRepository() .add(transactionGroupsRoute) - .add(transactionGroupsPrimaryStatisticsRoute) - .add(transactionGroupsComparisonStatisticsRoute) + .add(transactionGroupsMainStatisticsRoute) + .add(transactionGroupsDetailedStatisticsRoute) .add(transactionLatencyChartsRoute) .add(transactionThroughputChartsRoute) .add(transactionChartsDistributionRoute) diff --git a/x-pack/test/apm_api_integration/tests/index.ts b/x-pack/test/apm_api_integration/tests/index.ts index 53ec61b8d9b61..df1ed1db5900a 100644 --- a/x-pack/test/apm_api_integration/tests/index.ts +++ b/x-pack/test/apm_api_integration/tests/index.ts @@ -65,12 +65,12 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte loadTestFile(require.resolve('./service_overview/dependencies')); }); - describe('service_overview/instances_primary_statistics', function () { - loadTestFile(require.resolve('./service_overview/instances_primary_statistics')); + describe('service_overview/instances_main_statistics', function () { + loadTestFile(require.resolve('./service_overview/instances_main_statistics')); }); - describe('service_overview/instances_comparison_statistics', function () { - loadTestFile(require.resolve('./service_overview/instances_comparison_statistics')); + describe('service_overview/instances_detailed_statistics', function () { + loadTestFile(require.resolve('./service_overview/instances_detailed_statistics')); }); // Services @@ -102,12 +102,12 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte loadTestFile(require.resolve('./services/transaction_types')); }); - describe('services/error_groups_primary_statistics', function () { - loadTestFile(require.resolve('./services/error_groups_primary_statistics')); + describe('services/error_groups_main_statistics', function () { + loadTestFile(require.resolve('./services/error_groups_main_statistics')); }); - describe('services/error_groups_comparison_statistics', function () { - loadTestFile(require.resolve('./services/error_groups_comparison_statistics')); + describe('services/error_groups_detailed_statistics', function () { + loadTestFile(require.resolve('./services/error_groups_detailed_statistics')); }); // Settinges @@ -165,12 +165,12 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte loadTestFile(require.resolve('./transactions/top_transaction_groups')); }); - describe('transactions/transactions_groups_primary_statistics', function () { - loadTestFile(require.resolve('./transactions/transactions_groups_primary_statistics')); + describe('transactions/transactions_groups_main_statistics', function () { + loadTestFile(require.resolve('./transactions/transactions_groups_main_statistics')); }); - describe('transactions/transactions_groups_comparison_statistics', function () { - loadTestFile(require.resolve('./transactions/transactions_groups_comparison_statistics')); + describe('transactions/transactions_groups_detailed_statistics', function () { + loadTestFile(require.resolve('./transactions/transactions_groups_detailed_statistics')); }); // feature control diff --git a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instances_comparison_statistics.snap b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instances_detailed_statistics.snap similarity index 99% rename from x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instances_comparison_statistics.snap rename to x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instances_detailed_statistics.snap index 7b7f6fd85b71e..99208e6cb466b 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instances_comparison_statistics.snap +++ b/x-pack/test/apm_api_integration/tests/service_overview/__snapshots__/instances_detailed_statistics.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`APM API tests basic apm_8.0.0 Service overview instances comparison statistics when data is loaded fetching data with comparison returns the right data for current and previous periods 5`] = ` +exports[`APM API tests basic apm_8.0.0 Service overview instances detailed statistics when data is loaded fetching data with comparison returns the right data for current and previous periods 5`] = ` Object { "currentPeriod": Object { "02950c4c5fbb0fda1cc98c47bf4024b473a8a17629db6530d95dcee68bd54c6c": Object { @@ -675,7 +675,7 @@ Object { } `; -exports[`APM API tests basic apm_8.0.0 Service overview instances comparison statistics when data is loaded fetching data without comparison returns the right data 3`] = ` +exports[`APM API tests basic apm_8.0.0 Service overview instances detailed statistics when data is loaded fetching data without comparison returns the right data 3`] = ` Object { "currentPeriod": Object { "02950c4c5fbb0fda1cc98c47bf4024b473a8a17629db6530d95dcee68bd54c6c": Object { diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_comparison_statistics.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.ts similarity index 95% rename from x-pack/test/apm_api_integration/tests/service_overview/instances_comparison_statistics.ts rename to x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.ts index 64d7e258c1fad..b5cfd722c41dd 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_comparison_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances_detailed_statistics.ts @@ -24,18 +24,18 @@ export default function ApiTest({ getService }: FtrProviderContext) { interface Response { status: number; - body: APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/comparison_statistics'>; + body: APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; } registry.when( - 'Service overview instances comparison statistics when data is not loaded', + 'Service overview instances detailed statistics when data is not loaded', { config: 'basic', archives: [] }, () => { describe('when data is not loaded', () => { it('handles the empty state', async () => { const response: Response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/service_overview_instances/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/service_overview_instances/detailed_statistics`, query: { latencyAggregationType: 'avg', start, @@ -55,7 +55,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Service overview instances comparison statistics when data is loaded', + 'Service overview instances detailed statistics when data is loaded', { config: 'basic', archives: [archiveName] }, () => { describe('fetching data without comparison', () => { @@ -64,7 +64,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { beforeEach(async () => { response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/service_overview_instances/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/service_overview_instances/detailed_statistics`, query: { latencyAggregationType: 'avg', start, @@ -111,7 +111,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { beforeEach(async () => { response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/service_overview_instances/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/service_overview_instances/detailed_statistics`, query: { latencyAggregationType: 'avg', numBuckets: 20, diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_primary_statistics.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts similarity index 94% rename from x-pack/test/apm_api_integration/tests/service_overview/instances_primary_statistics.ts rename to x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts index baa95eb56a126..8e085fab98ebf 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_primary_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts @@ -22,13 +22,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { const { start, end } = archives[archiveName]; registry.when( - 'Service overview instances primary statistics when data is not loaded', + 'Service overview instances main statistics when data is not loaded', { config: 'basic', archives: [] }, () => { describe('when data is not loaded', () => { it('handles the empty state', async () => { const response = await apmApiSupertest({ - endpoint: `GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics`, + endpoint: `GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics`, params: { path: { serviceName: 'opbeans-java' }, query: { @@ -48,17 +48,17 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Service overview instances primary statistics when data is loaded', + 'Service overview instances main statistics when data is loaded', { config: 'basic', archives: [archiveName] }, () => { describe('fetching java data', () => { let response: { - body: APIReturnType<`GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics`>; + body: APIReturnType<`GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics`>; }; beforeEach(async () => { response = await apmApiSupertest({ - endpoint: `GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics`, + endpoint: `GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics`, params: { path: { serviceName: 'opbeans-java' }, query: { @@ -122,12 +122,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('fetching non-java data', () => { let response: { - body: APIReturnType<`GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics`>; + body: APIReturnType<`GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics`>; }; beforeEach(async () => { response = await apmApiSupertest({ - endpoint: `GET /api/apm/services/{serviceName}/service_overview_instances/primary_statistics`, + endpoint: `GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics`, params: { path: { serviceName: 'opbeans-ruby' }, query: { diff --git a/x-pack/test/apm_api_integration/tests/services/__snapshots__/error_groups_comparison_statistics.snap b/x-pack/test/apm_api_integration/tests/services/__snapshots__/error_groups_detailed_statistics.snap similarity index 91% rename from x-pack/test/apm_api_integration/tests/services/__snapshots__/error_groups_comparison_statistics.snap rename to x-pack/test/apm_api_integration/tests/services/__snapshots__/error_groups_detailed_statistics.snap index 31bc29a2476ca..36529a41e080f 100644 --- a/x-pack/test/apm_api_integration/tests/services/__snapshots__/error_groups_comparison_statistics.snap +++ b/x-pack/test/apm_api_integration/tests/services/__snapshots__/error_groups_detailed_statistics.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`APM API tests basic apm_8.0.0 Error groups comparison statistics when data is loaded returns the correct data 1`] = ` +exports[`APM API tests basic apm_8.0.0 Error groups detailed statistics when data is loaded returns the correct data 1`] = ` Object { "groupId": "051f95eabf120ebe2f8b0399fe3e54c5", "timeseries": Array [ @@ -132,7 +132,7 @@ Object { } `; -exports[`APM API tests basic apm_8.0.0 Error groups comparison statistics when data is loaded with previous data returns the correct data returns correct timeseries 1`] = ` +exports[`APM API tests basic apm_8.0.0 Error groups detailed statistics when data is loaded with previous data returns the correct data returns correct timeseries 1`] = ` Object { "groupId": "051f95eabf120ebe2f8b0399fe3e54c5", "timeseries": Array [ diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups_detailed_statistics.ts similarity index 90% rename from x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts rename to x-pack/test/apm_api_integration/tests/services/error_groups_detailed_statistics.ts index 821d0515aa808..fdbc98af03bf2 100644 --- a/x-pack/test/apm_api_integration/tests/services/error_groups_comparison_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/services/error_groups_detailed_statistics.ts @@ -13,7 +13,7 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; import { registry } from '../../common/registry'; import { APIReturnType } from '../../../../plugins/apm/public/services/rest/createCallApmApi'; -type ErrorGroupsComparisonStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/comparison_statistics'>; +type ErrorGroupsDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; export default function ApiTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -30,13 +30,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]; registry.when( - 'Error groups comparison statistics when data is not loaded', + 'Error groups detailed statistics when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles empty state', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/detailed_statistics`, query: { start, end, @@ -54,13 +54,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Error groups comparison statistics when data is loaded', + 'Error groups detailed statistics when data is loaded', { config: 'basic', archives: [archiveName] }, () => { it('returns the correct data', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/detailed_statistics`, query: { start, end, @@ -73,7 +73,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.status).to.be(200); - const errorGroupsComparisonStatistics = response.body as ErrorGroupsComparisonStatistics; + const errorGroupsComparisonStatistics = response.body as ErrorGroupsDetailedStatistics; expect(Object.keys(errorGroupsComparisonStatistics.currentPeriod).sort()).to.eql( groupIds.sort() ); @@ -93,7 +93,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns an empty state when requested groupIds are not available in the given time range', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/detailed_statistics`, query: { start, end, @@ -111,18 +111,18 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Error groups comparison statistics when data is loaded with previous data', + 'Error groups detailed statistics when data is loaded with previous data', { config: 'basic', archives: [archiveName] }, () => { describe('returns the correct data', async () => { let response: { status: number; - body: ErrorGroupsComparisonStatistics; + body: ErrorGroupsDetailedStatistics; }; before(async () => { response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/detailed_statistics`, query: { numBuckets: 20, transactionType: 'request', @@ -139,7 +139,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('returns correct timeseries', () => { - const errorGroupsComparisonStatistics = response.body as ErrorGroupsComparisonStatistics; + const errorGroupsComparisonStatistics = response.body as ErrorGroupsDetailedStatistics; const errorgroupsComparisonStatistics = errorGroupsComparisonStatistics.currentPeriod[groupIds[0]]; expect( @@ -149,7 +149,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('matches x-axis on current period and previous period', () => { - const errorGroupsComparisonStatistics = response.body as ErrorGroupsComparisonStatistics; + const errorGroupsComparisonStatistics = response.body as ErrorGroupsDetailedStatistics; const currentPeriodItems = Object.values(errorGroupsComparisonStatistics.currentPeriod); const previousPeriodItems = Object.values(errorGroupsComparisonStatistics.previousPeriod); @@ -166,7 +166,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns an empty state when requested groupIds are not available in the given time range', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/detailed_statistics`, query: { numBuckets: 20, transactionType: 'request', diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups_main_statistics.ts similarity index 84% rename from x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts rename to x-pack/test/apm_api_integration/tests/services/error_groups_main_statistics.ts index 61a44619ea905..c95ba52e6052e 100644 --- a/x-pack/test/apm_api_integration/tests/services/error_groups_primary_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/services/error_groups_main_statistics.ts @@ -12,7 +12,7 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; import { registry } from '../../common/registry'; import { APIReturnType } from '../../../../plugins/apm/public/services/rest/createCallApmApi'; -type ErrorGroupsPrimaryStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/primary_statistics'>; +type ErrorGroupsMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; export default function ApiTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -22,13 +22,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { const { start, end } = metadata; registry.when( - 'Error groups primary statistics when data is not loaded', + 'Error groups main statistics when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles empty state', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/primary_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/main_statistics`, query: { start, end, @@ -47,13 +47,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Error groups primary statistics when data is loaded', + 'Error groups main statistics when data is loaded', { config: 'basic', archives: [archiveName] }, () => { it('returns the correct data', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/error_groups/primary_statistics`, + pathname: `/api/apm/services/opbeans-java/error_groups/main_statistics`, query: { start, end, @@ -65,12 +65,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.status).to.be(200); - const errorGroupPrimaryStatistics = response.body as ErrorGroupsPrimaryStatistics; + const errorGroupMainStatistics = response.body as ErrorGroupsMainStatistics; - expect(errorGroupPrimaryStatistics.is_aggregation_accurate).to.eql(true); - expect(errorGroupPrimaryStatistics.error_groups.length).to.be.greaterThan(0); + expect(errorGroupMainStatistics.is_aggregation_accurate).to.eql(true); + expect(errorGroupMainStatistics.error_groups.length).to.be.greaterThan(0); - expectSnapshot(errorGroupPrimaryStatistics.error_groups.map(({ name }) => name)) + expectSnapshot(errorGroupMainStatistics.error_groups.map(({ name }) => name)) .toMatchInline(` Array [ "Could not write JSON: Null return value from advice does not match primitive return type for: public abstract double co.elastic.apm.opbeans.repositories.Numbers.getRevenue(); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Null return value from advice does not match primitive return type for: public abstract double co.elastic.apm.opbeans.repositories.Numbers.getRevenue() (through reference chain: co.elastic.apm.opbeans.repositories.Stats[\\"numbers\\"]->com.sun.proxy.$Proxy132[\\"revenue\\"])", @@ -81,7 +81,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ] `); - const occurences = errorGroupPrimaryStatistics.error_groups.map( + const occurences = errorGroupMainStatistics.error_groups.map( ({ occurrences }) => occurrences ); @@ -97,7 +97,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ] `); - const firstItem = errorGroupPrimaryStatistics.error_groups[0]; + const firstItem = errorGroupMainStatistics.error_groups[0]; expectSnapshot(firstItem).toMatchInline(` Object { diff --git a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_groups_comparison_statistics.snap b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_groups_detailed_statistics.snap similarity index 88% rename from x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_groups_comparison_statistics.snap rename to x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_groups_detailed_statistics.snap index bc641ad1a9890..64336a4c65451 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_groups_comparison_statistics.snap +++ b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/transactions_groups_detailed_statistics.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns data with previous period returns correct error rate data 1`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns data with previous period returns correct error rate data 1`] = ` Array [ Object { "x": 1607436720000, @@ -69,7 +69,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns data with previous period returns correct error rate data 2`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns data with previous period returns correct error rate data 2`] = ` Array [ Object { "x": 1607436720000, @@ -138,7 +138,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns data with previous period returns correct latency data 1`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns data with previous period returns correct latency data 1`] = ` Array [ Object { "x": 1607436720000, @@ -207,7 +207,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns data with previous period returns correct latency data 2`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns data with previous period returns correct latency data 2`] = ` Array [ Object { "x": 1607436720000, @@ -276,7 +276,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns data with previous period returns correct throughput data 1`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns data with previous period returns correct throughput data 1`] = ` Array [ Object { "x": 1607436720000, @@ -345,7 +345,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns data with previous period returns correct throughput data 2`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns data with previous period returns correct throughput data 2`] = ` Array [ Object { "x": 1607436720000, @@ -414,7 +414,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns the correct data 1`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns the correct data 1`] = ` Array [ Object { "x": 1607435820000, @@ -543,7 +543,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns the correct data 2`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns the correct data 2`] = ` Array [ Object { "x": 1607435820000, @@ -672,7 +672,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns the correct data 3`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns the correct data 3`] = ` Array [ Object { "x": 1607435820000, @@ -801,7 +801,7 @@ Array [ ] `; -exports[`APM API tests basic apm_8.0.0 Transaction groups comparison statistics when data is loaded returns the correct data for latency aggregation 99th percentile 1`] = ` +exports[`APM API tests basic apm_8.0.0 Transaction groups detailed statistics when data is loaded returns the correct data for latency aggregation 99th percentile 1`] = ` Array [ Object { "x": 1607435820000, diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts similarity index 93% rename from x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts rename to x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts index 72fb0e832412d..303b8f715e957 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_comparison_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts @@ -15,7 +15,7 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; import { registry } from '../../common/registry'; import { removeEmptyCoordinates, roundNumber } from '../../utils'; -type TransactionsGroupsComparisonStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/comparison_statistics'>; +type TransactionsGroupsDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/detailed_statistics'>; export default function ApiTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -25,13 +25,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { const transactionNames = ['DispatcherServlet#doGet', 'APIRestController#customers']; registry.when( - 'Transaction groups comparison statistics when data is not loaded', + 'Transaction groups detailed statistics when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles the empty state', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/detailed_statistics`, query: { start, end, @@ -50,13 +50,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Transaction groups comparison statistics when data is loaded', + 'Transaction groups detailed statistics when data is loaded', { config: 'basic', archives: [archiveName] }, () => { it('returns the correct data', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/detailed_statistics`, query: { start, end, @@ -73,7 +73,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const { currentPeriod, previousPeriod, - } = response.body as TransactionsGroupsComparisonStatistics; + } = response.body as TransactionsGroupsDetailedStatistics; expect(Object.keys(currentPeriod).sort()).to.be.eql(transactionNames.sort()); @@ -110,7 +110,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns the correct data for latency aggregation 99th percentile', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/detailed_statistics`, query: { start, end, @@ -127,7 +127,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const { currentPeriod, previousPeriod, - } = response.body as TransactionsGroupsComparisonStatistics; + } = response.body as TransactionsGroupsDetailedStatistics; expect(Object.keys(currentPeriod).sort()).to.be.eql(transactionNames.sort()); @@ -158,7 +158,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns empty when transaction name is not found', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/detailed_statistics`, query: { start, end, @@ -175,12 +175,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('returns data with previous period', async () => { - let currentPeriod: TransactionsGroupsComparisonStatistics['currentPeriod']; - let previousPeriod: TransactionsGroupsComparisonStatistics['previousPeriod']; + let currentPeriod: TransactionsGroupsDetailedStatistics['currentPeriod']; + let previousPeriod: TransactionsGroupsDetailedStatistics['previousPeriod']; before(async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/comparison_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/detailed_statistics`, query: { numBuckets: 20, transactionType: 'request', diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.ts similarity index 94% rename from x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts rename to x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.ts index b6fd4054a351c..a2da077864b99 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_primary_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_main_statistics.ts @@ -13,7 +13,7 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; import archives from '../../common/fixtures/es_archiver/archives_metadata'; import { registry } from '../../common/registry'; -type TransactionsGroupsPrimaryStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/primary_statistics'>; +type TransactionsGroupsPrimaryStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; export default function ApiTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -22,13 +22,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { const { start, end } = archives[archiveName]; registry.when( - 'Transaction groups primary statistics when data is not loaded', + 'Transaction groups main statistics when data is not loaded', { config: 'basic', archives: [] }, () => { it('handles the empty state', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/primary_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/main_statistics`, query: { start, end, @@ -47,13 +47,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); registry.when( - 'Transaction groups primary statistics when data is loaded', + 'Transaction groups main statistics when data is loaded', { config: 'basic', archives: [archiveName] }, () => { it('returns the correct data', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/primary_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/main_statistics`, query: { start, end, @@ -125,7 +125,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('returns the correct data for latency aggregation 99th percentile', async () => { const response = await supertest.get( url.format({ - pathname: `/api/apm/services/opbeans-java/transactions/groups/primary_statistics`, + pathname: `/api/apm/services/opbeans-java/transactions/groups/main_statistics`, query: { start, end, From 89dd4b6eecf6e4eb415666a758ba423c010d02f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Tue, 20 Apr 2021 00:04:25 +0200 Subject: [PATCH 62/82] [Logs UI] Support Kibana index patterns in the Logs UI settings UI (#94849) This enhances the Logs UI settings screen to support both the legacy configuration style with index name patterns as well as the new style based on Kibana index patterns. --- .../log_sources/log_source_configuration.ts | 7 +- x-pack/plugins/infra/common/utility_types.ts | 2 + .../hooks/use_kibana_index_patterns.mock.tsx | 95 +++++++ .../public/hooks/use_kibana_index_patterns.ts | 45 ++++ .../settings/fields_configuration_panel.tsx | 49 ++-- .../pages/logs/settings/form_elements.tsx | 243 +++++++++++++++++ .../pages/logs/settings/form_field_props.tsx | 37 +++ .../index_names_configuration_panel.tsx | 127 +++++++++ .../index_pattern_configuration_panel.tsx | 121 +++++++++ .../logs/settings/index_pattern_selector.tsx | 73 +++++ .../indices_configuration_form_state.ts | 191 +++++++------- .../indices_configuration_panel.stories.tsx | 168 ++++++++++++ .../settings/indices_configuration_panel.tsx | 140 +++++----- .../log_columns_configuration_form_state.tsx | 158 +---------- .../log_columns_configuration_panel.tsx | 209 +++++++++------ .../name_configuration_form_state.tsx | 19 ++ .../settings/name_configuration_panel.tsx | 69 +++++ .../source_configuration_form_errors.tsx | 101 +++++++ .../source_configuration_form_state.tsx | 132 ++++------ .../source_configuration_settings.tsx | 249 ++++++++---------- .../pages/logs/settings/validation_errors.ts | 116 ++++++++ .../settings/fields_configuration_panel.tsx | 3 +- .../indices_configuration_form_state.ts | 3 +- .../settings/indices_configuration_panel.tsx | 3 +- .../metrics/settings}/input_fields.tsx | 0 .../settings/ml_configuration_panel.tsx | 18 +- .../settings}/name_configuration_panel.tsx | 1 - .../source_configuration_settings.tsx | 15 +- .../public/utils/source_configuration.ts | 12 + .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 31 files changed, 1743 insertions(+), 665 deletions(-) create mode 100644 x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.mock.tsx create mode 100644 x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.ts create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/index_pattern_selector.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.stories.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/name_configuration_form_state.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/name_configuration_panel.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_errors.tsx create mode 100644 x-pack/plugins/infra/public/pages/logs/settings/validation_errors.ts rename x-pack/plugins/infra/public/{components/source_configuration => pages/metrics/settings}/input_fields.tsx (100%) rename x-pack/plugins/infra/public/{components/source_configuration => pages/metrics/settings}/name_configuration_panel.tsx (99%) diff --git a/x-pack/plugins/infra/common/log_sources/log_source_configuration.ts b/x-pack/plugins/infra/common/log_sources/log_source_configuration.ts index 83bc8743900eb..ab98ad75b8433 100644 --- a/x-pack/plugins/infra/common/log_sources/log_source_configuration.ts +++ b/x-pack/plugins/infra/common/log_sources/log_source_configuration.ts @@ -53,18 +53,21 @@ export const logSourceColumnConfigurationRT = rt.union([ export type LogSourceColumnConfiguration = rt.TypeOf; // Kibana index pattern -const logIndexPatternReferenceRT = rt.type({ +export const logIndexPatternReferenceRT = rt.type({ type: rt.literal('index_pattern'), indexPatternId: rt.string, }); +export type LogIndexPatternReference = rt.TypeOf; // Legacy support -const logIndexNameReferenceRT = rt.type({ +export const logIndexNameReferenceRT = rt.type({ type: rt.literal('index_name'), indexName: rt.string, }); +export type LogIndexNameReference = rt.TypeOf; export const logIndexReferenceRT = rt.union([logIndexPatternReferenceRT, logIndexNameReferenceRT]); +export type LogIndexReference = rt.TypeOf; export const logSourceConfigurationPropertiesRT = rt.strict({ name: rt.string, diff --git a/x-pack/plugins/infra/common/utility_types.ts b/x-pack/plugins/infra/common/utility_types.ts index a785b4d13e557..1f26309973f0d 100644 --- a/x-pack/plugins/infra/common/utility_types.ts +++ b/x-pack/plugins/infra/common/utility_types.ts @@ -45,5 +45,7 @@ interface DeepPartialArray extends Array> {} type DeepPartialObject = { [P in keyof T]+?: DeepPartial }; +export type ObjectValues = Array; + export type ObjectEntry = [keyof T, T[keyof T]]; export type ObjectEntries = Array>; diff --git a/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.mock.tsx b/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.mock.tsx new file mode 100644 index 0000000000000..dbf032415cb99 --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.mock.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { from, of } from 'rxjs'; +import { delay } from 'rxjs/operators'; +import { CoreStart } from '../../../../../src/core/public'; +import { FieldSpec } from '../../../../../src/plugins/data/common'; +import { + IIndexPattern, + IndexPattern, + IndexPatternField, + IndexPatternsContract, +} from '../../../../../src/plugins/data/public'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { Pick2 } from '../../common/utility_types'; + +type MockIndexPattern = Pick< + IndexPattern, + 'id' | 'title' | 'type' | 'getTimeField' | 'isTimeBased' | 'getFieldByName' +>; +export type MockIndexPatternSpec = Pick< + IIndexPattern, + 'id' | 'title' | 'type' | 'timeFieldName' +> & { + fields: FieldSpec[]; +}; + +export const MockIndexPatternsKibanaContextProvider: React.FC<{ + asyncDelay: number; + mockIndexPatterns: MockIndexPatternSpec[]; +}> = ({ asyncDelay, children, mockIndexPatterns }) => { + const indexPatterns = useMemo( + () => + createIndexPatternsMock( + asyncDelay, + mockIndexPatterns.map(({ id, title, type = undefined, fields, timeFieldName }) => { + const indexPatternFields = fields.map((fieldSpec) => new IndexPatternField(fieldSpec)); + + return { + id, + title, + type, + getTimeField: () => indexPatternFields.find(({ name }) => name === timeFieldName), + isTimeBased: () => timeFieldName != null, + getFieldByName: (fieldName) => + indexPatternFields.find(({ name }) => name === fieldName), + }; + }) + ), + [asyncDelay, mockIndexPatterns] + ); + + const core = useMemo>( + () => ({ + application: { + getUrlForApp: () => '', + }, + }), + [] + ); + + return ( + + {children} + + ); +}; + +const createIndexPatternsMock = ( + asyncDelay: number, + indexPatterns: MockIndexPattern[] +): { + getIdsWithTitle: IndexPatternsContract['getIdsWithTitle']; + get: (...args: Parameters) => Promise; +} => { + return { + async getIdsWithTitle(_refresh?: boolean) { + const indexPatterns$ = of( + indexPatterns.map(({ id = 'unknown_id', title }) => ({ id, title })) + ); + return await indexPatterns$.pipe(delay(asyncDelay)).toPromise(); + }, + async get(indexPatternId: string) { + const indexPatterns$ = from( + indexPatterns.filter((indexPattern) => indexPattern.id === indexPatternId) + ); + return await indexPatterns$.pipe(delay(asyncDelay)).toPromise(); + }, + }; +}; diff --git a/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.ts b/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.ts new file mode 100644 index 0000000000000..a53cbcc170433 --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState } from 'react'; +import { useTrackedPromise } from '../utils/use_tracked_promise'; +import { useKibanaContextForPlugin } from './use_kibana'; + +export const useKibanaIndexPatternService = () => { + const { + services: { + data: { indexPatterns }, + }, + } = useKibanaContextForPlugin(); + + return indexPatterns; +}; + +interface IndexPatternDescriptor { + id: string; + title: string; +} + +export const useKibanaIndexPatternTitles = () => { + const indexPatterns = useKibanaIndexPatternService(); + + const [indexPatternTitles, setIndexPatternTitles] = useState([]); + + const [indexPatternTitlesRequest, fetchIndexPatternTitles] = useTrackedPromise( + { + createPromise: () => indexPatterns.getIdsWithTitle(true), + onResolve: setIndexPatternTitles, + }, + [indexPatterns] + ); + + return { + fetchIndexPatternTitles, + indexPatternTitles, + latestIndexPatternTitlesRequest: indexPatternTitlesRequest, + }; +}; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx index 236817ce3890f..3f8922b1871c9 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx @@ -10,7 +10,6 @@ import { EuiCode, EuiDescribedFormGroup, EuiFieldText, - EuiForm, EuiFormRow, EuiLink, EuiSpacer, @@ -18,27 +17,29 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import React from 'react'; -import { InputFieldProps } from '../../../components/source_configuration/input_fields'; +import React, { useMemo } from 'react'; +import { FormElement } from './form_elements'; +import { getFormRowProps, getStringInputFieldProps } from './form_field_props'; +import { FormValidationError } from './validation_errors'; interface FieldsConfigurationPanelProps { isLoading: boolean; - readOnly: boolean; - tiebreakerFieldProps: InputFieldProps; - timestampFieldProps: InputFieldProps; + isReadOnly: boolean; + tiebreakerFieldFormElement: FormElement; + timestampFieldFormElement: FormElement; } export const FieldsConfigurationPanel = ({ isLoading, - readOnly, - tiebreakerFieldProps, - timestampFieldProps, + isReadOnly, + tiebreakerFieldFormElement, + timestampFieldFormElement, }: FieldsConfigurationPanelProps) => { - const isTimestampValueDefault = timestampFieldProps.value === '@timestamp'; - const isTiebreakerValueDefault = tiebreakerFieldProps.value === '_doc'; + const isTimestampValueDefault = timestampFieldFormElement.value === '@timestamp'; + const isTiebreakerValueDefault = tiebreakerFieldFormElement.value === '_doc'; return ( - + <>

} - isInvalid={timestampFieldProps.isInvalid} label={ } + {...useMemo(() => getFormRowProps(timestampFieldFormElement), [ + timestampFieldFormElement, + ])} > getStringInputFieldProps(timestampFieldFormElement), [ + timestampFieldFormElement, + ])} /> @@ -146,7 +150,6 @@ export const FieldsConfigurationPanel = ({ } > } - isInvalid={tiebreakerFieldProps.isInvalid} label={ } + {...useMemo(() => getFormRowProps(tiebreakerFieldFormElement), [ + tiebreakerFieldFormElement, + ])} > getStringInputFieldProps(tiebreakerFieldFormElement), [ + tiebreakerFieldFormElement, + ])} /> - + ); }; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx b/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx new file mode 100644 index 0000000000000..751d9762b937a --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx @@ -0,0 +1,243 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import equal from 'fast-deep-equal'; +import { useCallback, useMemo, useState } from 'react'; +import { useAsync } from 'react-use'; +import { ObjectEntries } from '../../../../common/utility_types'; +import { ChildFormValidationError, GenericValidationError } from './validation_errors'; + +const unsetValue = Symbol('unset form value'); + +type ValueUpdater = (updater: (previousValue: Value) => Value) => void; + +export interface FormElement { + initialValue: Value; + isDirty: boolean; + resetValue: () => void; + updateValue: ValueUpdater; + validity: FormElementValidity; + value: Value; +} + +type FormElementMap = { + [formElementName in keyof FormValues]: FormElement; +}; + +export interface CompositeFormElement + extends FormElement { + childFormElements: FormElementMap; +} + +export type FormElementValidity = + | { validity: 'valid' } + | { validity: 'invalid'; reasons: InvalidReason[] } + | { validity: 'pending' }; + +export const useFormElement = ({ + initialValue, + validate, +}: { + initialValue: Value; + validate?: (value: Value) => Promise; +}): FormElement => { + const [changedValue, setChangedValue] = useState(unsetValue); + + const value = changedValue !== unsetValue ? changedValue : initialValue; + + const updateValue = useCallback>( + (updater) => + setChangedValue((previousValue) => + previousValue === unsetValue ? updater(initialValue) : updater(previousValue) + ), + [initialValue] + ); + + const resetValue = useCallback(() => setChangedValue(unsetValue), []); + + const isDirty = useMemo(() => !equal(value, initialValue), [value, initialValue]); + + const validity = useValidity(value, validate); + + return useMemo( + () => ({ + initialValue, + isDirty, + resetValue, + updateValue, + validity, + value, + }), + [initialValue, isDirty, resetValue, updateValue, validity, value] + ); +}; + +export const useCompositeFormElement = ({ + childFormElements, + validate, +}: { + childFormElements: FormElementMap; + validate?: (values: FormValues) => Promise; +}): CompositeFormElement => { + const childFormElementEntries = useMemo( + () => Object.entries(childFormElements) as ObjectEntries, + // eslint-disable-next-line react-hooks/exhaustive-deps + Object.entries(childFormElements).flat() + ); + + const value = useMemo( + () => + childFormElementEntries.reduce( + (accumulatedFormValues, [formElementName, formElement]) => ({ + ...accumulatedFormValues, + [formElementName]: formElement.value, + }), + {} as FormValues + ), + [childFormElementEntries] + ); + + const updateValue = useCallback( + (updater: (previousValues: FormValues) => FormValues) => { + const newValues = updater(value); + + childFormElementEntries.forEach(([formElementName, formElement]) => + formElement.updateValue(() => newValues[formElementName]) + ); + }, + [childFormElementEntries, value] + ); + + const isDirty = useMemo( + () => childFormElementEntries.some(([, formElement]) => formElement.isDirty), + [childFormElementEntries] + ); + + const formValidity = useValidity(value, validate); + const childFormElementsValidity = useMemo< + FormElementValidity + >(() => { + if ( + childFormElementEntries.some(([, formElement]) => formElement.validity.validity === 'invalid') + ) { + return { + validity: 'invalid', + reasons: [{ type: 'child' }], + }; + } else if ( + childFormElementEntries.some(([, formElement]) => formElement.validity.validity === 'pending') + ) { + return { + validity: 'pending', + }; + } else { + return { + validity: 'valid', + }; + } + }, [childFormElementEntries]); + + const validity = useMemo(() => getCombinedValidity(formValidity, childFormElementsValidity), [ + formValidity, + childFormElementsValidity, + ]); + + const resetValue = useCallback(() => { + childFormElementEntries.forEach(([, formElement]) => formElement.resetValue()); + }, [childFormElementEntries]); + + const initialValue = useMemo( + () => + childFormElementEntries.reduce( + (accumulatedFormValues, [formElementName, formElement]) => ({ + ...accumulatedFormValues, + [formElementName]: formElement.initialValue, + }), + {} as FormValues + ), + [childFormElementEntries] + ); + + return useMemo( + () => ({ + childFormElements, + initialValue, + isDirty, + resetValue, + updateValue, + validity, + value, + }), + [childFormElements, initialValue, isDirty, resetValue, updateValue, validity, value] + ); +}; + +const useValidity = ( + value: Value, + validate?: (value: Value) => Promise +) => { + const validationState = useAsync(() => validate?.(value) ?? Promise.resolve([]), [ + validate, + value, + ]); + + const validity = useMemo>(() => { + if (validationState.loading) { + return { validity: 'pending' as const }; + } else if (validationState.error != null) { + return { + validity: 'invalid' as const, + reasons: [ + { + type: 'generic' as const, + message: `${validationState.error}`, + }, + ], + }; + } else if (validationState.value && validationState.value.length > 0) { + return { + validity: 'invalid' as const, + reasons: validationState.value, + }; + } else { + return { + validity: 'valid' as const, + }; + } + }, [validationState.error, validationState.loading, validationState.value]); + + return validity; +}; + +export const getCombinedValidity = ( + first: FormElementValidity, + second: FormElementValidity +): FormElementValidity => { + if (first.validity === 'invalid' || second.validity === 'invalid') { + return { + validity: 'invalid', + reasons: [ + ...(first.validity === 'invalid' ? first.reasons : []), + ...(second.validity === 'invalid' ? second.reasons : []), + ], + }; + } else if (first.validity === 'pending' || second.validity === 'pending') { + return { + validity: 'pending', + }; + } else { + return { + validity: 'valid', + }; + } +}; + +export const isFormElementForType = ( + isValue: (value: any) => value is Value +) => ( + formElement: FormElement +): formElement is FormElement => isValue(formElement.value); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx b/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx new file mode 100644 index 0000000000000..4a3927157b136 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { FormElement } from './form_elements'; +import { LogSourceConfigurationFormError } from './source_configuration_form_errors'; +import { FormValidationError } from './validation_errors'; + +export const getFormRowProps = (formElement: FormElement) => ({ + error: + formElement.validity.validity === 'invalid' + ? formElement.validity.reasons.map((error) => ( + + )) + : [], + isInvalid: formElement.validity.validity === 'invalid', +}); + +export const getInputFieldProps = ( + decodeInputValue: (value: string) => Value, + encodeInputValue: (value: Value) => string +) => (formElement: FormElement) => ({ + isInvalid: formElement.validity.validity === 'invalid', + onChange: (evt: React.ChangeEvent) => { + const newValue = evt.currentTarget.value; + formElement.updateValue(() => decodeInputValue(newValue)); + }, + value: encodeInputValue(formElement.value), +}); + +export const getStringInputFieldProps = getInputFieldProps( + (value) => `${value}`, + (value) => value +); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx new file mode 100644 index 0000000000000..2d2909f42bae6 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiButton, + EuiCallOut, + EuiCode, + EuiDescribedFormGroup, + EuiFieldText, + EuiFormRow, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React from 'react'; +import { useTrackPageview } from '../../../../../observability/public'; +import { LogIndexNameReference } from '../../../../common/log_sources'; +import { FormElement } from './form_elements'; +import { getFormRowProps, getInputFieldProps } from './form_field_props'; +import { FormValidationError } from './validation_errors'; + +export const IndexNamesConfigurationPanel: React.FC<{ + isLoading: boolean; + isReadOnly: boolean; + indexNamesFormElement: FormElement; + onSwitchToIndexPatternReference: () => void; +}> = ({ isLoading, isReadOnly, indexNamesFormElement, onSwitchToIndexPatternReference }) => { + useTrackPageview({ app: 'infra_logs', path: 'log_source_configuration_index_name' }); + useTrackPageview({ + app: 'infra_logs', + path: 'log_source_configuration_index_name', + delay: 15000, + }); + + return ( + <> + +

+ +

+
+ + + + + + + + + + +

+ } + description={ + + } + > + logs-*,filebeat-*, + }} + /> + } + label={ + + } + {...getFormRowProps(indexNamesFormElement)} + > + + + + + ); +}; + +const getIndexNamesInputFieldProps = getInputFieldProps( + (value) => ({ + type: 'index_name', + indexName: value, + }), + ({ indexName }) => indexName +); + +const deprecationCalloutTitle = i18n.translate( + 'xpack.infra.logSourceConfiguration.indexNameReferenceDeprecationTitle', + { + defaultMessage: 'Deprecated configuration option', + } +); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx new file mode 100644 index 0000000000000..a16f15505bc30 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiDescribedFormGroup, EuiFormRow, EuiLink, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useCallback, useMemo } from 'react'; +import { useTrackPageview } from '../../../../../observability/public'; +import { LogIndexPatternReference } from '../../../../common/log_sources'; +import { useLinkProps } from '../../../hooks/use_link_props'; +import { FormElement } from './form_elements'; +import { getFormRowProps } from './form_field_props'; +import { IndexPatternSelector } from './index_pattern_selector'; +import { FormValidationError } from './validation_errors'; + +export const IndexPatternConfigurationPanel: React.FC<{ + isLoading: boolean; + isReadOnly: boolean; + indexPatternFormElement: FormElement; +}> = ({ isLoading, isReadOnly, indexPatternFormElement }) => { + useTrackPageview({ app: 'infra_logs', path: 'log_source_configuration_index_pattern' }); + useTrackPageview({ + app: 'infra_logs', + path: 'log_source_configuration_index_pattern', + delay: 15000, + }); + + const changeIndexPatternId = useCallback( + (indexPatternId: string | undefined) => { + if (indexPatternId != null) { + indexPatternFormElement.updateValue(() => ({ + type: 'index_pattern', + indexPatternId, + })); + } else { + indexPatternFormElement.updateValue(() => undefined); + } + }, + [indexPatternFormElement] + ); + + return ( + <> + +

+ +

+
+ + + + + + + } + description={ + + } + > + + } + {...useMemo(() => (isLoading ? {} : getFormRowProps(indexPatternFormElement)), [ + isLoading, + indexPatternFormElement, + ])} + > + + + + + ); +}; + +const IndexPatternInlineHelpMessage = React.memo(() => { + const indexPatternManagementLinkProps = useLinkProps({ + app: 'management', + pathname: '/kibana/indexPatterns', + }); + + return ( + + + + ), + }} + /> + ); +}); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_selector.tsx b/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_selector.tsx new file mode 100644 index 0000000000000..9e110db53a27f --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_selector.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useCallback, useEffect, useMemo } from 'react'; +import { useKibanaIndexPatternTitles } from '../../../hooks/use_kibana_index_patterns'; + +type IndexPatternOption = EuiComboBoxOptionOption; + +export const IndexPatternSelector: React.FC<{ + indexPatternId: string | undefined; + isLoading: boolean; + isReadOnly: boolean; + onChangeIndexPatternId: (indexPatternId: string | undefined) => void; +}> = ({ indexPatternId, isLoading, isReadOnly, onChangeIndexPatternId }) => { + const { + indexPatternTitles: availableIndexPatterns, + latestIndexPatternTitlesRequest, + fetchIndexPatternTitles, + } = useKibanaIndexPatternTitles(); + + useEffect(() => { + fetchIndexPatternTitles(); + }, [fetchIndexPatternTitles]); + + const availableOptions = useMemo( + () => + availableIndexPatterns.map(({ id, title }) => ({ + key: id, + label: title, + value: id, + })), + [availableIndexPatterns] + ); + + const selectedOptions = useMemo( + () => availableOptions.filter(({ key }) => key === indexPatternId), + [availableOptions, indexPatternId] + ); + + const changeSelectedIndexPatterns = useCallback( + ([newlySelectedOption]: IndexPatternOption[]) => { + if (typeof newlySelectedOption?.key === 'string') { + return onChangeIndexPatternId(newlySelectedOption.key); + } + + return onChangeIndexPatternId(undefined); + }, + [onChangeIndexPatternId] + ); + + return ( + + isLoading={isLoading || latestIndexPatternTitlesRequest.state === 'pending'} + isDisabled={isReadOnly} + options={availableOptions} + placeholder={indexPatternSelectorPlaceholder} + selectedOptions={selectedOptions} + singleSelection={true} + onChange={changeSelectedIndexPatterns} + /> + ); +}; + +const indexPatternSelectorPlaceholder = i18n.translate( + 'xpack.infra.logSourceConfiguration.indexPatternSelectorPlaceholder', + { defaultMessage: 'Choose an index pattern' } +); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_form_state.ts b/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_form_state.ts index b7656e6499006..49d14e04ca328 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_form_state.ts +++ b/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_form_state.ts @@ -5,120 +5,107 @@ * 2.0. */ -import { ReactNode, useCallback, useMemo, useState } from 'react'; +import { useMemo } from 'react'; +import { useUiTracker } from '../../../../../observability/public'; import { - createInputFieldProps, - validateInputFieldNotEmpty, -} from '../../../components/source_configuration/input_fields'; + LogIndexNameReference, + logIndexNameReferenceRT, + LogIndexPatternReference, +} from '../../../../common/log_sources'; +import { useKibanaIndexPatternService } from '../../../hooks/use_kibana_index_patterns'; +import { useCompositeFormElement, useFormElement } from './form_elements'; +import { + FormValidationError, + validateIndexPattern, + validateStringNotEmpty, +} from './validation_errors'; -interface FormState { - name: string; - description: string; - logAlias: string; - tiebreakerField: string; - timestampField: string; -} +export type LogIndicesFormState = LogIndexNameReference | LogIndexPatternReference | undefined; -type FormStateChanges = Partial; +export const useLogIndicesFormElement = (initialValue: LogIndicesFormState) => { + const indexPatternService = useKibanaIndexPatternService(); -export const useLogIndicesConfigurationFormState = ({ - initialFormState = defaultFormState, -}: { - initialFormState?: FormState; -}) => { - const [formStateChanges, setFormStateChanges] = useState({}); + const trackIndexPatternValidationError = useUiTracker({ app: 'infra_logs' }); - const resetForm = useCallback(() => setFormStateChanges({}), []); + const logIndicesFormElement = useFormElement({ + initialValue, + validate: useMemo( + () => async (logIndices) => { + if (logIndices == null) { + return validateStringNotEmpty('log index pattern', ''); + } else if (logIndexNameReferenceRT.is(logIndices)) { + return validateStringNotEmpty('log indices', logIndices.indexName); + } else { + const emptyStringErrors = validateStringNotEmpty( + 'log index pattern', + logIndices.indexPatternId + ); - const formState = useMemo( - () => ({ - ...initialFormState, - ...formStateChanges, - }), - [initialFormState, formStateChanges] - ); + if (emptyStringErrors.length > 0) { + return emptyStringErrors; + } - const nameFieldProps = useMemo( - () => - createInputFieldProps({ - errors: validateInputFieldNotEmpty(formState.name), - name: 'name', - onChange: (name) => setFormStateChanges((changes) => ({ ...changes, name })), - value: formState.name, - }), - [formState.name] - ); - const logAliasFieldProps = useMemo( - () => - createInputFieldProps({ - errors: validateInputFieldNotEmpty(formState.logAlias), - name: 'logAlias', - onChange: (logAlias) => setFormStateChanges((changes) => ({ ...changes, logAlias })), - value: formState.logAlias, - }), - [formState.logAlias] - ); - const tiebreakerFieldFieldProps = useMemo( - () => - createInputFieldProps({ - errors: validateInputFieldNotEmpty(formState.tiebreakerField), - name: `tiebreakerField`, - onChange: (tiebreakerField) => - setFormStateChanges((changes) => ({ ...changes, tiebreakerField })), - value: formState.tiebreakerField, - }), - [formState.tiebreakerField] - ); - const timestampFieldFieldProps = useMemo( - () => - createInputFieldProps({ - errors: validateInputFieldNotEmpty(formState.timestampField), - name: `timestampField`, - onChange: (timestampField) => - setFormStateChanges((changes) => ({ ...changes, timestampField })), - value: formState.timestampField, - }), - [formState.timestampField] - ); + const indexPatternErrors = validateIndexPattern( + await indexPatternService.get(logIndices.indexPatternId) + ); - const fieldProps = useMemo( - () => ({ - name: nameFieldProps, - logAlias: logAliasFieldProps, - tiebreakerField: tiebreakerFieldFieldProps, - timestampField: timestampFieldFieldProps, - }), - [nameFieldProps, logAliasFieldProps, tiebreakerFieldFieldProps, timestampFieldFieldProps] - ); + if (indexPatternErrors.length > 0) { + trackIndexPatternValidationError({ + metric: 'configuration_index_pattern_validation_failed', + }); + } else { + trackIndexPatternValidationError({ + metric: 'configuration_index_pattern_validation_succeeded', + }); + } - const errors = useMemo( - () => - Object.values(fieldProps).reduce( - (accumulatedErrors, { error }) => [...accumulatedErrors, ...error], - [] - ), - [fieldProps] - ); + return indexPatternErrors; + } + }, + [indexPatternService, trackIndexPatternValidationError] + ), + }); + + return logIndicesFormElement; +}; - const isFormValid = useMemo(() => errors.length <= 0, [errors]); +export interface FieldsFormState { + tiebreakerField: string; + timestampField: string; +} - const isFormDirty = useMemo(() => Object.keys(formStateChanges).length > 0, [formStateChanges]); +export const useFieldsFormElement = (initialValues: FieldsFormState) => { + const tiebreakerFieldFormElement = useFormElement({ + initialValue: initialValues.tiebreakerField, + validate: useMemo( + () => async (tiebreakerField) => validateStringNotEmpty('tiebreaker', tiebreakerField), + [] + ), + }); + + const timestampFieldFormElement = useFormElement({ + initialValue: initialValues.timestampField, + validate: useMemo( + () => async (timestampField) => validateStringNotEmpty('timestamp', timestampField), + [] + ), + }); + + const fieldsFormElement = useCompositeFormElement( + useMemo( + () => ({ + childFormElements: { + tiebreaker: tiebreakerFieldFormElement, + timestamp: timestampFieldFormElement, + }, + }), + [tiebreakerFieldFormElement, timestampFieldFormElement] + ) + ); return { - errors, - fieldProps, - formState, - formStateChanges, - isFormDirty, - isFormValid, - resetForm, + fieldsFormElement, + tiebreakerFieldFormElement, + timestampFieldFormElement, }; }; - -const defaultFormState: FormState = { - name: '', - description: '', - logAlias: '', - tiebreakerField: '', - timestampField: '', -}; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.stories.tsx b/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.stories.tsx new file mode 100644 index 0000000000000..8cc9f5b4357ef --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.stories.tsx @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiCodeBlock, EuiPage, EuiPageBody, EuiPageContent, PropsOf } from '@elastic/eui'; +import { I18nProvider } from '@kbn/i18n/react'; +import { Meta, Story } from '@storybook/react/types-6-0'; +import React from 'react'; +import { KBN_FIELD_TYPES } from '../../../../../../../src/plugins/data/public'; +import { EuiThemeProvider } from '../../../../../../../src/plugins/kibana_react/common'; +import { + MockIndexPatternsKibanaContextProvider, + MockIndexPatternSpec, +} from '../../../hooks/use_kibana_index_patterns.mock'; +import { + FieldsFormState, + LogIndicesFormState, + useFieldsFormElement, + useLogIndicesFormElement, +} from './indices_configuration_form_state'; +import { IndicesConfigurationPanel } from './indices_configuration_panel'; + +export default { + title: 'infra/logsSettings/indicesConfiguration', + decorators: [ + (WrappedStory, { args }) => { + return ( + + + + + + + + + + + + + + ); + }, + ], + argTypes: { + logIndices: { + control: { + type: 'object', + }, + }, + availableIndexPatterns: { + control: { + type: 'object', + }, + }, + }, +} as Meta; + +type IndicesConfigurationPanelProps = PropsOf; + +type IndicesConfigurationPanelStoryArgs = Pick< + IndicesConfigurationPanelProps, + 'isLoading' | 'isReadOnly' +> & { + availableIndexPatterns: MockIndexPatternSpec[]; + logIndices: LogIndicesFormState; + fields: FieldsFormState; +}; + +const IndicesConfigurationPanelTemplate: Story = ({ + isLoading, + isReadOnly, + logIndices, + fields, +}) => { + const logIndicesFormElement = useLogIndicesFormElement(logIndices); + const { tiebreakerFieldFormElement, timestampFieldFormElement } = useFieldsFormElement(fields); + + return ( + <> + + + // field states{'\n'} + {JSON.stringify( + { + logIndices: { + value: logIndicesFormElement.value, + validity: logIndicesFormElement.validity, + }, + tiebreakerField: { + value: tiebreakerFieldFormElement.value, + validity: tiebreakerFieldFormElement.validity, + }, + timestampField: { + value: timestampFieldFormElement.value, + validity: timestampFieldFormElement.validity, + }, + }, + null, + 2 + )} + + + ); +}; + +const defaultArgs: IndicesConfigurationPanelStoryArgs = { + isLoading: false, + isReadOnly: false, + logIndices: { + type: 'index_name' as const, + indexName: 'logs-*', + }, + fields: { + tiebreakerField: '_doc', + timestampField: '@timestamp', + }, + availableIndexPatterns: [ + { + id: 'INDEX_PATTERN_A', + title: 'pattern-a-*', + timeFieldName: '@timestamp', + fields: [ + { + name: '@timestamp', + type: KBN_FIELD_TYPES.DATE, + searchable: true, + aggregatable: true, + }, + { + name: 'message', + type: KBN_FIELD_TYPES.STRING, + searchable: true, + aggregatable: true, + }, + ], + }, + { + id: 'INDEX_PATTERN_B', + title: 'pattern-b-*', + fields: [], + }, + ], +}; + +export const IndexNameWithDefaultFields = IndicesConfigurationPanelTemplate.bind({}); + +IndexNameWithDefaultFields.args = { + ...defaultArgs, +}; + +export const IndexPattern = IndicesConfigurationPanelTemplate.bind({}); + +IndexPattern.args = { + ...defaultArgs, + logIndices: undefined, +}; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.tsx index e6f03e76255a2..6f762afd79244 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/indices_configuration_panel.tsx @@ -5,85 +5,77 @@ * 2.0. */ +import React, { useCallback } from 'react'; +import { useUiTracker } from '../../../../../observability/public'; import { - EuiCode, - EuiDescribedFormGroup, - EuiFieldText, - EuiForm, - EuiFormRow, - EuiSpacer, - EuiTitle, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import React from 'react'; -import { InputFieldProps } from '../../../components/source_configuration/input_fields'; + logIndexNameReferenceRT, + LogIndexPatternReference, + logIndexPatternReferenceRT, + LogIndexReference, +} from '../../../../common/log_sources'; +import { FieldsConfigurationPanel } from './fields_configuration_panel'; +import { FormElement, isFormElementForType } from './form_elements'; +import { IndexNamesConfigurationPanel } from './index_names_configuration_panel'; +import { IndexPatternConfigurationPanel } from './index_pattern_configuration_panel'; +import { FormValidationError } from './validation_errors'; -interface IndicesConfigurationPanelProps { +export const IndicesConfigurationPanel = React.memo<{ isLoading: boolean; - readOnly: boolean; - logAliasFieldProps: InputFieldProps; -} + isReadOnly: boolean; + indicesFormElement: FormElement; + tiebreakerFieldFormElement: FormElement; + timestampFieldFormElement: FormElement; +}>( + ({ + isLoading, + isReadOnly, + indicesFormElement, + tiebreakerFieldFormElement, + timestampFieldFormElement, + }) => { + const trackSwitchToIndexPatternReference = useUiTracker({ app: 'infra_logs' }); -export const IndicesConfigurationPanel = ({ - isLoading, - readOnly, - logAliasFieldProps, -}: IndicesConfigurationPanelProps) => ( - - -

- -

-
- - - - - } - description={ - { + indicesFormElement.updateValue(() => undefined); + trackSwitchToIndexPatternReference({ + metric: 'configuration_switch_to_index_pattern_reference', + }); + }, [indicesFormElement, trackSwitchToIndexPatternReference]); + + if (isIndexPatternFormElement(indicesFormElement)) { + return ( + - } - > - logs-*,filebeat-*, - }} + ); + } else if (isIndexNamesFormElement(indicesFormElement)) { + return ( + <> + - } - isInvalid={logAliasFieldProps.isInvalid} - label={ - - } - > - - - -
+ + ); + } else { + return null; + } + } +); + +const isIndexPatternFormElement = isFormElementForType( + (value): value is LogIndexPatternReference | undefined => + value == null || logIndexPatternReferenceRT.is(value) ); + +const isIndexNamesFormElement = isFormElementForType(logIndexNameReferenceRT.is); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_form_state.tsx b/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_form_state.tsx index 011fbf8a9d9a6..80eb44de9da9d 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_form_state.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_form_state.tsx @@ -5,150 +5,16 @@ * 2.0. */ -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { useCallback, useMemo, useState } from 'react'; -import { - FieldLogColumnConfiguration, - isMessageLogColumnConfiguration, - isTimestampLogColumnConfiguration, - LogColumnConfiguration, - MessageLogColumnConfiguration, - TimestampLogColumnConfiguration, -} from '../../../utils/source_configuration'; - -export interface TimestampLogColumnConfigurationProps { - logColumnConfiguration: TimestampLogColumnConfiguration['timestampColumn']; - remove: () => void; - type: 'timestamp'; -} - -export interface MessageLogColumnConfigurationProps { - logColumnConfiguration: MessageLogColumnConfiguration['messageColumn']; - remove: () => void; - type: 'message'; -} - -export interface FieldLogColumnConfigurationProps { - logColumnConfiguration: FieldLogColumnConfiguration['fieldColumn']; - remove: () => void; - type: 'field'; -} - -export type LogColumnConfigurationProps = - | TimestampLogColumnConfigurationProps - | MessageLogColumnConfigurationProps - | FieldLogColumnConfigurationProps; - -interface FormState { - logColumns: LogColumnConfiguration[]; -} - -type FormStateChanges = Partial; - -export const useLogColumnsConfigurationFormState = ({ - initialFormState = defaultFormState, -}: { - initialFormState?: FormState; -}) => { - const [formStateChanges, setFormStateChanges] = useState({}); - - const resetForm = useCallback(() => setFormStateChanges({}), []); - - const formState = useMemo( - () => ({ - ...initialFormState, - ...formStateChanges, - }), - [initialFormState, formStateChanges] - ); - - const logColumnConfigurationProps = useMemo( - () => - formState.logColumns.map( - (logColumn): LogColumnConfigurationProps => { - const remove = () => - setFormStateChanges((changes) => ({ - ...changes, - logColumns: formState.logColumns.filter((item) => item !== logColumn), - })); - - if (isTimestampLogColumnConfiguration(logColumn)) { - return { - logColumnConfiguration: logColumn.timestampColumn, - remove, - type: 'timestamp', - }; - } else if (isMessageLogColumnConfiguration(logColumn)) { - return { - logColumnConfiguration: logColumn.messageColumn, - remove, - type: 'message', - }; - } else { - return { - logColumnConfiguration: logColumn.fieldColumn, - remove, - type: 'field', - }; - } - } - ), - [formState.logColumns] - ); - - const addLogColumn = useCallback( - (logColumnConfiguration: LogColumnConfiguration) => - setFormStateChanges((changes) => ({ - ...changes, - logColumns: [...formState.logColumns, logColumnConfiguration], - })), - [formState.logColumns] - ); - - const moveLogColumn = useCallback( - (sourceIndex, destinationIndex) => { - if (destinationIndex >= 0 && sourceIndex <= formState.logColumns.length - 1) { - const newLogColumns = [...formState.logColumns]; - newLogColumns.splice(destinationIndex, 0, newLogColumns.splice(sourceIndex, 1)[0]); - setFormStateChanges((changes) => ({ - ...changes, - logColumns: newLogColumns, - })); - } - }, - [formState.logColumns] - ); - - const errors = useMemo( - () => - logColumnConfigurationProps.length <= 0 - ? [ - , - ] - : [], - [logColumnConfigurationProps] - ); - - const isFormValid = useMemo(() => (errors.length <= 0 ? true : false), [errors]); - - const isFormDirty = useMemo(() => Object.keys(formStateChanges).length > 0, [formStateChanges]); - - return { - addLogColumn, - moveLogColumn, - errors, - logColumnConfigurationProps, - formState, - formStateChanges, - isFormDirty, - isFormValid, - resetForm, - }; -}; - -const defaultFormState: FormState = { - logColumns: [], +import { useMemo } from 'react'; +import { LogColumnConfiguration } from '../../../utils/source_configuration'; +import { useFormElement } from './form_elements'; +import { FormValidationError, validateColumnListNotEmpty } from './validation_errors'; + +export const useLogColumnsFormElement = (initialValue: LogColumnConfiguration[]) => { + const logColumnsFormElement = useFormElement({ + initialValue, + validate: useMemo(() => async (logColumns) => validateColumnListNotEmpty(logColumns), []), + }); + + return logColumnsFormElement; }; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_panel.tsx index fb17f8bee3464..70db7837b8ae5 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/log_columns_configuration_panel.tsx @@ -13,7 +13,6 @@ import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, - EuiForm, EuiIcon, EuiPanel, EuiSpacer, @@ -24,28 +23,54 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback } from 'react'; import { DragHandleProps, DropResult } from '../../../../../observability/public'; -import { LogColumnConfiguration } from '../../../utils/source_configuration'; -import { AddLogColumnButtonAndPopover } from './add_log_column_popover'; import { - FieldLogColumnConfigurationProps, - LogColumnConfigurationProps, -} from './log_columns_configuration_form_state'; + FieldLogColumnConfiguration, + getLogColumnConfigurationId, + isMessageLogColumnConfiguration, + isTimestampLogColumnConfiguration, + LogColumnConfiguration, + MessageLogColumnConfiguration, + TimestampLogColumnConfiguration, +} from '../../../utils/source_configuration'; +import { AddLogColumnButtonAndPopover } from './add_log_column_popover'; +import { FormElement } from './form_elements'; +import { LogSourceConfigurationFormError } from './source_configuration_form_errors'; +import { FormValidationError } from './validation_errors'; -interface LogColumnsConfigurationPanelProps { +export const LogColumnsConfigurationPanel = React.memo<{ availableFields: string[]; isLoading: boolean; - logColumnConfiguration: LogColumnConfigurationProps[]; - addLogColumn: (logColumn: LogColumnConfiguration) => void; - moveLogColumn: (sourceIndex: number, destinationIndex: number) => void; -} + logColumnsFormElement: FormElement; +}>(({ availableFields, isLoading, logColumnsFormElement }) => { + const addLogColumn = useCallback( + (logColumnConfiguration: LogColumnConfiguration) => + logColumnsFormElement.updateValue((logColumns) => [...logColumns, logColumnConfiguration]), + [logColumnsFormElement] + ); + + const removeLogColumn = useCallback( + (logColumn: LogColumnConfiguration) => + logColumnsFormElement.updateValue((logColumns) => + logColumns.filter((item) => item !== logColumn) + ), + [logColumnsFormElement] + ); + + const moveLogColumn = useCallback( + (sourceIndex, destinationIndex) => { + logColumnsFormElement.updateValue((logColumns) => { + if (destinationIndex >= 0 && sourceIndex <= logColumnsFormElement.value.length - 1) { + const newLogColumns = [...logColumnsFormElement.value]; + newLogColumns.splice(destinationIndex, 0, newLogColumns.splice(sourceIndex, 1)[0]); + return newLogColumns; + } else { + return logColumns; + } + }); + }, + [logColumnsFormElement] + ); -export const LogColumnsConfigurationPanel: React.FunctionComponent = ({ - addLogColumn, - moveLogColumn, - availableFields, - isLoading, - logColumnConfiguration, -}) => { const onDragEnd = useCallback( ({ source, destination }: DropResult) => destination && moveLogColumn(source.index, destination.index), @@ -53,7 +78,7 @@ export const LogColumnsConfigurationPanel: React.FunctionComponent + <> @@ -73,63 +98,89 @@ export const LogColumnsConfigurationPanel: React.FunctionComponent - {logColumnConfiguration.length > 0 ? ( + {logColumnsFormElement.value.length > 0 ? ( - <> - {/* Fragment here necessary for typechecking */} - {logColumnConfiguration.map((column, index) => ( + {logColumnsFormElement.value.map((logColumnConfiguration, index) => { + const columnId = getLogColumnConfigurationId(logColumnConfiguration); + return ( {(provided) => ( )} - ))} - + ); + })} ) : ( )} -
+ {logColumnsFormElement.validity.validity === 'invalid' + ? logColumnsFormElement.validity.reasons.map((error) => ( + + + + )) + : null} + + ); +}); + +const LogColumnConfigurationPanel: React.FunctionComponent<{ + logColumnConfiguration: LogColumnConfiguration; + dragHandleProps: DragHandleProps; + onRemove: (logColumnConfiguration: LogColumnConfiguration) => void; +}> = ({ logColumnConfiguration, dragHandleProps, onRemove }) => { + const removeColumn = useCallback(() => onRemove(logColumnConfiguration), [ + logColumnConfiguration, + onRemove, + ]); + + return ( + <> + + {isTimestampLogColumnConfiguration(logColumnConfiguration) ? ( + + ) : isMessageLogColumnConfiguration(logColumnConfiguration) ? ( + + ) : ( + + )} + ); }; -interface LogColumnConfigurationPanelProps { - logColumnConfigurationProps: LogColumnConfigurationProps; +interface LogColumnConfigurationPanelProps { + logColumnConfiguration: LogColumnConfigurationType; dragHandleProps: DragHandleProps; + onRemove: () => void; } -const LogColumnConfigurationPanel: React.FunctionComponent = ( - props -) => ( - <> - - {props.logColumnConfigurationProps.type === 'timestamp' ? ( - - ) : props.logColumnConfigurationProps.type === 'message' ? ( - - ) : ( - - )} - -); - -const TimestampLogColumnConfigurationPanel: React.FunctionComponent = ({ - logColumnConfigurationProps, - dragHandleProps, -}) => ( +const TimestampLogColumnConfigurationPanel: React.FunctionComponent< + LogColumnConfigurationPanelProps +> = ({ dragHandleProps, onRemove }) => ( } - removeColumn={logColumnConfigurationProps.remove} + onRemove={onRemove} dragHandleProps={dragHandleProps} /> ); -const MessageLogColumnConfigurationPanel: React.FunctionComponent = ({ - logColumnConfigurationProps, - dragHandleProps, -}) => ( +const MessageLogColumnConfigurationPanel: React.FunctionComponent< + LogColumnConfigurationPanelProps +> = ({ dragHandleProps, onRemove }) => ( } - removeColumn={logColumnConfigurationProps.remove} + onRemove={onRemove} dragHandleProps={dragHandleProps} /> ); -const FieldLogColumnConfigurationPanel: React.FunctionComponent<{ - logColumnConfigurationProps: FieldLogColumnConfigurationProps; - dragHandleProps: DragHandleProps; -}> = ({ - logColumnConfigurationProps: { - logColumnConfiguration: { field }, - remove, - }, +const FieldLogColumnConfigurationPanel: React.FunctionComponent< + LogColumnConfigurationPanelProps +> = ({ dragHandleProps, + logColumnConfiguration: { + fieldColumn: { field }, + }, + onRemove, }) => { - const fieldLogColumnTitle = i18n.translate( - 'xpack.infra.sourceConfiguration.fieldLogColumnTitle', - { - defaultMessage: 'Field', - } - ); return ( - +
@@ -195,7 +242,7 @@ const FieldLogColumnConfigurationPanel: React.FunctionComponent<{ @@ -207,11 +254,13 @@ const FieldLogColumnConfigurationPanel: React.FunctionComponent<{ const ExplainedLogColumnConfigurationPanel: React.FunctionComponent<{ fieldName: React.ReactNode; helpText: React.ReactNode; - removeColumn: () => void; + onRemove: () => void; dragHandleProps: DragHandleProps; -}> = ({ fieldName, helpText, removeColumn, dragHandleProps }) => ( +}> = ({ fieldName, helpText, onRemove, dragHandleProps }) => ( @@ -226,7 +275,7 @@ const ExplainedLogColumnConfigurationPanel: React.FunctionComponent<{ - + @@ -277,3 +326,7 @@ const LogColumnConfigurationEmptyPrompt: React.FunctionComponent = () => ( } /> ); + +const fieldLogColumnTitle = i18n.translate('xpack.infra.sourceConfiguration.fieldLogColumnTitle', { + defaultMessage: 'Field', +}); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/name_configuration_form_state.tsx b/x-pack/plugins/infra/public/pages/logs/settings/name_configuration_form_state.tsx new file mode 100644 index 0000000000000..f97ece074c4a3 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/name_configuration_form_state.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import { useFormElement } from './form_elements'; +import { FormValidationError, validateStringNotEmpty } from './validation_errors'; + +export const useNameFormElement = (initialValue: string) => { + const nameFormElement = useFormElement({ + initialValue, + validate: useMemo(() => async (name) => validateStringNotEmpty('name', name), []), + }); + + return nameFormElement; +}; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/name_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/name_configuration_panel.tsx new file mode 100644 index 0000000000000..54158b654fee3 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/name_configuration_panel.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiDescribedFormGroup, + EuiFieldText, + EuiForm, + EuiFormRow, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { useMemo } from 'react'; +import { FormElement } from './form_elements'; +import { getFormRowProps, getStringInputFieldProps } from './form_field_props'; +import { FormValidationError } from './validation_errors'; + +export const NameConfigurationPanel = React.memo<{ + isLoading: boolean; + isReadOnly: boolean; + nameFormElement: FormElement; +}>(({ isLoading, isReadOnly, nameFormElement }) => ( + + +

+ +

+
+ + + + + } + description={ + + } + > + + } + {...useMemo(() => getFormRowProps(nameFormElement), [nameFormElement])} + > + getStringInputFieldProps(nameFormElement), [nameFormElement])} + /> + + +
+)); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_errors.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_errors.tsx new file mode 100644 index 0000000000000..af36a9dc0090b --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_errors.tsx @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiCallOut, EuiCode } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React from 'react'; +import { FormValidationError } from './validation_errors'; + +export const LogSourceConfigurationFormErrors: React.FC<{ errors: FormValidationError[] }> = ({ + errors, +}) => ( + +
    + {errors.map((error, errorIndex) => ( +
  • + +
  • + ))} +
+
+); + +export const LogSourceConfigurationFormError: React.FC<{ error: FormValidationError }> = ({ + error, +}) => { + if (error.type === 'generic') { + return <>{error.message}; + } else if (error.type === 'empty_field') { + return ( + + ); + } else if (error.type === 'empty_column_list') { + return ( + + ); + } else if (error.type === 'child') { + return ( + + ); + } else if (error.type === 'missing_timestamp_field') { + return ( + + ); + } else if (error.type === 'missing_message_field') { + return ( + message, + }} + /> + ); + } else if (error.type === 'invalid_message_field_type') { + return ( + message, + }} + /> + ); + } else if (error.type === 'rollup_index_pattern') { + return ( + + ); + } else { + return null; + } +}; + +const logSourceConfigurationFormErrorsCalloutTitle = i18n.translate( + 'xpack.infra.logSourceConfiguration.logSourceConfigurationFormErrorsCalloutTitle', + { + defaultMessage: 'Inconsistent source configuration', + } +); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx index 95c55b556ab86..67e790a98f518 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx @@ -5,103 +5,69 @@ * 2.0. */ -import { useCallback, useMemo } from 'react'; -import { ResolvedLogSourceConfiguration } from '../../../../common/log_sources'; -import { useLogIndicesConfigurationFormState } from './indices_configuration_form_state'; -import { useLogColumnsConfigurationFormState } from './log_columns_configuration_form_state'; +import { useMemo } from 'react'; +import { LogSourceConfigurationProperties } from '../../../containers/logs/log_source'; +import { useCompositeFormElement } from './form_elements'; +import { useFieldsFormElement, useLogIndicesFormElement } from './indices_configuration_form_state'; +import { useLogColumnsFormElement } from './log_columns_configuration_form_state'; +import { useNameFormElement } from './name_configuration_form_state'; export const useLogSourceConfigurationFormState = ( - configuration?: ResolvedLogSourceConfiguration + configuration?: LogSourceConfigurationProperties ) => { - const indicesConfigurationFormState = useLogIndicesConfigurationFormState({ - initialFormState: useMemo( - () => - configuration - ? { - name: configuration.name, - description: configuration.description, - logAlias: configuration.indices, - tiebreakerField: configuration.tiebreakerField, - timestampField: configuration.timestampField, - } - : undefined, - [configuration] - ), - }); + const nameFormElement = useNameFormElement(configuration?.name ?? ''); - const logColumnsConfigurationFormState = useLogColumnsConfigurationFormState({ - initialFormState: useMemo( + const logIndicesFormElement = useLogIndicesFormElement( + useMemo( () => - configuration - ? { - logColumns: configuration.columns, - } - : undefined, + configuration?.logIndices ?? { + type: 'index_name', + indexName: '', + }, [configuration] - ), - }); - - const errors = useMemo( - () => [...indicesConfigurationFormState.errors, ...logColumnsConfigurationFormState.errors], - [indicesConfigurationFormState.errors, logColumnsConfigurationFormState.errors] + ) ); - const resetForm = useCallback(() => { - indicesConfigurationFormState.resetForm(); - logColumnsConfigurationFormState.resetForm(); - }, [indicesConfigurationFormState, logColumnsConfigurationFormState]); - - const isFormDirty = useMemo( - () => indicesConfigurationFormState.isFormDirty || logColumnsConfigurationFormState.isFormDirty, - [indicesConfigurationFormState.isFormDirty, logColumnsConfigurationFormState.isFormDirty] - ); - - const isFormValid = useMemo( - () => indicesConfigurationFormState.isFormValid && logColumnsConfigurationFormState.isFormValid, - [indicesConfigurationFormState.isFormValid, logColumnsConfigurationFormState.isFormValid] + const { + fieldsFormElement, + tiebreakerFieldFormElement, + timestampFieldFormElement, + } = useFieldsFormElement( + useMemo( + () => ({ + tiebreakerField: configuration?.fields?.tiebreaker ?? '_doc', + timestampField: configuration?.fields?.timestamp ?? '@timestamp', + }), + [configuration] + ) ); - const formState = useMemo( - () => ({ - name: indicesConfigurationFormState.formState.name, - description: indicesConfigurationFormState.formState.description, - logAlias: indicesConfigurationFormState.formState.logAlias, - fields: { - tiebreaker: indicesConfigurationFormState.formState.tiebreakerField, - timestamp: indicesConfigurationFormState.formState.timestampField, - }, - logColumns: logColumnsConfigurationFormState.formState.logColumns, - }), - [indicesConfigurationFormState.formState, logColumnsConfigurationFormState.formState] + const logColumnsFormElement = useLogColumnsFormElement( + useMemo(() => configuration?.logColumns ?? [], [configuration]) ); - const formStateChanges = useMemo( - () => ({ - name: indicesConfigurationFormState.formStateChanges.name, - description: indicesConfigurationFormState.formStateChanges.description, - logAlias: indicesConfigurationFormState.formStateChanges.logAlias, - fields: { - tiebreaker: indicesConfigurationFormState.formStateChanges.tiebreakerField, - timestamp: indicesConfigurationFormState.formStateChanges.timestampField, - }, - logColumns: logColumnsConfigurationFormState.formStateChanges.logColumns, - }), - [ - indicesConfigurationFormState.formStateChanges, - logColumnsConfigurationFormState.formStateChanges, - ] + const sourceConfigurationFormElement = useCompositeFormElement( + useMemo( + () => ({ + childFormElements: { + name: nameFormElement, + logIndices: logIndicesFormElement, + fields: fieldsFormElement, + logColumns: logColumnsFormElement, + }, + validate: async () => [], + }), + [nameFormElement, logIndicesFormElement, fieldsFormElement, logColumnsFormElement] + ) ); return { - addLogColumn: logColumnsConfigurationFormState.addLogColumn, - moveLogColumn: logColumnsConfigurationFormState.moveLogColumn, - errors, - formState, - formStateChanges, - isFormDirty, - isFormValid, - indicesConfigurationProps: indicesConfigurationFormState.fieldProps, - logColumnConfigurationProps: logColumnsConfigurationFormState.logColumnConfigurationProps, - resetForm, + formState: sourceConfigurationFormElement.value, + logIndicesFormElement, + logColumnsFormElement, + nameFormElement, + sourceConfigurationFormElement, + tiebreakerFieldFormElement, + timestampFieldFormElement, }; }; diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx index 2eaf4f61409a8..9ab7d38e6c838 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx @@ -7,33 +7,40 @@ import { EuiButton, - EuiCallOut, EuiErrorBoundary, EuiFlexGroup, EuiFlexItem, - EuiPanel, - EuiSpacer, EuiPage, EuiPageBody, + EuiPageContentBody, + EuiPanel, + EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useMemo } from 'react'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; -import { FieldsConfigurationPanel } from './fields_configuration_panel'; +import { useTrackPageview } from '../../../../../observability/public'; +import { SourceLoadingPage } from '../../../components/source_loading_page'; +import { useLogSourceContext } from '../../../containers/logs/log_source'; +import { Prompt } from '../../../utils/navigation_warning_prompt'; import { IndicesConfigurationPanel } from './indices_configuration_panel'; -import { NameConfigurationPanel } from '../../../components/source_configuration/name_configuration_panel'; import { LogColumnsConfigurationPanel } from './log_columns_configuration_panel'; +import { NameConfigurationPanel } from './name_configuration_panel'; +import { LogSourceConfigurationFormErrors } from './source_configuration_form_errors'; import { useLogSourceConfigurationFormState } from './source_configuration_form_state'; -import { useLogSourceContext } from '../../../containers/logs/log_source'; -import { SourceLoadingPage } from '../../../components/source_loading_page'; -import { Prompt } from '../../../utils/navigation_warning_prompt'; -import { LogSourceConfigurationPropertiesPatch } from '../../../../common/http_api/log_sources'; export const LogsSettingsPage = () => { const uiCapabilities = useKibana().services.application?.capabilities; const shouldAllowEdit = uiCapabilities?.logs?.configureSource === true; + useTrackPageview({ app: 'infra_logs', path: 'log_source_configuration' }); + useTrackPageview({ + app: 'infra_logs', + path: 'log_source_configuration', + delay: 15000, + }); + const { sourceConfiguration: source, isLoading, @@ -48,35 +55,19 @@ export const LogsSettingsPage = () => { ); const { - addLogColumn, - moveLogColumn, - indicesConfigurationProps, - logColumnConfigurationProps, - errors, - resetForm, - isFormDirty, - isFormValid, - formStateChanges, - } = useLogSourceConfigurationFormState(resolvedSourceConfiguration); + sourceConfigurationFormElement, + formState, + logIndicesFormElement, + logColumnsFormElement, + nameFormElement, + tiebreakerFieldFormElement, + timestampFieldFormElement, + } = useLogSourceConfigurationFormState(source?.configuration); const persistUpdates = useCallback(async () => { - // NOTE / TODO: This is just a temporary workaround until this work is merged with the corresponding UI branch. - // Otherwise we would be duplicating work changing the logAlias etc references twice. - const patchedProperties: LogSourceConfigurationPropertiesPatch & { logAlias?: string } = { - ...formStateChanges, - ...(formStateChanges.logAlias - ? { - logIndices: { - type: 'index_name', - indexName: formStateChanges.logAlias, - }, - } - : {}), - }; - delete patchedProperties.logAlias; - await updateSourceConfiguration(patchedProperties); - resetForm(); - }, [updateSourceConfiguration, resetForm, formStateChanges]); + await updateSourceConfiguration(formState); + sourceConfigurationFormElement.resetValue(); + }, [updateSourceConfiguration, sourceConfigurationFormElement, formState]); const isWriteable = useMemo(() => shouldAllowEdit && source && source.origin !== 'internal', [ shouldAllowEdit, @@ -92,110 +83,100 @@ export const LogsSettingsPage = () => { return ( - - - - - - - - - - - - - + + + - - - - - - {errors.length > 0 ? ( - <> - -
    - {errors.map((error, errorIndex) => ( -
  • {error}
  • - ))} -
-
- - - ) : null} - - - {isWriteable && ( - - {isLoading ? ( - - - - Loading - - - - ) : ( - <> + + + + + + + + + + + + + {sourceConfigurationFormElement.validity.validity === 'invalid' ? ( + <> + + + + ) : null} + + {isWriteable && ( + + {isLoading ? ( - { - resetForm(); - }} - > - - - - - - + + Loading - - )} - - )} - + ) : ( + <> + + + { + sourceConfigurationFormElement.resetValue(); + }} + > + + + + + + + + + + + )} + + )} + +
diff --git a/x-pack/plugins/infra/public/pages/logs/settings/validation_errors.ts b/x-pack/plugins/infra/public/pages/logs/settings/validation_errors.ts new file mode 100644 index 0000000000000..b6e5a387590ed --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/settings/validation_errors.ts @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IndexPattern, KBN_FIELD_TYPES } from '../../../../../../../src/plugins/data/public'; + +export interface GenericValidationError { + type: 'generic'; + message: string; +} + +export interface ChildFormValidationError { + type: 'child'; +} + +export interface EmptyFieldValidationError { + type: 'empty_field'; + fieldName: string; +} + +export interface EmptyColumnListValidationError { + type: 'empty_column_list'; +} + +export interface MissingTimestampFieldValidationError { + type: 'missing_timestamp_field'; + indexPatternTitle: string; +} + +export interface MissingMessageFieldValidationError { + type: 'missing_message_field'; + indexPatternTitle: string; +} + +export interface InvalidMessageFieldTypeValidationError { + type: 'invalid_message_field_type'; + indexPatternTitle: string; +} + +export interface RollupIndexPatternValidationError { + type: 'rollup_index_pattern'; + indexPatternTitle: string; +} + +export type FormValidationError = + | GenericValidationError + | ChildFormValidationError + | EmptyFieldValidationError + | EmptyColumnListValidationError + | MissingTimestampFieldValidationError + | MissingMessageFieldValidationError + | InvalidMessageFieldTypeValidationError + | RollupIndexPatternValidationError; + +export const validateStringNotEmpty = (fieldName: string, value: string): FormValidationError[] => + value === '' ? [{ type: 'empty_field', fieldName }] : []; + +export const validateColumnListNotEmpty = (columns: unknown[]): FormValidationError[] => + columns.length <= 0 ? [{ type: 'empty_column_list' }] : []; + +export const validateIndexPattern = (indexPattern: IndexPattern): FormValidationError[] => { + return [ + ...validateIndexPatternIsTimeBased(indexPattern), + ...validateIndexPatternHasStringMessageField(indexPattern), + ...validateIndexPatternIsntRollup(indexPattern), + ]; +}; + +export const validateIndexPatternIsTimeBased = ( + indexPattern: IndexPattern +): FormValidationError[] => + indexPattern.isTimeBased() + ? [] + : [ + { + type: 'missing_timestamp_field' as const, + indexPatternTitle: indexPattern.title, + }, + ]; + +export const validateIndexPatternHasStringMessageField = ( + indexPattern: IndexPattern +): FormValidationError[] => { + const messageField = indexPattern.getFieldByName('message'); + + if (messageField == null) { + return [ + { + type: 'missing_message_field' as const, + indexPatternTitle: indexPattern.title, + }, + ]; + } else if (messageField.type !== KBN_FIELD_TYPES.STRING) { + return [ + { + type: 'invalid_message_field_type' as const, + indexPatternTitle: indexPattern.title, + }, + ]; + } else { + return []; + } +}; + +export const validateIndexPatternIsntRollup = (indexPattern: IndexPattern): FormValidationError[] => + indexPattern.type != null + ? [ + { + type: 'rollup_index_pattern' as const, + indexPatternTitle: indexPattern.title, + }, + ] + : []; diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/fields_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/fields_configuration_panel.tsx index 7026f372ec7ff..1c6c627c08d0b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/fields_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/fields_configuration_panel.tsx @@ -19,8 +19,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; - -import { InputFieldProps } from '../../../components/source_configuration/input_fields'; +import { InputFieldProps } from './input_fields'; interface FieldsConfigurationPanelProps { containerFieldProps: InputFieldProps; diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_form_state.ts b/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_form_state.ts index ad26c1b13b0e1..ced87112e6e9a 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_form_state.ts +++ b/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_form_state.ts @@ -6,12 +6,11 @@ */ import { ReactNode, useCallback, useMemo, useState } from 'react'; - import { createInputFieldProps, createInputRangeFieldProps, validateInputFieldNotEmpty, -} from '../../../components/source_configuration/input_fields'; +} from './input_fields'; interface FormState { name: string; diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_panel.tsx index c64ab2b0e9df5..c1e0d2ffefa80 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/indices_configuration_panel.tsx @@ -16,9 +16,8 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; - import { METRICS_INDEX_PATTERN } from '../../../../common/constants'; -import { InputFieldProps } from '../../../components/source_configuration/input_fields'; +import { InputFieldProps } from './input_fields'; interface IndicesConfigurationPanelProps { isLoading: boolean; diff --git a/x-pack/plugins/infra/public/components/source_configuration/input_fields.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/input_fields.tsx similarity index 100% rename from x-pack/plugins/infra/public/components/source_configuration/input_fields.tsx rename to x-pack/plugins/infra/public/pages/metrics/settings/input_fields.tsx diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/ml_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/ml_configuration_panel.tsx index abf25dde0ea99..630820156e0e5 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/ml_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/ml_configuration_panel.tsx @@ -5,15 +5,17 @@ * 2.0. */ -import { EuiTitle } from '@elastic/eui'; -import { EuiSpacer } from '@elastic/eui'; -import { EuiFormRow } from '@elastic/eui'; -import { EuiRange } from '@elastic/eui'; -import { EuiDescribedFormGroup } from '@elastic/eui'; -import { EuiForm } from '@elastic/eui'; +import { + EuiDescribedFormGroup, + EuiForm, + EuiFormRow, + EuiRange, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; -import { FormattedMessage } from 'react-intl'; -import { InputRangeFieldProps } from '../../../components/source_configuration/input_fields'; +import { InputRangeFieldProps } from './input_fields'; interface MLConfigurationPanelProps { isLoading: boolean; diff --git a/x-pack/plugins/infra/public/components/source_configuration/name_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/name_configuration_panel.tsx similarity index 99% rename from x-pack/plugins/infra/public/components/source_configuration/name_configuration_panel.tsx rename to x-pack/plugins/infra/public/pages/metrics/settings/name_configuration_panel.tsx index 2fa4ff100fe54..bb36d12ff3767 100644 --- a/x-pack/plugins/infra/public/components/source_configuration/name_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/name_configuration_panel.tsx @@ -15,7 +15,6 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; - import { InputFieldProps } from './input_fields'; interface NameConfigurationPanelProps { diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx index 71fa4e7600503..0579194464f4e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx @@ -10,24 +10,23 @@ import { EuiCallOut, EuiFlexGroup, EuiFlexItem, - EuiPanel, - EuiSpacer, EuiPage, EuiPageBody, + EuiPanel, + EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useContext, useMemo } from 'react'; - +import { SourceLoadingPage } from '../../../components/source_loading_page'; import { Source } from '../../../containers/metrics_source'; +import { useInfraMLCapabilitiesContext } from '../../../containers/ml/infra_ml_capabilities'; +import { Prompt } from '../../../utils/navigation_warning_prompt'; import { FieldsConfigurationPanel } from './fields_configuration_panel'; import { IndicesConfigurationPanel } from './indices_configuration_panel'; -import { NameConfigurationPanel } from '../../../components/source_configuration/name_configuration_panel'; -import { useSourceConfigurationFormState } from './source_configuration_form_state'; -import { SourceLoadingPage } from '../../../components/source_loading_page'; -import { Prompt } from '../../../utils/navigation_warning_prompt'; import { MLConfigurationPanel } from './ml_configuration_panel'; -import { useInfraMLCapabilitiesContext } from '../../../containers/ml/infra_ml_capabilities'; +import { NameConfigurationPanel } from './name_configuration_panel'; +import { useSourceConfigurationFormState } from './source_configuration_form_state'; interface SourceConfigurationSettingsProps { shouldAllowEdit: boolean; diff --git a/x-pack/plugins/infra/public/utils/source_configuration.ts b/x-pack/plugins/infra/public/utils/source_configuration.ts index a3e1741c7590b..ac8a331e86952 100644 --- a/x-pack/plugins/infra/public/utils/source_configuration.ts +++ b/x-pack/plugins/infra/public/utils/source_configuration.ts @@ -31,3 +31,15 @@ export const isTimestampLogColumnConfiguration = ( logColumnConfiguration: LogColumnConfiguration ): logColumnConfiguration is TimestampLogColumnConfiguration => logColumnConfiguration != null && 'timestampColumn' in logColumnConfiguration; + +export const getLogColumnConfigurationId = ( + logColumnConfiguration: LogColumnConfiguration +): string => { + if (isTimestampLogColumnConfiguration(logColumnConfiguration)) { + return logColumnConfiguration.timestampColumn.id; + } else if (isMessageLogColumnConfiguration(logColumnConfiguration)) { + return logColumnConfiguration.messageColumn.id; + } else { + return logColumnConfiguration.fieldColumn.id; + } +}; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 73dcecfe28d2d..496452f68aa34 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -11094,7 +11094,6 @@ "xpack.infra.sourceConfiguration.hostNameFieldDescription": "ホストの識別に使用されるフィールドです", "xpack.infra.sourceConfiguration.hostNameFieldLabel": "ホスト名", "xpack.infra.sourceConfiguration.indicesSectionTitle": "インデックス", - "xpack.infra.sourceConfiguration.logColumnListEmptyErrorMessage": "ログ列リストは未入力のままにできません。", "xpack.infra.sourceConfiguration.logColumnsSectionTitle": "ログ列", "xpack.infra.sourceConfiguration.logIndicesDescription": "ログデータを含む一致するインデックスのインデックスパターンです", "xpack.infra.sourceConfiguration.logIndicesLabel": "ログインデックス", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e7640c220a6c0..d2fe57c6b5add 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -11248,7 +11248,6 @@ "xpack.infra.sourceConfiguration.hostNameFieldDescription": "用于标识主机的字段", "xpack.infra.sourceConfiguration.hostNameFieldLabel": "主机名", "xpack.infra.sourceConfiguration.indicesSectionTitle": "索引", - "xpack.infra.sourceConfiguration.logColumnListEmptyErrorMessage": "日志列列表不得为空。", "xpack.infra.sourceConfiguration.logColumnsSectionTitle": "日志列", "xpack.infra.sourceConfiguration.logIndicesDescription": "用于匹配包含日志数据的索引的索引模式", "xpack.infra.sourceConfiguration.logIndicesLabel": "日志索引", From 563e4e68a039ade3d56aebcaf9367674338b7cc2 Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Mon, 19 Apr 2021 18:17:04 -0400 Subject: [PATCH 63/82] [Console] Update definition for _search autocomplete (#97303) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/lib/spec_definitions/js/search.ts | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/plugins/console/server/lib/spec_definitions/js/search.ts b/src/plugins/console/server/lib/spec_definitions/js/search.ts index 686737b96ac83..5a3b37e2e4135 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/search.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/search.ts @@ -16,7 +16,7 @@ export const search = (specService: SpecDefinitionsService) => { // populated by a global rule }, profile: { - __one_of: ['true', 'false'], + __one_of: [true, false], }, aggs: { __template: { @@ -118,6 +118,26 @@ export const search = (specService: SpecDefinitionsService) => { }, }, docvalue_fields: ['{field}'], + fields: { + __one_of: [ + [ + { + __one_of: [ + '{field}', + '*', + { + field: '{field}', + include_unmapped: { + __one_of: ['true', 'false'], + }, + format: '', + }, + ], + }, + ], + '*', + ], + }, collapse: { __template: { field: 'FIELD', @@ -144,6 +164,19 @@ export const search = (specService: SpecDefinitionsService) => { __scope_link: 'GLOBAL.script', }, }, + runtime_mappings: { + __template: { + FIELD: { + type: '', + script: { + // populated by a global rule + }, + }, + }, + '*': { + __scope_link: 'GLOBAL.script', + }, + }, partial_fields: { __template: { NAME: { @@ -160,8 +193,11 @@ export const search = (specService: SpecDefinitionsService) => { }, _source: { __one_of: [ - '{field}', ['{field}'], + '*', + '{field}', + true, + false, { includes: { __one_of: ['{field}', ['{field}']], From 9bc66ed34316075dd1a4e72b8b4e20c3439a98b2 Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Mon, 19 Apr 2021 18:17:57 -0400 Subject: [PATCH 64/82] [Lens] Faster field existence failures by adding timeouts (#97188) * [Lens] Faster field existence failures by adding timeouts * Increase shard timeout and add timeout-specific warning * Fix types * Fix import * Hide field info when in error state, but not timeout Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../datapanel.test.tsx | 25 +++++++ .../indexpattern_datasource/datapanel.tsx | 15 ++-- .../indexpattern_datasource/field_list.tsx | 3 + .../fields_accordion.tsx | 59 +++++++++++----- .../indexpattern_datasource/loader.test.ts | 52 ++++++++++++++ .../public/indexpattern_datasource/loader.ts | 6 +- .../public/indexpattern_datasource/types.ts | 1 + .../lens/server/routes/existing_fields.ts | 70 ++++++++++++------- 8 files changed, 181 insertions(+), 50 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx index e6a38ce2bb713..6c5116436dddb 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.test.tsx @@ -9,6 +9,7 @@ import React, { ChangeEvent, ReactElement } from 'react'; import { createMockedDragDropContext } from './mocks'; import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; import { InnerIndexPatternDataPanel, IndexPatternDataPanel, MemoizedDataPanel } from './datapanel'; +import { FieldList } from './field_list'; import { FieldItem } from './field_item'; import { NoFieldsCallout } from './no_fields_callout'; import { act } from 'react-dom/test-utils'; @@ -713,6 +714,30 @@ describe('IndexPattern Data Panel', () => { expect(wrapper.find(NoFieldsCallout).length).toEqual(2); }); + it('should not allow field details when error', () => { + const wrapper = mountWithIntl( + + ); + + expect(wrapper.find(FieldList).prop('fieldGroups')).toEqual( + expect.objectContaining({ + AvailableFields: expect.objectContaining({ hideDetails: true }), + }) + ); + }); + + it('should allow field details when timeout', () => { + const wrapper = mountWithIntl( + + ); + + expect(wrapper.find(FieldList).prop('fieldGroups')).toEqual( + expect.objectContaining({ + AvailableFields: expect.objectContaining({ hideDetails: false }), + }) + ); + }); + it('should filter down by name', () => { const wrapper = mountWithIntl(); act(() => { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx index 1b7c8d64de36e..9fd389d4e65d3 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx @@ -230,6 +230,7 @@ export function IndexPatternDataPanel({ onUpdateIndexPattern={onUpdateIndexPattern} existingFields={state.existingFields} existenceFetchFailed={state.existenceFetchFailed} + existenceFetchTimeout={state.existenceFetchTimeout} dropOntoWorkspace={dropOntoWorkspace} hasSuggestionForField={hasSuggestionForField} /> @@ -271,6 +272,7 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ indexPatternRefs, indexPatterns, existenceFetchFailed, + existenceFetchTimeout, query, dateRange, filters, @@ -297,6 +299,7 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ charts: ChartsPluginSetup; indexPatternFieldEditor: IndexPatternFieldEditorStart; existenceFetchFailed?: boolean; + existenceFetchTimeout?: boolean; }) { const [localState, setLocalState] = useState({ nameFilter: '', @@ -314,7 +317,8 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ (type) => type in fieldTypeNames ); - const fieldInfoUnavailable = existenceFetchFailed || currentIndexPattern.hasRestrictions; + const fieldInfoUnavailable = + existenceFetchFailed || existenceFetchTimeout || currentIndexPattern.hasRestrictions; const editPermission = indexPatternFieldEditor.userPermissions.editIndexPattern(); @@ -389,7 +393,8 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ }), isAffectedByGlobalFilter: !!filters.length, isAffectedByTimeFilter: true, - hideDetails: fieldInfoUnavailable, + // Show details on timeout but not failure + hideDetails: fieldInfoUnavailable && !existenceFetchTimeout, defaultNoFieldsMessage: i18n.translate('xpack.lens.indexPatterns.noAvailableDataLabel', { defaultMessage: `There are no available fields that contain data.`, }), @@ -438,11 +443,12 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ return fieldGroupDefinitions; }, [ allFields, - existingFields, - currentIndexPattern, hasSyncedExistingFields, fieldInfoUnavailable, filters.length, + existenceFetchTimeout, + currentIndexPattern, + existingFields, ]); const fieldGroups: FieldGroups = useMemo(() => { @@ -794,6 +800,7 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ filter={filter} currentIndexPatternId={currentIndexPatternId} existenceFetchFailed={existenceFetchFailed} + existenceFetchTimeout={existenceFetchTimeout} existFieldsInIndex={!!allFields.length} dropOntoWorkspace={dropOntoWorkspace} hasSuggestionForField={hasSuggestionForField} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx index ceeb1f5b1caf3..ee0011ad0390c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx @@ -45,6 +45,7 @@ export const FieldList = React.memo(function FieldList({ exists, fieldGroups, existenceFetchFailed, + existenceFetchTimeout, fieldProps, hasSyncedExistingFields, filter, @@ -60,6 +61,7 @@ export const FieldList = React.memo(function FieldList({ fieldProps: FieldItemSharedProps; hasSyncedExistingFields: boolean; existenceFetchFailed?: boolean; + existenceFetchTimeout?: boolean; filter: { nameFilter: string; typeFilter: string[]; @@ -194,6 +196,7 @@ export const FieldList = React.memo(function FieldList({ ); }} showExistenceFetchError={existenceFetchFailed} + showExistenceFetchTimeout={existenceFetchTimeout} renderCallout={ boolean; showExistenceFetchError?: boolean; + showExistenceFetchTimeout?: boolean; hideDetails?: boolean; groupIndex: number; dropOntoWorkspace: DatasourceDataPanelProps['dropOntoWorkspace']; @@ -73,6 +74,7 @@ export const FieldsAccordion = memo(function InnerFieldsAccordion({ exists, hideDetails, showExistenceFetchError, + showExistenceFetchTimeout, groupIndex, dropOntoWorkspace, hasSuggestionForField, @@ -133,25 +135,44 @@ export const FieldsAccordion = memo(function InnerFieldsAccordion({ }, [label, helpTooltip]); const extraAction = useMemo(() => { - return showExistenceFetchError ? ( - - ) : hasLoaded ? ( - - {fieldsCount} - - ) : ( - - ); - }, [showExistenceFetchError, hasLoaded, isFiltered, fieldsCount]); + if (showExistenceFetchError) { + return ( + + ); + } + if (showExistenceFetchTimeout) { + return ( + + ); + } + if (hasLoaded) { + return ( + + {fieldsCount} + + ); + } + + return ; + }, [showExistenceFetchError, showExistenceFetchTimeout, hasLoaded, isFiltered, fieldsCount]); return ( { foo: 'bar', isFirstExistenceFetch: false, existenceFetchFailed: false, + existenceFetchTimeout: false, existingFields: { '1': { ip1_field_1: true, ip1_field_2: true }, '2': { ip2_field_1: true, ip2_field_2: true }, @@ -957,6 +959,56 @@ describe('loader', () => { }) as IndexPatternPrivateState; expect(newState.existenceFetchFailed).toEqual(true); + expect(newState.existenceFetchTimeout).toEqual(false); + expect(newState.existingFields['1']).toEqual({ + field1: true, + field2: true, + }); + }); + + it('should set all fields to available and existence error flag if the request times out', async () => { + const setState = jest.fn(); + const fetchJson = (jest.fn((path: string) => { + return new Promise((resolve, reject) => { + reject( + new HttpFetchError( + 'timeout', + 'name', + ({} as unknown) as Request, + ({ status: 408 } as unknown) as Response + ) + ); + }); + }) as unknown) as HttpHandler; + + const args = { + dateRange: { fromDate: '1900-01-01', toDate: '2000-01-01' }, + fetchJson, + indexPatterns: [ + { + id: '1', + title: '1', + hasRestrictions: false, + fields: [{ name: 'field1' }, { name: 'field2' }] as IndexPatternField[], + }, + ], + setState, + dslQuery, + showNoDataPopover: jest.fn(), + currentIndexPatternTitle: 'abc', + isFirstExistenceFetch: false, + }; + + await syncExistingFields(args); + + const [fn] = setState.mock.calls[0]; + const newState = fn({ + foo: 'bar', + existingFields: {}, + }) as IndexPatternPrivateState; + + expect(newState.existenceFetchFailed).toEqual(false); + expect(newState.existenceFetchTimeout).toEqual(true); expect(newState.existingFields['1']).toEqual({ field1: true, field2: true, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts index ec7ef6a37a27a..0eb661e92bb1d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts @@ -445,16 +445,18 @@ export async function syncExistingFields({ ...state, isFirstExistenceFetch: false, existenceFetchFailed: false, + existenceFetchTimeout: false, existingFields: emptinessInfo.reduce((acc, info) => { acc[info.indexPatternTitle] = booleanMap(info.existingFieldNames); return acc; }, state.existingFields), })); } catch (e) { - // show all fields as available if fetch failed + // show all fields as available if fetch failed or timed out setState((state) => ({ ...state, - existenceFetchFailed: true, + existenceFetchFailed: e.res?.status !== 408, + existenceFetchTimeout: e.res?.status === 408, existingFields: indexPatterns.reduce((acc, pattern) => { acc[pattern.title] = booleanMap(pattern.fields.map((field) => field.name)); return acc; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/types.ts b/x-pack/plugins/lens/public/indexpattern_datasource/types.ts index 18f653c588ee8..98dc767c44c7d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/types.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/types.ts @@ -87,6 +87,7 @@ export interface IndexPatternPrivateState { existingFields: Record>; isFirstExistenceFetch: boolean; existenceFetchFailed?: boolean; + existenceFetchTimeout?: boolean; } export interface IndexPatternRef { diff --git a/x-pack/plugins/lens/server/routes/existing_fields.ts b/x-pack/plugins/lens/server/routes/existing_fields.ts index 2e6d612835231..d775113d83ff7 100644 --- a/x-pack/plugins/lens/server/routes/existing_fields.ts +++ b/x-pack/plugins/lens/server/routes/existing_fields.ts @@ -68,8 +68,15 @@ export async function existingFieldsRoute(setup: CoreSetup, }), }); } catch (e) { + if (e instanceof errors.TimeoutError) { + logger.info(`Field existence check timed out on ${req.params.indexPatternId}`); + // 408 is Request Timeout + return res.customError({ statusCode: 408, body: e.message }); + } logger.info( - `Field existence check failed: ${isBoomError(e) ? e.output.payload.message : e.message}` + `Field existence check failed on ${req.params.indexPatternId}: ${ + isBoomError(e) ? e.output.payload.message : e.message + }` ); if (e instanceof errors.ResponseError && e.statusCode === 404) { return res.notFound({ body: e.message }); @@ -182,31 +189,44 @@ async function fetchIndexPatternStats({ const scriptedFields = fields.filter((f) => f.isScript); const runtimeFields = fields.filter((f) => f.runtimeField); - const { body: result } = await client.search({ - index, - body: { - size: SAMPLE_SIZE, - query, - sort: timeFieldName && fromDate && toDate ? [{ [timeFieldName]: 'desc' }] : [], - fields: ['*'], - _source: false, - runtime_mappings: runtimeFields.reduce((acc, field) => { - if (!field.runtimeField) return acc; - // @ts-expect-error @elastic/elasticsearch StoredScript.language is required - acc[field.name] = field.runtimeField; - return acc; - }, {} as Record), - script_fields: scriptedFields.reduce((acc, field) => { - acc[field.name] = { - script: { - lang: field.lang!, - source: field.script!, - }, - }; - return acc; - }, {} as Record), + const { body: result } = await client.search( + { + index, + body: { + size: SAMPLE_SIZE, + query, + // Sorted queries are usually able to skip entire shards that don't match + sort: timeFieldName && fromDate && toDate ? [{ [timeFieldName]: 'desc' }] : [], + fields: ['*'], + _source: false, + runtime_mappings: runtimeFields.reduce((acc, field) => { + if (!field.runtimeField) return acc; + // @ts-expect-error @elastic/elasticsearch StoredScript.language is required + acc[field.name] = field.runtimeField; + return acc; + }, {} as Record), + script_fields: scriptedFields.reduce((acc, field) => { + acc[field.name] = { + script: { + lang: field.lang!, + source: field.script!, + }, + }; + return acc; + }, {} as Record), + // Small improvement because there is overhead in counting + track_total_hits: false, + // Per-shard timeout, must be lower than overall. Shards return partial results on timeout + timeout: '4500ms', + }, }, - }); + { + // Global request timeout. Will cancel the request if exceeded. Overrides the elasticsearch.requestTimeout + requestTimeout: '5000ms', + // Fails fast instead of retrying- default is to retry + maxRetries: 0, + } + ); return result.hits.hits; } From 9cf66a78e9a7cfd4de042665826f0e81ce5ad7e1 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Mon, 19 Apr 2021 15:54:54 -0700 Subject: [PATCH 65/82] [Docs][Alerting] Changed overall alerting documentation structure (#95004) * [Docs][Alerting] Changed overall alerting documentation structure * fixed image link * moved alerting and connectors under the graph in the menu list * moved management docs to alerting and connectors * fixed image link * fixed connector menu position * fixed mappings * fixed mappings * fixed links * fixed levels * move manage connectors before action types * adjust connectors management * adjust connectors management * split domain specific and stack rules * fixed rule types links * added connectors ui images * fixed image links * fixed image links * fixed image links * test * fixed image links * fixed broken links * fixed broken links * fixed email links * fixed email links * fixed email links * fixed links * added images to connectors docs * Update docs/user/alerting/rule-management.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update docs/user/alerting/stack-rules.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * fixed due to comments * fixed due to comments * fixed create connector * moved connectors to stack management section * removed bazel files * fixed managing-alerts-and-actions links * Revert "fixed managing-alerts-and-actions links" This reverts commit 0ed228b09053f9dda084d83aa8ed4174b3c2cd88. * fixed code owners Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 2 +- docs/management/action-types.asciidoc | 117 ++++++++++++++++++ .../alerting/connector-management.asciidoc | 40 ------ .../rules-and-connectors-intro.asciidoc | 29 ----- .../connectors}/action-types/email.asciidoc | 24 +++- .../connectors}/action-types/index.asciidoc | 14 +++ .../connectors}/action-types/jira.asciidoc | 15 +++ .../action-types/pagerduty.asciidoc | 20 ++- .../action-types/resilient.asciidoc | 15 +++ .../action-types/server-log.asciidoc | 14 +++ .../action-types/servicenow.asciidoc | 15 +++ .../connectors}/action-types/slack.asciidoc | 15 +++ .../connectors}/action-types/teams.asciidoc | 15 +++ .../connectors}/action-types/webhook.asciidoc | 14 +++ .../images/connector-action-count.png | Bin .../images/connector-delete.png | Bin .../images/connector-filter-by-search.png | Bin .../images/connector-filter-by-type.png | Bin .../images/connector-listing.png | Bin .../images/connector-select-type.png | Bin 0 -> 327833 bytes .../connectors/images/email-connector.png | Bin 0 -> 188529 bytes .../connectors/images/email-params-test.png | Bin 0 -> 173053 bytes .../connectors/images/index-connector.png | Bin 0 -> 157290 bytes .../connectors/images/index-params-test.png | Bin 0 -> 157008 bytes .../connectors/images/jira-connector.png | Bin 0 -> 158772 bytes .../connectors/images/jira-params-test.png | Bin 0 -> 186073 bytes .../connectors/images/pagerduty-connector.png | Bin 0 -> 136276 bytes .../images/pagerduty-integration.png | Bin .../images/pagerduty-params-test.png | Bin 0 -> 188743 bytes .../pre-configured-connectors-managing.png | Bin .../pre-configured-connectors-view-screen.png | Bin .../connectors/images/resilient-connector.png | Bin 0 -> 152361 bytes .../images/resilient-params-test.png | Bin 0 -> 184380 bytes .../connectors/images/serverlog-connector.png | Bin 0 -> 68666 bytes .../images/serverlog-params-test.png | Bin 0 -> 120530 bytes .../images/servicenow-connector.png | Bin 0 -> 158511 bytes .../images/servicenow-params-test.png | Bin 0 -> 184611 bytes .../images/servicenow-sir-connector.png | Bin 0 -> 159898 bytes .../images/servicenow-sir-params-test.png | Bin 0 -> 190659 bytes .../images/slack-add-webhook-integration.png | Bin .../connectors/images/slack-connector.png | Bin 0 -> 123918 bytes .../images/slack-copy-webhook-url.png | Bin .../connectors/images/slack-params-test.png | Bin 0 -> 109474 bytes .../images/teams-add-webhook-integration.png | Bin .../connectors/images/teams-connector.png | Bin 0 -> 148549 bytes .../images/teams-copy-webhook-url.png | Bin .../connectors/images/teams-params-test.png | Bin 0 -> 144338 bytes .../connectors/images/webhook-connector.png | Bin 0 -> 193110 bytes .../connectors/images/webhook-params-test.png | Bin 0 -> 143209 bytes docs/management/connectors/index.asciidoc | 11 ++ .../pre-configured-connectors.asciidoc | 1 - .../images/rules-and-connectors-ui.png | Bin docs/user/alerting/action-types.asciidoc | 75 ----------- .../alerting-getting-started.asciidoc | 4 +- .../alerting/domain-specific-rules.asciidoc | 20 +++ .../alerting/images/bulk-mute-disable.png | Bin .../alerting/images/follower_indices.png | Bin .../images/individual-mute-disable.png | Bin .../images/rule-details-alert-muting.png | Bin .../images/rule-details-alerts-active.png | Bin .../images/rule-details-alerts-inactive.png | Bin .../images/rule-details-disabling.png | Bin .../alerting/images/rule-details-muting.png | Bin .../images/rules-and-connectors-ui.png | Bin 0 -> 281417 bytes .../images/rules-filter-by-action-type.png | Bin .../images/rules-filter-by-search.png | Bin .../alerting/images/rules-filter-by-type.png | Bin docs/user/alerting/index.asciidoc | 6 +- .../alerting/rule-details.asciidoc | 2 +- .../alerting/rule-management.asciidoc | 21 ++-- ...le-types.asciidoc => stack-rules.asciidoc} | 21 +--- docs/user/index.asciidoc | 4 +- docs/user/management.asciidoc | 20 ++- docs/user/monitoring/kibana-alerts.asciidoc | 2 +- .../public/doc_links/doc_links_service.ts | 4 +- .../public/application/home.test.tsx | 2 +- 76 files changed, 338 insertions(+), 204 deletions(-) create mode 100644 docs/management/action-types.asciidoc delete mode 100644 docs/management/alerting/connector-management.asciidoc delete mode 100644 docs/management/alerting/rules-and-connectors-intro.asciidoc rename docs/{user/alerting => management/connectors}/action-types/email.asciidoc (93%) rename docs/{user/alerting => management/connectors}/action-types/index.asciidoc (92%) rename docs/{user/alerting => management/connectors}/action-types/jira.asciidoc (86%) rename docs/{user/alerting => management/connectors}/action-types/pagerduty.asciidoc (93%) rename docs/{user/alerting => management/connectors}/action-types/resilient.asciidoc (85%) rename docs/{user/alerting => management/connectors}/action-types/server-log.asciidoc (72%) rename docs/{user/alerting => management/connectors}/action-types/servicenow.asciidoc (86%) rename docs/{user/alerting => management/connectors}/action-types/slack.asciidoc (86%) rename docs/{user/alerting => management/connectors}/action-types/teams.asciidoc (88%) rename docs/{user/alerting => management/connectors}/action-types/webhook.asciidoc (88%) rename docs/management/{alerting => connectors}/images/connector-action-count.png (100%) rename docs/management/{alerting => connectors}/images/connector-delete.png (100%) rename docs/management/{alerting => connectors}/images/connector-filter-by-search.png (100%) rename docs/management/{alerting => connectors}/images/connector-filter-by-type.png (100%) rename docs/management/{alerting => connectors}/images/connector-listing.png (100%) create mode 100644 docs/management/connectors/images/connector-select-type.png create mode 100644 docs/management/connectors/images/email-connector.png create mode 100644 docs/management/connectors/images/email-params-test.png create mode 100644 docs/management/connectors/images/index-connector.png create mode 100644 docs/management/connectors/images/index-params-test.png create mode 100644 docs/management/connectors/images/jira-connector.png create mode 100644 docs/management/connectors/images/jira-params-test.png create mode 100644 docs/management/connectors/images/pagerduty-connector.png rename docs/{user/alerting => management/connectors}/images/pagerduty-integration.png (100%) create mode 100644 docs/management/connectors/images/pagerduty-params-test.png rename docs/{user/alerting => management/connectors}/images/pre-configured-connectors-managing.png (100%) rename docs/{user/alerting => management/connectors}/images/pre-configured-connectors-view-screen.png (100%) create mode 100644 docs/management/connectors/images/resilient-connector.png create mode 100644 docs/management/connectors/images/resilient-params-test.png create mode 100644 docs/management/connectors/images/serverlog-connector.png create mode 100644 docs/management/connectors/images/serverlog-params-test.png create mode 100644 docs/management/connectors/images/servicenow-connector.png create mode 100644 docs/management/connectors/images/servicenow-params-test.png create mode 100644 docs/management/connectors/images/servicenow-sir-connector.png create mode 100644 docs/management/connectors/images/servicenow-sir-params-test.png rename docs/{user/alerting => management/connectors}/images/slack-add-webhook-integration.png (100%) create mode 100644 docs/management/connectors/images/slack-connector.png rename docs/{user/alerting => management/connectors}/images/slack-copy-webhook-url.png (100%) create mode 100644 docs/management/connectors/images/slack-params-test.png rename docs/{user/alerting => management/connectors}/images/teams-add-webhook-integration.png (100%) create mode 100644 docs/management/connectors/images/teams-connector.png rename docs/{user/alerting => management/connectors}/images/teams-copy-webhook-url.png (100%) create mode 100644 docs/management/connectors/images/teams-params-test.png create mode 100644 docs/management/connectors/images/webhook-connector.png create mode 100644 docs/management/connectors/images/webhook-params-test.png create mode 100644 docs/management/connectors/index.asciidoc rename docs/{user/alerting/action-types => management/connectors}/pre-configured-connectors.asciidoc (99%) rename docs/management/{alerting => }/images/rules-and-connectors-ui.png (100%) delete mode 100644 docs/user/alerting/action-types.asciidoc create mode 100644 docs/user/alerting/domain-specific-rules.asciidoc rename docs/{management => user}/alerting/images/bulk-mute-disable.png (100%) rename docs/{management => user}/alerting/images/follower_indices.png (100%) rename docs/{management => user}/alerting/images/individual-mute-disable.png (100%) rename docs/{management => user}/alerting/images/rule-details-alert-muting.png (100%) rename docs/{management => user}/alerting/images/rule-details-alerts-active.png (100%) rename docs/{management => user}/alerting/images/rule-details-alerts-inactive.png (100%) rename docs/{management => user}/alerting/images/rule-details-disabling.png (100%) rename docs/{management => user}/alerting/images/rule-details-muting.png (100%) create mode 100644 docs/user/alerting/images/rules-and-connectors-ui.png rename docs/{management => user}/alerting/images/rules-filter-by-action-type.png (100%) rename docs/{management => user}/alerting/images/rules-filter-by-search.png (100%) rename docs/{management => user}/alerting/images/rules-filter-by-type.png (100%) rename docs/{management => user}/alerting/rule-details.asciidoc (99%) rename docs/{management => user}/alerting/rule-management.asciidoc (74%) rename docs/user/alerting/{rule-types.asciidoc => stack-rules.asciidoc} (58%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0692e94e8b028..cae64a24ec2cd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -272,7 +272,7 @@ /x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/ @elastic/kibana-alerting-services /x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/ @elastic/kibana-alerting-services /docs/user/alerting/ @elastic/kibana-alerting-services -/docs/management/alerting/ @elastic/kibana-alerting-services +/docs/management/connectors/ @elastic/kibana-alerting-services #CC# /x-pack/plugins/stack_alerts @elastic/kibana-alerting-services # Enterprise Search diff --git a/docs/management/action-types.asciidoc b/docs/management/action-types.asciidoc new file mode 100644 index 0000000000000..4d6dcb631792e --- /dev/null +++ b/docs/management/action-types.asciidoc @@ -0,0 +1,117 @@ +[role="xpack"] +[[action-types]] +== Connectors + +Connectors provide a central place to store connection information for services and integrations with third party systems. Actions are instantiations of a connector that are linked to rules and run as background tasks on the {kib} server when rule conditions are met. {kib} provides the following types of connectors: + +[cols="2"] +|=== + +a| <> + +| Send email from your server. + +a| <> + +| Create an incident in IBM Resilient. + +a| <> + +| Index data into Elasticsearch. + +a| <> + +| Create an incident in Jira. + +a| <> + +| Send a message to a Microsoft Teams channel. + +a| <> + +| Send an event in PagerDuty. + +a| <> + +| Add a message to a Kibana log. + +a| <> + +| Create an incident in ServiceNow. + +a| <> + +| Send a message to a Slack channel or user. + +a| <> + +| Send a request to a web service. +|=== + +[NOTE] +============================================== +Some connector types are paid commercial features, while others are free. +For a comparison of the Elastic subscription levels, +see https://www.elastic.co/subscriptions[the subscription page]. +============================================== + +[float] +[[connector-management]] +=== Managing Connectors + +Rules use *Connectors* to route actions to different destinations like log files, ticketing systems, and messaging tools. While each {kib} app can offer their own types of rules, they typically share connectors. The *Connectors* tab offers a central place to view and manage all the connectors in the current space. + +For more information on connectors and the types of actions available see <>. + +[role="screenshot"] +image::images/connector-listing.png[Example connector listing in the Rules and Connectors UI] + +[float] +=== Required permissions + +Access to connectors is granted based on your privileges to alerting-enabled features. See <> for more information. + +[float] +[[connectors-list]] +=== Connector list + +The *Connectors* tab lists all connectors in the current space. The *search bar* can be used to find specific connectors by name and/or type. + +[role="screenshot"] +image::images/connector-filter-by-search.png[Filtering the connector list using the search bar] + + +The *type* dropdown also lets you filter to a subset of connector types. + +[role="screenshot"] +image::images/connector-filter-by-type.png[Filtering the connector list by types of connectors] + +You can delete individual connectors using the trash icon. Connectors can also be deleted in bulk by multi-selecting them and clicking the *Delete* button to the left of the search box. + +[role="screenshot"] +image::images/connector-delete.png[Deleting connectors individually or in bulk] + +[NOTE] +============================================================================ +You can delete a connector even if there are still actions referencing it. +When this happens the action will fail to execute, and appear as errors in the {kib} logs. +============================================================================ + +[float] +[[creating-new-connector]] +=== Creating a new connector + +New connectors can be created by clicking the *Create connector* button, which will guide you to select the type of connector and configure its properties. Refer to <> for the types of connectors available and how to configure them. Once you create a connector it will be made available to you anytime you set up an action in the current space. + +[role="screenshot"] +image::images/connector-select-type.png[Connector select type] + +[float] +[[create-connectors]] +=== Preconfigured connectors + +For out-of-the-box and standardized connectors, you can <> +before {kib} starts. + + +include::connectors/index.asciidoc[] diff --git a/docs/management/alerting/connector-management.asciidoc b/docs/management/alerting/connector-management.asciidoc deleted file mode 100644 index dd3b5209ed4a0..0000000000000 --- a/docs/management/alerting/connector-management.asciidoc +++ /dev/null @@ -1,40 +0,0 @@ -[role="xpack"] -[[connector-management]] -=== Managing Connectors - -Rules use *Connectors* to route actions to different destinations like log files, ticketing systems, and messaging tools. While each {kib} app can offer their own types of rules, they typically share connectors. The *Connectors* tab offers a central place to view and manage all the connectors in the current space. - -For more information on connectors and the types of actions available see <>. - -[role="screenshot"] -image::images/connector-listing.png[Example connector listing in the Rules and Connectors UI] - - -[float] -==== Connector list - -The *Connectors* tab lists all connectors in the current space. The *search bar* can be used to find specific connectors by name and/or type. - -[role="screenshot"] -image::images/connector-filter-by-search.png[Filtering the connector list using the search bar] - - -The *type* dropdown also lets you filter to a subset of connector types. - -[role="screenshot"] -image::images/connector-filter-by-type.png[Filtering the connector list by types of connectors] - -You can delete individual connectors using the trash icon. Connectors can also be deleted in bulk by multi-selecting them and clicking the *Delete* button to the left of the search box. - -[role="screenshot"] -image::images/connector-delete.png[Deleting connectors individually or in bulk] - -[NOTE] -============================================================================ -You can delete a connector even if there are still actions referencing it. -When this happens the action will fail to execute, and appear as errors in the {kib} logs. -============================================================================ - -==== Creating a new connector - -New connectors can be created by clicking the *Create connector* button, which will guide you to select the type of connector and configure its properties. Refer to <> for the types of connectors available and how to configure them. Once you create a connector it will be made available to you anytime you set up an action in the current space. diff --git a/docs/management/alerting/rules-and-connectors-intro.asciidoc b/docs/management/alerting/rules-and-connectors-intro.asciidoc deleted file mode 100644 index 6e23ca95e2266..0000000000000 --- a/docs/management/alerting/rules-and-connectors-intro.asciidoc +++ /dev/null @@ -1,29 +0,0 @@ -[role="xpack"] -[[managing-alerts-and-actions]] -== Rules and Connectors - - -The *Rules and Connectors* UI lets you <> in a space, and provides tools to <> so that rules can trigger actions like notification, indexing, and ticketing. - -To manage rules and connectors, open the main menu, then click *Stack Management > Alerts and Insights > Rules and Connectors*. - -[role="screenshot"] -image:management/alerting/images/rules-and-connectors-ui.png[Example rule listing in the Rules and Connectors UI] - -[NOTE] -============================================================================ -Similar to dashboards, rules and connectors reside in a <>. -The *Rules and Connectors* UI only shows rules and connectors for the current space. -============================================================================ - -[NOTE] -============================================================================ -{es} also offers alerting capabilities through Watcher, which -can be managed through the <>. See -<> for more information. -============================================================================ - -[float] -=== Required permissions - -Access to rules and connectors is granted based on your privileges to alerting-enabled features. See <> for more information. diff --git a/docs/user/alerting/action-types/email.asciidoc b/docs/management/connectors/action-types/email.asciidoc similarity index 93% rename from docs/user/alerting/action-types/email.asciidoc rename to docs/management/connectors/action-types/email.asciidoc index 58f1300d0c287..1c2f9212b4887 100644 --- a/docs/user/alerting/action-types/email.asciidoc +++ b/docs/management/connectors/action-types/email.asciidoc @@ -25,7 +25,7 @@ Username:: Username for login type authentication. Password:: Password for login type authentication. [float] -[[Preconfigured-email-configuration]] +[[preconfigured-email-configuration]] ==== Preconfigured connector type [source,text] @@ -57,6 +57,19 @@ Secrets defines sensitive information for the connector type. `user`:: A string that corresponds to *Username*. Required if `hasAuth` is set to `true`. `password`:: A string that corresponds to *Password*. Should be stored in the <>. Required if `hasAuth` is set to `true`. +[float] +[[define-email-ui]] +==== Define connector in Stack Management + +Define email connector properties. + +[role="screenshot"] +image::management/connectors/images/email-connector.png[Email connector] + +Test email action parameters. + +[role="screenshot"] +image::management/connectors/images/email-params-test.png[Email params test] [float] [[email-action-configuration]] @@ -68,6 +81,7 @@ To, CC, BCC:: Each item is a list of addresses. Addresses can be specified in Subject:: The subject line of the email. Message:: The message text of the email. Markdown format is supported. +[float] [[configuring-email]] ==== Configuring email accounts for well-known services @@ -84,7 +98,7 @@ For other email servers, you can check the list of well-known services that Node [float] [[gmail]] -===== Sending email from Gmail +==== Sending email from Gmail Use the following email connector configuration to send email from the https://mail.google.com[Gmail] SMTP service: @@ -112,7 +126,7 @@ for more information. [float] [[outlook]] -===== Sending email from Outlook.com +==== Sending email from Outlook.com Use the following email connector configuration to send email from the https://www.outlook.com/[Outlook.com] SMTP service: @@ -137,7 +151,7 @@ NOTE: You must use a unique App Password if two-step verification is enabled. [float] [[amazon-ses]] -===== Sending email from Amazon SES (Simple Email Service) +==== Sending email from Amazon SES (Simple Email Service) Use the following email connector configuration to send email from the http://aws.amazon.com/ses[Amazon Simple Email Service] (SES) SMTP service: @@ -164,7 +178,7 @@ NOTE: You must use your Amazon SES SMTP credentials to send email through [float] [[exchange]] -===== Sending email from Microsoft Exchange +==== Sending email from Microsoft Exchange Use the following email connector configuration to send email from Microsoft Exchange: diff --git a/docs/user/alerting/action-types/index.asciidoc b/docs/management/connectors/action-types/index.asciidoc similarity index 92% rename from docs/user/alerting/action-types/index.asciidoc rename to docs/management/connectors/action-types/index.asciidoc index e23dcbf298fd5..d3bd3d431748c 100644 --- a/docs/user/alerting/action-types/index.asciidoc +++ b/docs/management/connectors/action-types/index.asciidoc @@ -39,6 +39,20 @@ Config defines information for the connector type. `refresh`:: A boolean that corresponds to *Refresh*. Defaults to `false`. `executionTimeField`:: A string that corresponds to *Execution time field*. +[float] +[[define-index-ui]] +==== Define connector in Stack Management + +Define Index connector properties. + +[role="screenshot"] +image::management/connectors/images/index-connector.png[Index connector] + +Test Index action parameters. + +[role="screenshot"] +image::management/connectors/images/index-params-test.png[Index params test] + [float] [[index-action-configuration]] ==== Action configuration diff --git a/docs/user/alerting/action-types/jira.asciidoc b/docs/management/connectors/action-types/jira.asciidoc similarity index 86% rename from docs/user/alerting/action-types/jira.asciidoc rename to docs/management/connectors/action-types/jira.asciidoc index 7b4dc69bb639a..a5e629887d5c6 100644 --- a/docs/user/alerting/action-types/jira.asciidoc +++ b/docs/management/connectors/action-types/jira.asciidoc @@ -46,6 +46,20 @@ Secrets defines sensitive information for the connector type. `email`:: A string that corresponds to *Email*. `apiToken`:: A string that corresponds to *API Token*. Should be stored in the <>. +[float] +[[define-jira-ui]] +==== Define connector in Stack Management + +Define Jira connector properties. + +[role="screenshot"] +image::management/connectors/images/jira-connector.png[Jira connector] + +Test Jira action parameters. + +[role="screenshot"] +image::management/connectors/images/jira-params-test.png[Jira params test] + [float] [[jira-action-configuration]] ==== Action configuration @@ -60,6 +74,7 @@ Description:: The details about the incident. Parent:: The ID or key of the parent issue. Only for `Subtask` issue types. Additional comments:: Additional information for the client, such as how to troubleshoot the issue. +[float] [[configuring-jira]] ==== Configure Jira diff --git a/docs/user/alerting/action-types/pagerduty.asciidoc b/docs/management/connectors/action-types/pagerduty.asciidoc similarity index 93% rename from docs/user/alerting/action-types/pagerduty.asciidoc rename to docs/management/connectors/action-types/pagerduty.asciidoc index c32e6c8a6635f..25cba05010548 100644 --- a/docs/user/alerting/action-types/pagerduty.asciidoc +++ b/docs/management/connectors/action-types/pagerduty.asciidoc @@ -40,6 +40,20 @@ Secrets defines sensitive information for the connector type. `routingKey`:: A string that corresponds to *Integration Key*. +[float] +[[define-pagerduty-ui]] +==== Define connector in Stack Management + +Define PagerDuty connector properties. + +[role="screenshot"] +image::management/connectors/images/pagerduty-connector.png[PagerDuty connector] + +Test PagerDuty action parameters. + +[role="screenshot"] +image::management/connectors/images/pagerduty-params-test.png[PagerDuty params test] + [float] [[pagerduty-action-configuration]] ==== Action configuration @@ -70,14 +84,14 @@ By integrating PagerDuty with rules, you can: [float] [[pagerduty-support]] -===== Support +==== Support If you need help with this integration, get in touch with the {kib} team by visiting https://support.elastic.co[support.elastic.co] or by using the *Ask Elastic* option in the {kib} Help menu. You can also select the {kib} category at https://discuss.elastic.co/[discuss.elastic.co]. [float] [[pagerduty-integration-walkthrough]] -===== Integration with PagerDuty walkthrough +==== Integration with PagerDuty walkthrough [[pagerduty-in-pagerduty]] *In PagerDuty* @@ -101,7 +115,7 @@ and select *Elastic Alerts* from the *Integration Type* menu. You will be redirected to the *Integrations* tab for your service. An Integration Key is generated on this screen. + [role="screenshot"] -image::user/alerting/images/pagerduty-integration.png[PagerDuty Integrations tab] +image::images/pagerduty-integration.png[PagerDuty Integrations tab] . Save this key, as you will use it when you configure the integration with Elastic in the next section. diff --git a/docs/user/alerting/action-types/resilient.asciidoc b/docs/management/connectors/action-types/resilient.asciidoc similarity index 85% rename from docs/user/alerting/action-types/resilient.asciidoc rename to docs/management/connectors/action-types/resilient.asciidoc index 862af0e526337..454ae145bbc57 100644 --- a/docs/user/alerting/action-types/resilient.asciidoc +++ b/docs/management/connectors/action-types/resilient.asciidoc @@ -46,6 +46,20 @@ Secrets defines sensitive information for the connector type. `apiKeyId`:: A string that corresponds to *API key ID*. `apiKeySecret`:: A string that corresponds to *API Key secret*. Should be stored in the <>. +[float] +[[define-resilient-ui]] +==== Define connector in Stack Management + +Define IBM Resilient connector properties. + +[role="screenshot"] +image::management/connectors/images/resilient-connector.png[IBM Resilient connector] + +Test IBM Resilient action parameters. + +[role="screenshot"] +image::management/connectors/images/resilient-params-test.png[IBM Resilient params test] + [float] [[resilient-action-configuration]] ==== Action configuration @@ -58,6 +72,7 @@ Name:: A name for the issue, used for searching the contents of the knowledge ba Description:: The details about the incident. Additional comments:: Additional information for the client, such as how to troubleshoot the issue. +[float] [[configuring-resilient]] ==== Configure IBM Resilient diff --git a/docs/user/alerting/action-types/server-log.asciidoc b/docs/management/connectors/action-types/server-log.asciidoc similarity index 72% rename from docs/user/alerting/action-types/server-log.asciidoc rename to docs/management/connectors/action-types/server-log.asciidoc index e497ed3a4467a..0810724d39ead 100644 --- a/docs/user/alerting/action-types/server-log.asciidoc +++ b/docs/management/connectors/action-types/server-log.asciidoc @@ -26,6 +26,20 @@ Name:: The name of the connector. The name is used to identify a connector actionTypeId: .server-log -- +[float] +[[define-serverlog-ui]] +==== Define connector in Stack Management + +Define Server log connector properties. + +[role="screenshot"] +image::management/connectors/images/serverlog-connector.png[Server log connector] + +Test Server log action parameters. + +[role="screenshot"] +image::management/connectors/images/serverlog-params-test.png[Server log params test] + [float] [[server-log-action-configuration]] ==== Action configuration diff --git a/docs/user/alerting/action-types/servicenow.asciidoc b/docs/management/connectors/action-types/servicenow.asciidoc similarity index 86% rename from docs/user/alerting/action-types/servicenow.asciidoc rename to docs/management/connectors/action-types/servicenow.asciidoc index 35d50f1bfeb72..24892c62e804b 100644 --- a/docs/user/alerting/action-types/servicenow.asciidoc +++ b/docs/management/connectors/action-types/servicenow.asciidoc @@ -43,6 +43,20 @@ Secrets defines sensitive information for the connector type. `username`:: A string that corresponds to *Username*. `password`:: A string that corresponds to *Password*. Should be stored in the <>. +[float] +[[define-servicenow-ui]] +==== Define connector in Stack Management + +Define ServiceNow connector properties. + +[role="screenshot"] +image::management/connectors/images/servicenow-connector.png[ServiceNow connector] + +Test ServiceNow action parameters. + +[role="screenshot"] +image::management/connectors/images/servicenow-params-test.png[ServiceNow params test] + [float] [[servicenow-action-configuration]] ==== Action configuration @@ -56,6 +70,7 @@ Short description:: A short description for the incident, used for searching Description:: The details about the incident. Additional comments:: Additional information for the client, such as how to troubleshoot the issue. +[float] [[configuring-servicenow]] ==== Configure ServiceNow diff --git a/docs/user/alerting/action-types/slack.asciidoc b/docs/management/connectors/action-types/slack.asciidoc similarity index 86% rename from docs/user/alerting/action-types/slack.asciidoc rename to docs/management/connectors/action-types/slack.asciidoc index 3ef369e2a4e4a..da0bf321f9ade 100644 --- a/docs/user/alerting/action-types/slack.asciidoc +++ b/docs/management/connectors/action-types/slack.asciidoc @@ -33,6 +33,20 @@ Secrets defines sensitive information for the connector type. `webhookUrl`:: A string that corresponds to *Webhook URL*. +[float] +[[define-slack-ui]] +==== Define connector in Stack Management + +Define Slack connector properties. + +[role="screenshot"] +image::management/connectors/images/slack-connector.png[Slack connector] + +Test Slack action parameters. + +[role="screenshot"] +image::management/connectors/images/slack-params-test.png[Slack params test] + [float] [[slack-action-configuration]] ==== Action configuration @@ -41,6 +55,7 @@ Slack actions have the following properties. Message:: The message text, converted to the `text` field in the Webhook JSON payload. Currently only the text field is supported. Markdown, images, and other advanced formatting are not yet supported. +[float] [[configuring-slack]] ==== Configure a Slack account diff --git a/docs/user/alerting/action-types/teams.asciidoc b/docs/management/connectors/action-types/teams.asciidoc similarity index 88% rename from docs/user/alerting/action-types/teams.asciidoc rename to docs/management/connectors/action-types/teams.asciidoc index 1a0e52141ee9c..ba723a6f33c86 100644 --- a/docs/user/alerting/action-types/teams.asciidoc +++ b/docs/management/connectors/action-types/teams.asciidoc @@ -33,6 +33,20 @@ Secrets defines sensitive information for the connector type. `webhookUrl`:: A string that corresponds to *Webhook URL*. +[float] +[[define-teams-ui]] +==== Define connector in Stack Management + +Define Teams connector properties. + +[role="screenshot"] +image::management/connectors/images/teams-connector.png[Teams connector] + +Test Teams action parameters. + +[role="screenshot"] +image::management/connectors/images/teams-params-test.png[Teams params test] + [float] [[teams-action-configuration]] ==== Action configuration @@ -41,6 +55,7 @@ Microsoft Teams actions have the following properties. Message:: The message text, converted to the `text` field in the Webhook JSON payload. Currently only the text field is supported. Markdown, images, and other advanced formatting are not yet supported. +[float] [[configuring-teams]] ==== Configure a Microsoft Teams account diff --git a/docs/user/alerting/action-types/webhook.asciidoc b/docs/management/connectors/action-types/webhook.asciidoc similarity index 88% rename from docs/user/alerting/action-types/webhook.asciidoc rename to docs/management/connectors/action-types/webhook.asciidoc index 01ddfee288fc8..a2024b9457a1c 100644 --- a/docs/user/alerting/action-types/webhook.asciidoc +++ b/docs/management/connectors/action-types/webhook.asciidoc @@ -52,6 +52,20 @@ Secrets defines sensitive information for the connector type. `user`:: A string that corresponds to *User*. Required if `hasAuth` is set to `true`. `password`:: A string that corresponds to *Password*. Should be stored in the <>. Required if `hasAuth` is set to `true`. +[float] +[[define-webhook-ui]] +==== Define connector in Stack Management + +Define Webhook connector properties. + +[role="screenshot"] +image::management/connectors/images/webhook-connector.png[Webhook connector] + +Test Webhook action parameters. + +[role="screenshot"] +image::management/connectors/images/webhook-params-test.png[Webhook params test] + [float] [[webhook-action-configuration]] ==== Action configuration diff --git a/docs/management/alerting/images/connector-action-count.png b/docs/management/connectors/images/connector-action-count.png similarity index 100% rename from docs/management/alerting/images/connector-action-count.png rename to docs/management/connectors/images/connector-action-count.png diff --git a/docs/management/alerting/images/connector-delete.png b/docs/management/connectors/images/connector-delete.png similarity index 100% rename from docs/management/alerting/images/connector-delete.png rename to docs/management/connectors/images/connector-delete.png diff --git a/docs/management/alerting/images/connector-filter-by-search.png b/docs/management/connectors/images/connector-filter-by-search.png similarity index 100% rename from docs/management/alerting/images/connector-filter-by-search.png rename to docs/management/connectors/images/connector-filter-by-search.png diff --git a/docs/management/alerting/images/connector-filter-by-type.png b/docs/management/connectors/images/connector-filter-by-type.png similarity index 100% rename from docs/management/alerting/images/connector-filter-by-type.png rename to docs/management/connectors/images/connector-filter-by-type.png diff --git a/docs/management/alerting/images/connector-listing.png b/docs/management/connectors/images/connector-listing.png similarity index 100% rename from docs/management/alerting/images/connector-listing.png rename to docs/management/connectors/images/connector-listing.png diff --git a/docs/management/connectors/images/connector-select-type.png b/docs/management/connectors/images/connector-select-type.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5825b14931126ca39048e7b75921fd775b36ae GIT binary patch literal 327833 zcmb@uc|25o`v)#X*%cvcsyk&D89Sv?36*TwLdZJy!5C7Z2yK?Em5_a3#|)X6yM&N+ z%#0=LV8$|wWoCZI{XF;ceO|v`x96YVyk6rR=X}m*xvuMTE${0(^X#Un5f7&*CkqP; z&$X+UZnLl)i~zoEhuDEDvhnf=78cG44@1M7*9;Ah-wXh|d3d|Buv~qXl6LTpxrfk0 zCe=ZULqVGL_C@fcAl9oK@7Zp?;QesqmBGbl(rib?WFK=Tu^l}ue^N{K!@XniBm7+T z7pkcHjvaUtTzSv1Tkjr+YK=Rj7Z=DFCytLZQ<*Ky>}{5Jm;C;C0jH#?EC|DpJWWw-U2SBH_0&zZyvJq^Gga(})$eAraX_4({4GjBC9*Fcs- z_Z6)&_OXl}u2WqLJ@!C6K=50VGxF;5fPLSPI?`#$=Q4zEeEs?s)V}|WZ64zY%Neyd zZ#|;o->#<7Jc?;{zOnJ>EzzSF-(5ZZbyjglKY2FF*tFhRC+?5tKQDSbP%94ZTZg_l zuVmLTReS8^wER@^R&w>t!=j)bonzWzS)1c+euKEBV~3}+6gg)bx3 zkVCDkRr8x}QTOto6BQ@qOkIUJHHvAQ?ITb8djvXqMci#HZ_u9b*}A65ey|{OeUaWL z5cb#tG506qXT{UJF*)JR*y8Xx)1ONGHK(1w9kHleWsANbpyw|e^-RYg#rTy({+jUp zxKB&fEh2*snp=LRONqC$olb+~J+m$xIJA$O|6p~r_|<*F2lgN4-ydyPX`t874b8d# z{>~feH>%e2i2}+R&N(Q-*qXc=0hW_g$kNMDBPm20KYj6ukL!6BJ()MxXTEaSj+n3{ z6|fo<=T_SEvK!P0KkO1d9fDQuGx+&aC}uZRh<2#@UiD$jtAn zXgf}0iIqOoZYcPabKyeg3%2_QH4Sh4Da`rk#JdM)IIhQ>JFfEap^%~6`y-zOiywv< z4*s|`e;|mrnKjse@4ezDsc^x<^wfqRA{M{+n-orJ`B(d{*p+#13?aa@zZewub{ zQjf$Y0!im-isKxukK*_rev%IQa-hm6{gBwRORruAU5b~#9RKp%N6wjvX1ub7mhb>cbyWN9GVK5SoBk9H~0lC`M(`H$l-pd;Sl19(}&Z2kLE8w zKehIZ>lxu0^jY^8u`iNS%GVO^UtW{$cy;bt*R`3Ccl$5*3-oKBKY!l*yjk5_&l7d5 zbpdrJJ<|r8f9k!i`&xfrT{EWic*RMgOv4MQSNL0J1dZeM|9E?%ur%+Ed5?L{ExjW1 zL5ZK5ixFhk#gs*!#fG1bUi|0f)vQGW)z;2`Q%mw1{~_|@l;>T~>hnz*#^>eEn?1k{ zi}!!<)bzOQIrE@wQ0r6hdJze%BBz?$K>}TJQ|KPJ>n|J0#fp-gEC;d=Z5D!;}>C#2$lJu@qsB5Ly9$oV~ zJ!sl|ej#t=zI~K^v~QJf_KH1LDV!T|93hWL3{MOf^!2*jVQpY)aAs*gg? zfdf{5xxAJ-*2Z4X-p8K6O%bsJiJVhA$F1^4#8*`Zta0xWXbtpDZOl8U^AkSZbID8o z9L_spi1vqJ+-K+es^5+Yi#$Hfe)|1s&ezz}%coHVmIeL=ayJM!ax-3jPj_2z%j~|} z&EB2ZU6`q)UZE0o|3dA(yN49&@7CHx)YewtsI+q(eK6{t@6}QDt)aLo+}WgxQqxmc zUX65lT;nu$e{`v`$%6~iJj&@K=K~)39I_H}0xl6EVP0vjQ~0#-j!6^PtloWeZghAA zqWMGOgt(=KnpR7Wr{4Ln#m*uh^H%L9+64WIND8A*`Vg~cU_apCj6t=}wTOXc*bP{t9vr3xJBBPm>TiZ@y`}ln zi+6IiGdI`i)JN&EUAZaqx)R-zmUF+P4opsUhkAa%MgtvGmffxb(Q7_ zHoW=p23k|*rj!nIO=4s%X%^0TexK>l&51WLxvHDKl_K`FY>GGEzrVhaXKkdVti>uK zis2U7+Gcc9cHV?~P057VMfy7OrcY@@AeH0bCGT4?^CoT&X3M`P+q|^du6Z-cF&eD- zB~7FN|w8`0CQB%ddLuD#jI>9{2k#=p8$iso?c$;Kzl9=Jva*k3Y!u zf-24t2X<(iXyFG6{7Q|;A0d+&F^J92oBB%a@>2?)_TJT@n^Wa~l>PxvyJ$R+TCb>T zYuQ*@c>Lo;TR{I>=}c?6pWUtIDf+i3Dcv!#F>End{U^cUeSZmdLKi*C)x3$Wj6rjS<%5Z^W*esE($A9yYH6xh|eEB7T(M9$!EZ0Zb%jA$;^zqsnoGtrhq24fH8` z_Q4N)cAqGp%Jm-j`N4SX@;)u-zX_P1ooqvy)KTi-g!$k|!yA*(TRaBxKr6Yt^Bk;oKmNCgz*3Mc)Rr3Wsy0v(M_} z>10NQe7f9!&QEdL4ni0oLeB~G;+vG$FK%~`64I2|9JTPBp4!mSxwRrW2P;!MR|lV# z*~qfVW(;}D5gSEV` z)s`YjZRmcFq|M&K|b3OGGpl+nnMNlSwQ46bW24M@akCI&9@ds6G4-%{K ztrS7zyOuMA^DAX5fh*dBQsYtUGo@*|6{jj<55_azlarS#${d+%aZIV*II?xxw4ZjA!0ubkEwZQ%OX#H=5V; zpUBN5C9xiAp4bRt!L1n0O`l@f0)UmaHq~mfOg^Nz&-s;oXIS?Cb)A)kCC-E8z`xs=0>|CY z3*fu^%)gHNU&XQ<1pYe$d_&){{@wau#Jm0fId22*v0N}Wymk#Zn!5zJy7~q_00;fq z*Fyj4xwh3cO8tA!SDzI$2e#PPqH1bOM6ur|4Q+z=e#di=binxgUvJB_$!2maGN@gOM3PfJM&0)Z$(R29Ji?n)|}nwm<==akN!Qvg~h1cvzr zIfW|t2A=#^Cx7>I$u-a=z{4-d1MGWzw_hh`aBz_Bi4(g6{pa(qdAf#r{NG5vf&X3> zut25VJ4z~w%1Zy~8+cS__o~)Sk5E@{>q{O!0L_3g^i(ue)OG%P;Qw>$|Aze6qZWa# z0ft~7;K?Ap|D*c9AO7!~|L+I?8q?;#$J9{!?=k=D*1sRsQQBSmf6?M!g#PO)KxsWr z9i{(pO^*{*%w7&KQrzQ`*&W~rh}rIE{{-;o%)gGnIcwzk$7ghPSy&8Mu3frtCv@Ku z_F%**i^+o|;dsVbqcn$)!V8yg9=Kp|Grs@uM=I}a!J`L0o-~>G#42f__2`T&g6k36 zM{3^Hm%N;iuTi*PxO4Eg*!!>Td|yYPqkP?P&;g|C*C_oR3c`c%XTiM_1`k>Gu^u?Y zfBd&6(HCTXoF+*GQNMEt{JzD%A3iS3PYdV&r*8h$Nck$;0p#P2PEDVG9&oqip$Ogm z|2U(+x)S-w%8I`bKAolh@8SPp5eJYtdp9`5eS2Rt@i@ZYG;=R9>|3U#LKFMSz}D7waONXfqe5Pvy2E9XkLWmF?@2T%{nFMLqTfNT z6`xC)@qbTzde~ge|CGtzb5agHaQlTVw6kNaxDB!~Z1xK7;Upc`K3h6p@@Wl)IH}X63<$90o>B*JYs7THQmkJI73p1twyjJOZyH|VuV>6 zlDQrayy#s>@7Po`PyRGE&bc@B*lP@I8f{y0#@e?!^#8#ApSQ^&T?aJp&XEhjAnVHqPH` zGm^;!+s$kHT5^OB)U)D0{f@^SPnZ3F4Lg5zNvJ;bY@zCq`(fprA3}HSv>nA zkx=C0V`HTLBoH?Y;)~VBz?@;d|S?o&9x{8pEl4KJO*@;c1E%5|KZ;KXX0nmuW7X0|ij0Z-|%x54x1HD$8HM`4!j$G$3yPV+ExBb4| z|AX#J2jZjsTG^0i8%@?fc*>S!qt&ZQ`^>n*%;&}CYPz)o{fGD7>c^FTvBgV+SDi~( z@q&K}iERXF#?-qmdlBN%&$?9pOf>gQo2_#K%L~&|Ipj|6CGz(wIe&5mLIZStq?pv# z-(K{n++6N{!#Wm@85$B!ejQHi^f8BPNNI<7yXw|GTOW1L%*Q#s+1t+D8#(mlUE>j& zkl~0Mn=?P=L2;QGT9&=Vf4kO!8|q>+uE+S|8Vx?_5xl2u;&zQ5!?nS9BfL=KcUuIf zgt}a8vij>ibbGqman_0?1nv+t;}sTGe`6JyA@78VV=3Obz~3S zq2c;#u0<`4IghY+goe#+vU*jvOFf2X_nZ>H$PjDTMCPMmw^O%|V;*GI;sGIW@e?b& zlf#Ow?Nv*j>1b}0Cz-_W-3>P++5zDHCzJK?r$u_*=5Uem&aJYcrF0ECb`luZxBy_1X zCYsC20mfk}ptK~z-B1f13?UGuq`badtgX7vj zt8e$@*^gdUTkj^rr^G(p>5bRzfY(CtBobSh7e<1qFx1nth1~AXb&9OEAB5x;05cvM z(!S{fQ~7Cv`FImlm$>c>S9AiGN`XGsNFuNGW$kHa7)PE)6V1(Z1%#~cAsu3nXP01W zUkg$F#tMgfbf$kXwCZBFJ)kqo$;OUd!RW-^PCpffsJ6!dc z!2HpuuvCW*j!|w1$)qGvB9e=Addw#>d*$|l-6t}`cRE8@@$KD}SNF0t2CW<$r#G@+ zIDuP8tCF;W;|-te#Au!BD&Na?otqDGcfcA!4^z+YWBfyYgN4T$Mr zcARzW88T1LOiLszV{C?+VBW(`xE!7Z9SE{4>Tmz*_c}`%c|bGqQ94`^c?Em>8_`G3aKWalAXpfl^y{@*+~!;^C`)tgm$LJh zH~WLH+b5ZGM3_&EKa1P7GPg`&b7kGDS> zmS>m|Kl=pYfSq06-BokEKIHoHfX)zl<|iCfUibo(S~ydB3#Z72%w89va7N_4{U5wN z{D}wJD;^dQIbk1yDRjMv*JDGbC^ra4gC!YBm~wT%j|0n#Y1aqhniNSA>FA+bdy3o{ zE~wG-^mB2~g3FF9PY|oG!ue^l`@lo34K-ozO1Ro&jpX+$jo%`g5QrN2nAWN| zu$@Er%O2nU>_ocpUVDWlnsM}jAf@1B-Sv6xd(q%vZf*MPj}$r z{k?r&5j?9d2XsKQ_ToII1Q3I|g^SIE$;^W-)8W)kA5TDMF3twqDB*elv(Pcjx~EW0 z+rN8T3CjNdgck-Cqz$pRSP*z(1CxYpI3Um?v?Kyqj%1P?x3_n>U;0NT(8ur-ZdfL7 zL`gd?lnr|TsnXJ&d6X4@eYDX>dp~Z8jvNiYn`Dt~s9i{Am=+2WToL11*AVTRh z0Vq218nj$^3s7bX>-n2giZ_0*tp4^$) zUUy=CXWe^tSq8}f7bikqmJFakb;RVh235h8h`5TjhAxSle~1P-m=j0BZ z5JTZ~Cc1eQNo4*#7i;j2%E|)}{m&sR?0pdnFZI^^B<6M7uCBx6*GoubOZ$sY zg^gaG1F|gV_S{wnV#^G=01YM$27n@rQGd*yGyP#6-5d=@NWv|&C5HiqCk6v?B2J|| z4vfQqFsJLDP5S0{H@?r&#zY9wLh2XBukhisy7c$t2mhaJ?0^$54d#SR_Yv5T{#WNl z6o-TXtKic4WJbvL-c@|Fdrp|T&f0w5i`FW)(6yq%>&bqTpVq72g{Smu#q7C$HKiYOZ6NmAjv{XaA}?@$7Fd0udWR$u zb)Ezx4-U6ip>z4m8>fm-xR`gJYh^avQf$ zkg5J%o2Zi?%*nw&pWU`iY?YFX+WFd_D3cxZs`A$><2OTRPyNHbG`#Rmjbsw--O@G{ zkjAC>q@k$19%e^WCzWwy?SKH`B-iul$k@AlcwvW774ODXH|ba;T_v%3!pf;`&~iE1 zo*XX4isv`grhoU_P(i1N`nIgbPW}=|Rw^^U`p|%QKr({#o|H`n$znrej}`DmMbV=F znK<{(9NIWbTK@CV*jN!@8J)mY@`{Dz>wI`85nAL%pOF*!JW|3TbhYDdyIvVSVBN&& zGute2KyRzMs?BNwlQxI0KM;QMIB7XC!{_&A^xmgKL4Y?UlBrl3qML#ai#mYZWVk3z z_)q%Vfx${h6vSJSAHDYeCyM&?WHN_)R#?c(8pqVut(2qfN7Eepm9`hVO%EVh@i-k& zz4Q;^ebHdY4ex)js*mm8QKP}{3w;m27vV?G>_m;~n1qcsl10{LmutwAg0x7|=QyX& zF~Y{Dg6A+k@L|fg9|7()@A~V;sM2GL$G-(s`Vqz39-hCTfynR%^vXD zW2$c68VkQ1V_%zT)*0K&j(GKA+xhs$^~-qY?RJOyaj@s}q5DAEAbH>Kl?u0eba7k5 zh&Jf`o0OSgo2#~#Y2RemN6-+vWL%@Yohe~g%WpRzVDmf+;`=dXKe?V%R8-%#zQ^b!US>?^GQ@L2r;2uzspC*^<8%`II-jOtJzk<7 zUw(UdXh^7jG`vfB=8gHCZ(G$Q9F#bNj$F-8Yd6j_iW7DWJ=?P0qrFM~es2A{)9hP! zPPua0VCDCI9PgoMCYVrhe~ zb-=R@_)=aWTW-YKHK8oV`SGw}>|}o0756AE2fkJNX@6#5kET(igjX54TN%AnLk&vH zU!KA7sn6V1(JQE3a8mC5EP;xIvWxj$D~k6odob~)Jd6~&<{Ir z<9mH~v=NKNB~O&TD;o|n2xSpl3x%73N12^NrUN&0Ek**m6xOCds>xhR%^ExFxyf!P zwRNNl#8q5FzH7F76b><&Vs+a!|9~-|jNU<_iH$5EwuZ~)cP!ryb40knL_0N&AIf!Q z&twy_y9|{`^uA<1UO-j)zbva3f7~h~x$W+Xz_oXS@S^o&ZrlBf`8CSKEke0$nQ@GY zV8ZA1jx@W}c+s9|QopTF-R1Ns6U@bT@wF z##U6c-1f0RGO#@AynH&O;r`|oPH-#P%n7+UyIgLA+L{-N+t!2qddq{!|0YuJ%Rrc* zR^ZEHV5h(_NLJL&DtdA_Pw`uBmBy1Wh|(mHr$>soXiPEkaPXoq7TMoGH8YUAw?uxud-uFT5FZc zF6wGfL{T5HdtNyAYwHvL@l}~1Xw>vPi;;Nb1M85{e1b%=aafDhTsD(H>M}Ru(`~X^ z4X?+#m5>H2%K4{+g~GKuTIWCvMuFe=Ds-HCF09-rbNNjSc6$loo*uqf1h3U!{b=6K zA(PXe-y*|?mVyK^c80ySsZl$s;*fEU$$AX&)9}Y)o$#efdi`XAV^&FVOGtiS;Q3yi zz&LGitL6@6ORT*dzH9;aKr+^hds9>8es3M4Cl!9YiUu#y1yRv7RY53Coik#3nnrRY zdWrCMs8VZfW)_rk zY!m*$ix3WHjJPDnDKy~9F%XlqWqo$STu$H>TunwssKL3uk7uTmlv9di?l1{1Jc&(}xK4f*sxG-S?U&M!&~pK0_Iq$Ls8uM3Y$p`S(L z+2*nZ^m2I`G7C74(ijXrP>e*#`1$NB6|*Wg;j6KPaKY*j$U_Y^O01aAkbO-oxr(~V zGwe9vH$S1;t0l9u^E6Lvr4as2!<$s0q|sm;D%Id6_`PFWe|A7+G6zZ|tngcqRW=ah z)Xd_X%%AUoeZbgW9`HLvt4$u;?2cj>qNGcS%&z@Tk9k04*wP}hiTdan@u;Of9;hoC zw;|?J9hM9w4{1jyRJT4WDPJRB4~{yBR9V7$%waP)hva0;tw&%D_SLw>gF@H!Y`r(^ zI_6xaysg*WbIb7CHWS-#^Z)pL@It%sZnLd{pS$oTwFYa^ng>dCrw6U)G#8nSpJqdN zIB-W`F#2LWO*KAqFM6tcBIbx`!j8(zo|!txS}T3-TC8J>mh;d}%Xh zWm4-`dZ9<-RQ0Cj;!-7LggS8>RaUU58xX9&aXNHGX%@anY@>ciP~_0pnJ?T#Zf}|G zU|!3y6>a@4eyd8Oic!qD*eYkyP8r4oSW|(YPji*TIx^ zYLen>GQ(#>@kh8>up0jUfI{*T5L6a)UmiP+K zq2YVwp6)RzxE-9JIyiha2ky%i*nQqTZP`?B=BM9|lIh}Y2l=OSTHE3^fI|@a!4?fA zHtBxXM2mNHug^eNnn2!JbnHUKS;`r`g(p3IhqqKoi9{F1;xH0N0z0(C(k^Fdkbl{u zqZreP(hOY%Qy8rL0P?a)*YBgE7YEqY0C(SH>zT|=Fcv4iLeshzOB>0Ljw=3(zYX z*NXi}(s6@4pl{)u>S8qBpJC)*2!zbe)QI<=BPr_!^qDkA4i!N!!B0b!HIv4|>_|6_ zt@Jf%I0zSt@>_d`E-XOgv;v-})62_g#cWT}dP*Bj_!fDuRdfW?MKq%zG#ckWaus$z# zYhu)$z;{cWPU(s*bvVU!Wg1Vz5F1r@NJjb|BFbqoU8_6Dnn-fm{{E&f6HFo>i1Ek( z;+XSPcOto`T#3DLH7w$Un8L)nT=8*|v7l=!K^Im&)l^YGR@`JPKBli{Zl=F}qj6(u ztJlBT;U7{=B9W}!Y)G3!)>+PHthFsJj{6_&kj^%Lnps~`+f5Nj((M6m>~F00Q;EF|!uk2o#^>~gXU3h=L;5<>Le3_$0WNo>#>_8)>x5>x zan}Z26nU6g?psrhYp(K#pfZ^=Ncct3{ucPQ$YVrFd1I+@x+t?;JnU!HDa%iOc z^Bq@fFg940tjjT*q%&1n**#=yS^tcS7)81;5*cUTj)g#Ainmc?kiO2fE3Kd^JzSGbPdB$n?;u#hh*bgR92uauwC# zSbScbWDDrK+Q5wzmtfGP0P(S{^t|L!&avrEr9?>y%ih?f^5F!^#(*gYp5D`(GW{h6 zc>tNLO9{26XWGXVnjN%ebalntYSpXghl5h0Xp=^x!e{DzMldb3ozCU(H9Lh=x`dX> z_S)AI3G!M0oXZpC`~?7O_qy&{4h|k@u?U`4FMrZFJ;a7|EzWiYq9~riWSx`ZkcdsF zIsrUdcbfg;s&0m>ZlqKs4eXRnR-bRaWqAbkS${kfmi8lmM1yiEN%vJ(L96agS_{Ob zc$e4gyP7ufA|VuakUrm5iC%$!H2##qq_#47jOFX>u%w06C^{lx(*OV|Uq2_hz~-_c zC=9qYo8I!8`aLUbw)atkGv*3P5ltO+h#bA#F{^tw>B5rmoK2-KM&yM0;#(1@1R95S zHD7(Zu%g#Fr%&-#%$!nQOi-x0f!($S_C8x+mAj`-L-oR2_nhv>ebvp@A>VK5^V#~^ z=zjOl!)J=z$G_#tm4t>5nXWcl+K@A)DPszmL-vqmzu7;{g#x<~2Cj&Z$>?n& zZ%vPuv5&ti;+ENFV2|F(h;3Uh%Q5xl3ZPjOYyzn$?K!3qyKW>NcH?eY1{yy|)3(jp z0w8pq>CzppeI4|pY5xHkaHG1~+(@ zWYBd0>95hN(Q#w528XPg1JB*;sgh@Kr$}cfP^ST_-yQb|F*}AAO2~9bG6W0-ro<4? zi_7nBh4z1ffX5h+)@|5`M;dm(b8rVT>?n|G7x3)54d7CU;5vBN7h9USf+Xp4hE5qC z1x0p-%k5@-dTQeVT|RXkPHSgR^R+f@d{Cxu3|I{E1WnimleFZ(Et_tXo*8Xaa#Z+L z>>c>tjRj(&mWK#YhVW+k+PcXi%d7e=ou1(&d1g{F@ ziL%rlF+?jo#CmQerv$~TtFasMQ(ktFqc$;;fGVFpCw$k6Jhfa92llod)Weto zDWXMs=GaGa`Wi2QOZvAm8QYTunG8Y2*0sf0!}bD->-tFMTDxPeuHQmx zXr=46(E8^|-{dNu^eMH9=Rj9Bn^7borF@xa$12!edtrkX!%q;D(TWvh^R_KNsFX^5N0Y>_;1h8PZg?{f3J~S{p5H3j@dV=tu0}74~ib_TA zW)#+@xo0GiUn?}C0QIp(y^RYb!X}fniNzS(%0`pBVA{p@V1ZiJ@R--p@9WEeIcEo5~1BF@; zn$tk%vBDc2$ddt+DZ2InsleTzGSxz_gBiO!>51b2lHZOh?K+3`U4SQy7UIBsw?$hV1H-%J!s zBKPXit!X=R`clGh30b>|Ox4Y}-`Bik2+lXOfyiSf>p_x$YhQ%+l{fQQlSJA)JT@$c zfN|+YxY$6qN3O%{m}^s91@?U3Hg&1vVk<3#mHt4-h}DkvhM~JPwdM7s4+%;<`a6AQ zo(Xb<-T1<3GDi5@unT+y=^byF6bYM2`36*f)^`ZuOU96YQ*6j)4zme;3Jt2#^;YAL zCIYyd5bw@pGBoIlu@d5r^(m;3knM)?B$kTfGLnGVErcL=A}SCoTb0|A(6p7BkgJ&f zE4uQ)<^qjRz$eoRvqt>PdUe*lt;13V3H4_gJ=}wB4Sk4s_5-V5<#X znTVY=xydfMh_aQ_Am#$q>3z%=5gZ0=-q1%~k((vbN$+l|)2C=I?Ns#=DLb@}B4TN+ zlDSV`7NesC-OP8F3kIU6J@=F@SH!eN*B|DbzAhGbP1k?wup@J0nzFaA`K+xu3DFp{ zYjP+)iX8D-W82PpoGrNNY~T4Th_Hiw(B!7mpan9AIKA=GeTZk1mp*ESO41IBRpa3s zL49*$#YbyZTtP29+Y~UEV;bLF_<)sv&k!9f@zk3E~CdKy1Rh z-mPs0c$UxPx+9r!neDvVD|c;_6gSjKK7#cfbS8cBU^}j` z+H=%#NAAEL6(i)>yk4gg=u2CD-$tQ6Uc7!Z1l?@H*lI)UqUzrW+oIp=7PTY9uqEe* ztQGA1aGJrej3N;rhmr2JvPtj_SkZJ>+X?8}h5G&Q^r*Ag$T5#Xo&lk zf}LPu8xfW1hgpWau_U$(@J_yXEEZKYMaq>r+M~5S-oHGT5!mC`i*2x2+}g6U2)Q5q zdx<_Ic;N1ClFE-eHV#OTUHN>eMX3S5Rj7=QSQqlWwdo8&J#~O|r|hQfdO*nCoMaDt z%N$g0Tn5PGmx%t%Rtx7OVFdi(o0iCdOO!^LPw%2+Fq{tV`gv8$if_!%G`05Ak9 zj#h5)jz@&J5V0D;5UJ@Oeg20Q!UsYyL~-A(>D=ojUWT8M?15#XG{!cb$!n}+8(Hz; zvmqbOip&;$yHrvr5{MStxs;IBW8pI?twM^3&^sRX^4=R%1xjP0E*KzaYe^lo9?0?N z&C48&yOpO{uFx~=!bgtUS^oU(#rL{IXJrKKRaY#Z9<8!o*0F-VJvKa7ym1`JQ~oZq ze{W=0E7A^!63Upr_FX`rIwhSzc2Op~i7LW*4(4Vr2Cz9`!5kQ+so5v~!mnvFonw}^ zu(Dz0dEvdOqkb*9)R&Ie>?eAJCT?Jr6buG(<3)eZt?0bQ%fj~K8EB;lP zR)RATH`3MMy$Do}wPscQJl8cxlu^Kdxw|D91iI7OR~h1M`ed9`OhrX=I958Ch+H2c zbtv_ufQRRsT^{eEeOW;lH~j{&KJe8}F(BurgA9m-@yy-@GR{=bNhO6_pm#cq#yr$4 z9#cDY6HfZ`WOA%wWJqXwz?U~pV;%(@RSnBO&CODn3cI<2_Um$G)}#0F-lraS)g0zo zG->T+-5LW>y=7BvqEIAcTB;xLr9TQJb7gwB+_JFAYXhl^)2CG5mz9-yX4W2IBA2%x zuiX-M&a9r!_o?`XdylZ9C@zPaFV_PqXHmlFA4+Su!O@W%5d-|)FRL5HhcVh(&_yA_ z?MzB(p|fmn9Hhr`YQE23lkp|Quq+PTf=fXn@1iP0Qf=ILp(|CkBcXXb#TTnbGUX}p zx|?Z*=g0NfU#i^8eDLAf)a056VEUw1klQ)6ch5TlDJRtCT(*Q;mVamQT4MlM-J5h} zl=PWg@E4|DwJ4ji2q>w>K7(wlJY4pwPW^a5g5Q_PxY%o_H@#`oBVy+qwrhePk;iaQ ze|>+g_0quh-eisD!2DUfNTi-06C3ux!F+If@XCcvo%Qb$yJ1fLq$R{qlnQKZnMmAb zEAK(60Bfw*Q{AL#zs~^RZ=c^C#oWeM_VV!_8g^vDuiN;)m%j-Xv_|_-@!;G_q8{`p zMBqwtq^5WEf>1Ctv$NC6A@UmSo0a7!?_mIWvj7x-^xua1PI+A;e{OGARNyu16VTky zWx+U{gG+ZEfqlD57_!uzT_D0+u~`;8;F%WI(wY|ua~Q0e!tVq|1xI2X=KW<>H*-K@ z#Vs1TJ0yI&7QyGHeDPi1p9EdKxW58few~$18kZu+Rc!Q@rV2`}txWlbb7j`H%E2GoZv$QP%p=zx)`u z+kd>nkhZS_c>MVEd`prWw>ETyR>p zEQWG_ayP%rrO*B#6waMU)G);(kO zljrPoPgl|az_XP7cnBT_lCOTS`2x?Ot!Id*b;@q~&Fms0E3M3Ezm62ELHe5E_{!f{ zs$J;~JjS`i4=n+)80r$55|&B*hKrFv;lyej5Q#Vwi71F9b6CGQ;{9Zbl><+g0@H># zRXzPhso=Z%w)bQnpFX$$C(_i4lri(WyYmrS|pdsGVeepthtcV)G9n*&OCOyQJZ&Zy@BTvd+SCOowF7E_NlN z;(RI1z7%k;Q2;l_66!+=t9b0V4WmDdzTZ=jeC?P45;?%h^db}81Q}E-ZPZQOw^550xV@(TMa0h zXpm*qk}-@AJ?Y)p=SDwL%RI{k6}GuQdHbV?URf3ohTfi_lsYslq(}a8(!vljJd{?J z3_vn|ziy#ZEy&HK717|96sD4 zc6Pm6^OoU&DR9o*akonsPfH+@BzU928@t6(?VY3A&Mt?3NSQBh2X#@7#kpgH28dLR z=kgdMZm3ez{G)z{F9?o^X_ZcDSU%w?amGICvB`E29W4pFL}O41t-~6UgnuFD^v6LX zv48+Ios)+z_48nUS|X`9s8boZY>wc_Wxi{LF3IX^0}KV&uG{0a8z^fj(Lhj91y4ZyHBsT z#LI{!udkm>;vKfz#yI;oboqx)?uL=pPMb;)jJmqU^!FOnVI#=_A55+kqlTa8R5OsE zgm@EYzItr&Ywd0gfQY3MV#(@yCKUkLA>#OB5$(@p+)P0^>79iZBVOU%{r!-DVK z^-QlP>yg2h9yKEaRMN>L&c8|^w!&llHR!KRHIS2OAV69Nwd(`^VTa>b9|HySh)AI3 z>ph7VUu~oqYo!vj8921PR)v;S^15vygo+ug!DVO@YhBXAX5SVshBqI9ezA}E>N?t+ z&l8uLv~P6C*5}x6(SmZ9yeeoMme)pI>r&*EE4P+Z7lLT%^^`O+YsKU27=smxhg!9W zkM7*jN+z~rUDG6>;+KRVYr8p@fh#$EmBKUcd90BqDhDYtFQS7)3B~o2Zyh@D*9fOV(7(0)D`zt}vrQDrEk%Q`~Yx zSuvrD*bS5y2-S}l?`(PqdJCCN=rhB#xq2#ih3)*D8W5es%$4xb^=8<@i;fOhssh@n z6}&?yu2TeHi=tv7s1pf_DVFf>xv;G&(q?ZI(zuEB z_bfgBh?_FBLE6-;T!G!bq9tRQncp}0cq!6UvqR8n=({@QTMmFML8}vdF<<6R$Ihsb z;?bEQV;*ZzYa+H7yHc4e`UQ_2u5l;qrYn_N*8(DaS2r`X&O0IwP< zKposURC_dBT6gp=6^fi|&7va_S#%t1qYu5Q%v^VKy#E%+mAgd|3zAH>)H;}s8$kN? z$!?Ysj3ir1e(V9<=FPerDjmOcaa6QaR2CEVG)fE?G2N|P5A#lUjz5b60)8o>ugFWg zb$XISW5a)7qq5$CEkRnrM180;@N#nO|9FMzxqkGj5UmsU|FHMgQBiJh|F9qkf`mvZ z5*A1ef(pV=ihv4=7<34T(jy@`qymzoA|g?W14V83?;A9@TIWgkbF72RYF`z| zRL&1v0!>QjI1=ce*BB8>D*s=dB`^gHz{D8*#?o7A0oo>=lpDQIpEu72fDW9*n{>dN zf!Zs-m~G2w_OXMQY5%^z^Ad>2eV6(jX8$7Vvq!H(W}XWS>q!Hps@yA6f)F5XALEYl zsQiwYvH^gY+M^1WX#Rp52mta0elCoqnzGC9zm@YsR*3>RJ3ITX)YU>-z;4{eMZ?X{ zTkCnV>7ODEzjpSZlIoDjAe&t8rFLYMSeOHHIzJnd>flpCiav;aaq0IhPpM!gg=IT* zq~y;*Ug9FHL9*$f(}b=+I2cmg;xgsa(g1atvrn5I>h)Ioi<(;EuAK!zG4sV3nm-3j zh%1~kAm5b2Sk6ztRbWK|Qt*)He-XD6AG@jkz>5OOOFtLwOFwQsF}~hbD4F-!0)z)s z`XnxYUQkRd{{5d0(71hUy*4&C^izRk+PU^*r$oy7i7;xur*t|qm=>Q%LWM^mJP;qeqeD31% zLIx$2c^j1=aryVZKJ*-nb>Vu${_OY18o3;=zaL$qZZ+{yqUpz7u_hy9o#t^(ME|`3 z@%a?c@iV^gHq<+5be-d-!Z&|mxsX$D$L zLPME;f0_%YTF+ooX{@vF<(s+JY!2I4Fm^^Ag!k43H?76MSn``_nZju%b>ywQe}CLW zaEo`Cf8VV^Z{iBBXBvI#@!#Ac7{LSM4fuWk5M>V1qdb3Q{?+-vArP3tlmABkZ|1LP z>B|oGZmxYj`Zods2JvV&y#E`HP89+QZQEt^(C-E0Hqd*5#($Y*CUA5Ii%DU5erc&x zbzE?8@K$oE>r8>u_tm@9RE6l-xfTS>S(=AxGrerGJ0=bNc|tkjUCo{+>Sr=|I=iJg8(mnpV8|b}Is{ zVYG6t?zrvqqM*A40)&)R2M)%xg)k1=*j4Jm=fj z0%_F;Rt)nJEaEf=p{k<0<4)-G<88n19VPS0mgQJi@UXP+g1{ZBf)+UntxG{`aGFqF zHG{$Y_9}JTO)*^^n%(XBx}nB4#Yd%Xu%^y%tw)oXHaWW4{PMLJx?Pr4$&sOR+?=b0 zr&7u)Qw(Cp9?|j(6yA1|{QZmt*#`yG_ejy7k|VjJm!_#JKLGeLig7=>o;yk)+IqkV zWG9k7lT~JZtJ9n)o?eAMcR)LdDT{7A9D0x5N2mk(W*=7`C9@8&(a&; zmi0PpoFPM2ZNGcE{pT!9aGLC>a@gIL>)Fdnf4+s!Ci}7<3)8eJgcq`|r{%8p7>xJZ zqflT>k@Xo!ob&hkp^hk6^E9MjbokuZ3*M!%WfhpO-M~f;MHQCQ^%%F=H03D=Z9cf$ zYf(?wm5YA`Htuammb=w{x|Gi0c*dHvcylXpC;w^ zK24Qw{Oq@6MF)%04dy~QFau?REg7sjj>P)FQjpGidTi@@uV_Z#lin<2Pq&%Yky}4~ z4a)SlrRd;gnd^rPrrUoqtpBXs`J0(ik4Y_CN*3dSZhrx{QlwmqG>e2KX#;CX+T6 zpC5vwcLv=JI@@;NQXo-HGB>-7Vw}j492&pZIzK3Lblv)Ive&UY-P41YBj~8~w|hDl z#||C^6%i{|Zd!q}tCp4lmT%`rU1jINvB;cO2}F z7EUKQKX0%c#pw;^17NCXSPoIQ2pe;3LdvSI%pLo^69$^eEJ5CTnqAd!BRz$lR$}y} zz=I}rInat{tv|mt9@84@ofo1kX&nLPABa0kC}6uXLsvAI>DWO_f1C@a%lT;M?YrO{ z{cl2io{4E+QkL4NzC0Ke@>it?M71ABj(of|)prh+lD%p^hy`r#9h2WLN@v5O3(tIl z8S)()l>#0__Ob)w{LZlfw_W#cQFeo@mYa;o(q-i#47>W%UgER|Ah5(@aIhbS$p{Rwhu_!D#obA9&S(@$;WE!IX{4%=Ty_o&3=hO!*`5pt_>KiZY9uT1G-ntE*e?9Vtq?@;8tKSIOuuVgOjQ|xbW$>ZY8m+I zI;4@6lA^0&f6?_tc%tV3bs(?^2?%LgZObB4w?`E0@FyBJk%{EU(lV92-}@i3EI6nF zxjYVq@^sZFi)67;w88(e9bEQ`|W1a0cm@S zM9DDY-SGUNS!m}-p3#!=Jf`W>mfUZj<>?Px$}0wcRnI_(4xcGK@FGV#(G6T_K`Ve^ zTnO|feL&y?;ThRy{;I4CFBavF3?`t^@12D;Ut02*#e<)QA@CPJZ}b<;jyUg}!lY(p z{T5%@=lKXYU`-~bf6+}#yb5Lp`t`ilrYC&Azikr*;28&o<^9dKP5_sky8lq}KU>3V z?SH8D?=0^553l`)75Ya)|HJ(<`A2#DCq4dAx&LN=|36V4feOjrzkO4^uUo8l-;@At zv3@7Dw6wh6sgCFwkluk)ap}iId3+G{xt6F|Cp9iDneX4RW_kT=M$vKJf9shJ$YXJ zZMd#OLQ&Rg12K}wB@L3cO)R>Q-k;ar30gqye1`$~>5`0%7v4;T(zQ-X9NLSg&b=U? zay=)=k1#eKd$ztMJYD=ITY zWi3{$7b*{GyP>hUIWsbRVXm@*VNBuJm4`Eg6R|FWoA_KaW;c{;{A@waqA2XqxODhM z{v_gUuy_uSrw!ZmJhqH%F=qEm5)s-F%Nn*x^du0?1Mri7Trt3O+j_DpR>5jfbEA%+ z@FHJ*ws7^CX}7ywO3#D78>RNSSpHtMqlB|v08Hpu`(8`bKqXg7ffLa zZJ^;EG2=}EAFEnZ7{}!|*z0tp*}F@Jha%pnPfwPGxBF}CArn<9@vFA?7|&u$?sMP8 zedpPjZDe`=4DH%o&4k^L5z;SfDR`s>o{f1<@*FEBaM6L=TyETcG7C$JvlQJGnSn-dL3avBr7FJ97-b86~gu+ zxk-5M(mWMNyGiG3YRjqjE3wBvR{&&A*DMfiEwT42vupYet0xQtTbmo(Xd-Top4r92j)4 zra)OGoSQkZiyte1Tpyl7j;$NwXa$}G zW*F%xAX6HD#1nT_q*-o`BNg?LGt5pSB2uBtH9Haa-iVT;@A*9?{K_Or_RxdGE;e)| z_jKlZRIuP`jd776^|bJuKgv$|I}6qib?0cuVf+fRT>PZf#*FZ65tgGAd$&0Y8N^ek zK9ViO$HuXULxtr?K-L?mt1<7v+B0DqC+8{|2=_*B^0~aP(00jNk9W8srZg*Xce(ug z6die!n2cb&(^)g65^l5fga&k+NfhkzOUT7EE2LTE-sQ3M#m8sm$pR6RMM=S z6m{pTTEoerz@P#F>N0wxJyPxS3?_Sl+v)|yu3-EE`$+pw?Gejw;}thU+lnI}f96?- zwHp=r>gjscV#EV@$lfIfk{2ShTD!KU#<$)e+XkpK&=_#dDAP_V*snm~Mh1b!Jq4)g z!(R!Z7PlT+?6Fr)h(~8Zpcjnik?C7y<<5~$A2Rs27vh#%qQr!DY0+oGbwuWB|NTZ> z=1arfePJ!JQcEK*Pg-rU1e8tgYdZ-mik)lgpEeZ;ORKY{50^hk+}%s#J@$=_3#1{i zF9V)^Q?0|MuD)*%LoVx=6st1?Gs4Zu9y<`ZEW(2<<4#woyG=MuV6`DD!7KgH=Wcm@ zep;o>?~Vd#N5T`Y5IJ2|4Ntg7#t;$Oy`T5!?(uPLWUs2Bs(;a<-*tIYB}3I7utxQx zUu%5Caq<&>a(&*#+V|=3OvvUGX}Xn|T}ExaALYV{)3 z8xf&GUc6Onb|m0VUy%HOT@3U;w=a9F{D!p{Gu-H%7-VFhou_*Kh+BW|X~;Ch6iMWa zV}d{cEAqeD1}+hVR`%)MliRnE8>M!4R3+M^H9L1dbVcoGn|(?&TUW4`C+ezWJeYa+ zU8w$OP|bh_CiIHcrciJ>A4bd7dRGC`#wy^Z(vxf?Vwx-*nQ|mtUYvLxtrqy}Xo`IX zmm%m^0s6iBFgTEWz1mTuhvkT0mS9?)vGTds8i6(f1W}IfCYA6A9kvwMZ0P#_)Kt4h z_lwG^2pFM;vj6PQN%T2F$&>fe(&~uj=tqSJeH9oc)cb^i2LZsYcE)=?=Df=4jt4WvCsn4 z)8QqpQ<>rK4BigXOR|oDtM_n2%yXp26$wVg8HkK3CUq@(7*5pt;w0%fU2x28{=%!X zzBPFQZBM(o$@MmFW17xmIEi}uG6}y&s6hjJ*`i;Ku4dBoMo`?A;*1Km$VjSIZ=u*Q zszAV>D3~NFctt7Iq+aX4M=bt5VyTJq8!-s?_un{MyPe{d&gdSl=RCR0NIX4W%XgOT zgu1K1Hm^NC8h9TQx|4(9pIx7vdk+iDA6`SfE)Zycz)sMqB?ocxza;wjsLV3;uT3y;wfKsVVIFX)7un#l;?AY>taIfX9ASO@6RB}(T>UK z0%K^yhraK$cJYYtR z6#1OrF&9G(m} z)D{{M9nO+Gvb!gG`$&(nZ~>HBIM`k1Mp+7~Y?*H1!%ZFL z_Fn@0XA0R!hr0~O4BsOw<>R%+l2?1iHVq9`=Vn3?0*MGO*bgH=g3)VYez{L=pp$JL z6QnfFjucS?{84FTQD>Zx&ReTzeY6bmZw8G7u_rgp+O>fMxuJ3lM2$Mc4{Fy~1OoRc z(AVyb#+z9i3P1SSb%l#WJ@}G|guT2L>Z+YNsH77Xs#$l5sO^D|nlNbIM7>F5QY^V- zt?~P-75V;!4AiC8N9kVW%>_8D)?R_>+`$By5fvoxb=3Cp8!2(lMhCa|vLmaFC)4XB z2siam(*tK^!^U}xP*#xuFsJ7{iK8wYJNT_OlBs*VPtWv=3ed&kV1A zznrYp9S()ddlLQWhu38(G8R;uCq>v{g_Tx?JIh_psoD$S(Y;eDBblsm^om?ti773;$|QK>&7>S7A{(V=*VTm0NBU1VtMg~Fat=jvvyNT5F3^zI;Dwc;nPBHNH;J z<@6ai;@g~IgwLY0KZaKu9;Tonx(J6!5F`TDngPnvko^Sp=8yLTm~T=ZBdY2PI4*wx z^tWNdy(kT3PNuVUA7&BKn`d_;9s^xO8m&vbW^FQHb)dGOQRLOu+9VWi1f{KQV@H}E zSI}X0zx<1D?t?8-AvI&70;vh^%n=N0cs&fqACbT{qdHBL91;goj{O?LA`WeVBt-kp zglE?;5!^F-(GT$PxCVtGN0_OQ?8>y$Ql$&@rKx=}r@sr$V?xQ!IIJs35m#=t@MJA- zfWpV-`W+R4x;xTq9UTgekR!-}Zchv@{k}A53E~FYUvb0Jy`9D-1kw?9dKkkTUW4}b zg1tGL{iD9hF5fOH1;sP)^rX^cl#II@G7eZs&wsO!A4pOTeNjYkcvq(97!9fW7cPFf z_X8~G{)Bz!R8Z;iCU`wHPq<+xWrPQ0$`vR3iYe~4;uSI*VLyKyyFTr)7bPPZZ&tIt!yYWUdsa~#B zsgD`B+raC}W%%{0&$78BDSRgX?VXJI(>u<2Ml;4S=dDgbvh5~_Qj&r<=uMl) zjR^)lC%_}WKwt;L2v2yP8F;X&;72h|XAHvx_AOm|oT^9+kKPK#@7Hj8Zo9=}6o9Y` zThVAuy@v_H)@KdGu_9^`rDd!mncoEw)L1N@6`kLv2QuwZUyT{V7@k-9b z;`NRMWv))5Vy(H!ri!_F@rScAYi(kWPUaxgeP?THHNxb>;FlE>A_r!ZOOj`Rcvi`h zXL~`vk9p+WaMsyhF;^BJUfRFdhFG82i@mK#V~4Yr^WP0dnSES|xE-jJTln&xa=!Wv zfg4%Yg=1lD$-jiJPrO}OczJ?n=(&Tbb7g~Q3W$CYA%U8t&G5pf9)1MWp? za)tUcB1e*_lg5&E;cn9hY-BL#fAKh-yA`;Ubpy`{rw`d`ABcC>!~o3NT#xRhF?afOTng0ozL0; z6K3M$5niASIII0+Tu$3VLl6;jg!qCVGlwtzY@*IW_SukSd}1N$=T=Fe&sTv>tS)v~ z5n1}AKK`=ybL;U~O#?d76CNIlo;OHRbW{)=QvMKBFBD*U z{%+Dlcju)6e#b{+V-L}I-a5Fq<778R+AI4!Ka=4E*pP6Auf%XySksq-s5bmuAwinT z54x%ERz3F%(Ox4B;%Bq(Q#F`>Cl@Ga2i8<45hAg`3Ed~CwI=S{djxXCo1tmTW)VFy z2?mUs?270>@K!gtz8DrD-;?~n@W|U(#$5X`>qzNWbGCxPbCuzx!zy5sp`Y@on2dy5 z?1x8Hzv{`{`5NYxxAXPlO(ceNVDgKB$*Dn&cvX^=mtXtKSJo#kDd&$k{5z;LsESih z>2*%1h{GRG52kudS(b#(bo=Zh)jfit57$(`R?&I;o8Q&`VBeP-fxvi}2zdqw6$&U9 zu4iSj^q1{|=}DYxli7E=U9$=dR%gTw8oNjMq?0x?^>1ef)2op0byGUTyg1fuF3)K`>qr zbI#~z8U{dJ`l!I(AXya6zJb4o|b2TzYD^)7^SK>~gmKe8wo>ww;XC{ZErtTzphH+)H>8R1dpJK8hIo==^i7}U5HUOe#n*#s~~ z4y300_@B*xOHkbDF9tg2$&S{C7`M^V5^L=qq3O+-(xTM0^t{xObN#{NC;of08zO|w z#wWn2 zj9WQchx8=EK1@*(#h#_P5h!l1Q?L=%tK@TjrXZnmK+czOlV2BRz@tVFutOpX4FQnh z7nqDWi*vI&M@ozvDeo~%oQ=CTy?O)P9%;!4hbGhtQ|9>M7-{p&+4W<560bh?F3|6p z+1WF#srnoi9^Rb$1XOwf>>VZVRu+I=ifBoeY$= ze8_siB;fstr*@_C&^ACnby5ye4R+s2dorH?rVhFOAE^WK41ve$xLP?#Ifg~1!{Z0d zKTceIZ-qMXon<#M`32%h@b$W`pRby6YIB`=;w)F_7Z)%as_Mn7gvx2yR>Fkg7%f^g zIruE^XXe=-=UgwNTX@xE_2uMw z7@lg=p2##Q|K=?l1>B>5iI1KAu@YC-r#&xT?4n-;Kg7Jx&-9MgQa5% z2ZEdH?aAoB`Vd4&@O8CucZ5nHsiy$dJ-*7?g&V?Z(%E`Z?8RnU4GY;a>t}&4?aPD+ z*&b%E$QqfRhqn$1v!!Gz*VtwqCLz;O#52rvJ|KjY^ z%ruvZ=uM7zHXrc7X~tbWG)~m6*SokTPVm>Do!v%VOL0njbF$ssZwu=zc09waN7ueI zyHk7hxdli>HWKxv7jS4Id23|pzedZR;+RYkTKwVKQO{xpEz(wBWh+@|@UEiU`j)`X z9O?AI)-!;KOiK^HOO%QYBx9DWWGtj4D1VllktI-8j0$X1fRNzSHJ#^Mj%hFI>GN)a>0ci|&lRNlX!@g0sc={#(;b#gPnq*U9LAi#9OcIX23R5^ zFu=D{5c7fK!%;+xUm6cjOrHl$c;QO7?N3H4|Cdn^ z=d~#&=dnfWXL)^+hmIFGbv^3U^~Z3yuE)L?1pti+CkdT(Ibha!oS&QkTX{@FvWL46~kzOKdY?_$!Fzs{~1 zE;^30+sv=uoNr8h>f$_SOQ$Kct1+(4fpsZJZG=8Upn~|NA4y1s0hiyz67MyoN>vpW z*)y7`Nnf|}Dge`Jo(U8$z8maik_whD&&MfbhNM68h%% zaEiSB2041!6$w2?j@HVnn}0KQqBou6z~}&q-{^YFtGQDn?+2s&GlFGZ@Bq0bBC`2@ zUWly2c*xZKiJ-E>IBh4+NYsD9}T$Nu?Y;w*rF>5uadLWffrO;;2-1kca)otKM~ z=AXRzNPF&>^i;$MH6rP{!!e*yAX0oqv7J%D0XT9YiCg!tHg1Yj0!1u)@p}#xDRY9g1D(m)y6bY zC!<+C!wyF*3>ObYP{#@Av>Yfbw%}pUHUR8#Jf;`+$ZFS2+NLgTOG##PT`yqekgasI zdY5s_=;4t|!OwPzeimM-rDJ}WK^>D4-PphvJ zjd$1I3hN<{kdRH`El%1Sg5MwrJkJY*6IbGIl1WfqgI00L_W}`Rd(`CoX%utAVWNS( za#207sH-B1Aw-ovupNRTX^b1XQ2nU4`p!vy?vOY!H`?@1I{NG(qSN25pc0B=ul zJ(Fv4zf9>U<05OM9IbRby-ou%T*tX^qu}l3{bF(y^Kx`?oizVQ*&6gZQrs*!=Kihs1<$oxP!%)&f8v zZQM#?@GV%9%kQKB%~_ty0$F2&k~Glk}(e@b92x&u!4mLjri+wDHz zK)9t%UNsw^E6`gBy#P)ZMI_?8laT48gH@eG+^h;8qKjJCSR0bPJ>B{d{<@FM`p37r zPWXLk?wVs2XyTZQ;Cg z0pmYf!B&!Yw5-$hTnI~P)6tLT%sZ5Rn&Ltkw+r^lFYBblrrKgUdq0{FmQZp%pe95! zHpbP)tMf`AqXOsSnr{!SG~2pHl6R*<%oRN!43ZxG(wLA+OUZn=N|7#75jp?5SD$v# zWOChadu$bf%>*=A#X}Um9Oq-cSnzl%jD|?KIHVU$Z^dxv=a$hpY^d?qxKXYH!xgSs z^jFl6!Udp(bx;IN+gzNU-BbnCD%@QkHa}46zd7AMF*lvMwhla6$~Qn%@!sdy)C*L@ zZmk6&Lr21i7ZumWdkTKCE2KeRdDscjW;@-Uo`O|2-9+W=$HoCyHW^jrW zxazn)RsO}EME!B_!;-u{FNPLa_x#fHA2d6A&nh+t>?4h%B2w>SwQ<}|QVI@=DSuQo z$2WIQ%h#gJxeGYHmBK92rWUgW{L)^9eG4oc*#@jHp=EG;=tu>owwTjL$`)Z0?7+$y zgB^&hk13lJlfGaOl~WIpg`5mLA27!b=x9Yz{eZ@u7Q1SZJqwBH_<`dDty^$h92@~c`CS~;BgL2E%Qo`XcFCWtq@KM!55J>6faXW;5e`=F0yqC= zs862!S6tSlr(15mu7v9FUHfznUh+Vgzo zO=eb_TP7D0(P*6GGL1_9pbNlbS!(=6S^e2X>6h+rND0Qa|nXg;n0^ro1aSxk51^KefkAtZ2`5;NW z2fcDm<>)EWTuPh_|BT2S3e%qdXiO=Oox!v@I}y$%^HAVe$wg7ccQ693>e zld#iId1SV;_RKnK&#sL)(*sEKgh#t|gcWM#aQOYrP#iFdXHbs4L`+0-;9*ZKvZ)xA zw^A;*aIu@&(JSBfWG}~-BB+p7RV3M+L_<*e+IJXsLrji>%xG}sdv(Bbr1tN9&RI=#m>*M=iQYyYZTd^^sy z?10Jsk+oR#Z8Rfn7L2{WumfD}90-}HXVtV`8K#r9E!cLwqwtZV6F(=a3Aodi$mnjQ z!y@BHUJVgau=`Z>G=sf_b{~7lemOYd^%+uNzv{da#M&OK=w8O5e{pM!tFEsaLX0(=9Szy56H(UFZ0Lp5-#ECJ8r=9 zs;%lTZ9fY_)*T#4{eNA?@D5h>zaho{#!s_Sh4Y$1a{7w~wvYae?Bb zI0aNg>_ODO;x!ub(OddX$@9P$)?S<%6K-B?)|;ELtd9#1xZ>eZvygUaC!HAaiU9u3 z{J3OPB=}|&B_i^U^#JKndXrEuSecvaQu?K7AVUZ49VG?P1s>3~!K0@h_W>S4s)2_i z@5v5Ky6o<6s{*g*WYUXRd5;}VXLQ1@X@l9NLz@Pe;9hTOS2eRX{V& zTw3mj(zyve0NeolQ+;sSSl>vi6(qavQ-Ks3uZ~lD?)^F4eyft~d)|L8xEnx&U8}C z&zOVHmsL`RAAmd;PJ9$^iFhB=2PNv9c2zaIVAGG zUm1U7Pi{(_M+EAH@F^xD4EX^O(_{|Ixh2#eA7Ww( z)eSfLZm)wtIW~h=BNk-n_i-z2@bnHlE%r)JV%OcNgI^&xmd3|dv39$;9W$IN{Taq? z0`=Wbq3qcM+#{hXC39V|VlX`~EcYd(?g34yT zf92wVy#fU?)_Nk`du-jKic^c*5bCDL-V(3*-Fp>c;h#|~@DUUaPJ!%_dCcJ%1VKWZ_HeC~!n!qL<#i_DiWJ9cYVaI@2MPQO z589L60tP|^N*-O%*q&pQvG+081H2b?F^OE4@IfmX4*#vW^1oL(_y^s@!xjS6O|eUE zZ39Etvc6*Hu@LUbQS0V~n9}cMgRh#Y2PXM@J2YKxPD@PnB!g6AYF)IOID%IB;=gK0 zh~fS)zw3hj)XjgdOwnY{rQ37EyO0ahbV+|7an?^d8?f z7rTB&L}2X-xrBLYbT_KWVg#O6tc`3eExFz~9cHPoxu(?d^hd5x@cGz#`H3>@wtXsL zpsM6o{Wlki7=3}-W@D!?VUP^R>ynQO_;kj_rRT1DAIQcp;JrG7cc2LK<2!KV@3qxB zMQ>KjsF0hqXrwDvt5dZTd8yg)PJfsikcwfqED-VjtCmO;02g=^q(-dvp);GcX4qp+ zLQU;H&wKdQBshQF{ZD*Y!j9LL%v1kpOPmG!zg>0zW7PiL`}xP*|CL|(4`u$L3_gcW zFvkCrSmGa^`G;rz|Hw01w+5S`^R!0pc5aR5K+cvBz`WT1nCbiW)9xDeui{gj2Hbv#D zHY&ke3zK9VVHzgyycf6I=G?jZ?Aiq7u_^fj>Xkd#*}Fd!K{HPlFJZF*putCUoF&05 zrM$gUnFhT0`0BTCi@fe6gM66#msWL4p(uJ=7?z~>6?wk%AtVFfT7IA_J5ybYmG2*D3OU?aEP5bU*hxv?67Io?`sd-ux zo#`+Q)5Oq*xu{&4_Ueb>JHuHR@cIEJ8rQXc`=;I4@8Yn5t&I9d+CH87?g=Jw;PuTy z@FD6rp{WE=Al7sk4>mer!?SoQ#mZcr7~AyJbz~D3kQ&M8f-b z(RRa_jA4I%=9O9i%L9n+x=bJ#Qk1vZ|T!j{zUlOx$S@uy$= za>~4acnKj1ch^|4jYF-eyxnT!s_$9Ou3GK&4oKE{gHLN5B^J(jhZP7U90@eIc<({i z0*|+OT4CM%#$c zy8Mt`Oe1F%C^0geTT0cnrw!q`c_DwY*=E6iKqWts)wwUTuE5dedZD?pQ5JZ=`Pn|P z*`4<&No>mb%F7gUar4-+U95Q*9F^*yr!-P`M2OOGXe?n@jBDrc`|ySHw?N_x-|~4u zrppJk0XNhzfDweZC)#+}+^^*~d`?vPP(1dNt#Y%F?Z`R~P0GcAAt}>%k8hXf&cEu6 zUdR?+eUuyC$w!V>$FV^+CtCu1R{N{yXc81- z?%=pQ9gl>SHtW{*bC5E^dq*68@*S3a;E6+KHdBeEpTycZt*h~OPG-MVvIzA`-&*VY z`0ep?{jJ5tN@JDd?s}{u5A&~p(nn7(CNdpjI)_w6=cmo4@C1bFLeU_96?QY;b4aXg z$N1Yda4MU%=Y8_uzKx@IcN{dvQEYGeQ=ynKcCeqwZ z)?>NF{?s|*{9~(~*URifO~~e8L2twEus@t@30kSCb@@FiO)YZ9`0MKhMVb;0t!$Ydw7h`f80(1rGGS4n&QT}^azsn} z*VjjO#|9=hogJqpW!|vAg!pJ#-*LuR<`1wUv*yCv(q6CV>#cqPZ~I9OU#<&wW`rkd zu*>W^E;WGx$t`t{>a)V;`Na#^pnNqC+Zo};AHj5q)|;+d?F0xdYoofS0Za z+*w#&L_@(;WcO!`p-^n37|d<1tW07j&8$VGB43MlRgNo)7-D|~A-1iX@aI}8ySzd3 znhU$|>C`8cey6JX9njh$CfmX4{I_n<^}x`jRb93%w~GBc#&-26++3qDizs*ADHXO{ z#s{fuy$vHDIp4bJJ2!9%w?6IE=kx)(uM3{O-QopPAK|TkS1;pt;=77EdZ_n>1`j(YXtfwr#Mu+mJD^l>ba&&HOp##k z2caFMwb05S_^7+xLl+C&EDCf!v3usBYWaabTOzs9GIr zeFjGM?$}HgcYPNM8A&f)-F$*&ckn6O8r!YZ*LO;M5`1xUm8RD+-?Gbiyuu*29r=sSg?{C*{{%3M^ck7S`?3aIr6wf>F(N@1VF8No-xD!KcKq@BJJ0g=^oEpknU_*;;m^(0WG|0tH;h zr`y$cxGj(yN!Iz5cc@->>N&{mq;)07I!jbLDi4eLRju~Bm~@$aNq5lLw}Yvot6CB3 zW3?*Y4u&hQE~2QZ22g@)-QcB|Y0Mp3=BXKv=W>tkKk!C+s_1P*%3H7b!5Dj*CEHzh zv(1fed6ux!wl#$N*4_2(7zb~eQNz~A^Kn$L(iQucm+ac_tJCz38-8_N9pFzXv58x@ z^IrK>xV|*3M)D*`vU|p{Hx>c{0 zAiTQXEosHGho!eLGUEAVj2w!(T@l)vYa!4EbuH5x3`!~aLzISMc_>IiY>22I39HD9 zk-bQ+&;O{~E+pN%O)>76p3_SElSv^6HSV=za|h4EMz>GX_L#RwRk~qk*`?zGg!o)f ztHszX2vr&(WH^#k+%J`V*?NV}>$N-*EU{Q@;5`;jm&*)?vQ2L-KfYT@Q&#-Rq=0{I z@(3i>Mzx+ZvwlVI(nhj8wtlH;=}^;i1CRPAJTHrVF|_k3QlgnBi2sjz;O>}%N)Y;*4-qObRH*)u+AuO|&HLR8SXj2I`5 zgM2ENOg}`jwozzw^3)f=TwPuaTr63gLU~J5A<3!K=${Z>A!>MF{j%t=NO;@p%jzIK z?v)OoeQTbs%^;>6{ltwm3kw=0vW7oY)~cvAOHT(rY4yZT&%v<~^E487AKJJGB` zetD(B1KZ-eC7A{jdM=DlWp=mXs)Xxk(^&)RNnTrQ)d(d$zldGqmyj0y@Ri^FDhoP> z4VyYf+Y4ji4wMnn*9hwU;#Z#%ad($ijbXVNYISfrCEI@M^VXfYqQWQNM==RYwJa;z zK?w+nlhKlk)vrgBm`>fua(L&>OeJ$^L}2>f2C`j!*Kh|x-Bz5MYOT%l^20*gdCq*% zZ@wPXcufl7=6hzL?FryOwZ^QK4(&1OED8?0Yc(1ZMLHzQ=4|1$CZrH|NBb@Z1RtaS z3WCf1rF~mar*|q+^(|+}@xIMzP^A4btyV&)blGOd@1i_U(?z$Pw(AC%L3XNsn>q|A z%Dpc#XA~@b62AKo`{}&*GfhzBnS{^jbNv@k=*fIIgCSDwa?V>+?rWGYyYrK|bOxbR z$8`f=_T#4`kW0}b2usYv=42XCdWn>FAZZV-PGbCY`p8t zFElQfml7db8B*&=?5D5fc30vD$n^_do?@EgnC(Yia+K`GZn1yNw5+)f8uM;^o7=(8 zHL$E1#tERe#$~Dw>_>*#M@|O`tT)GC-6qP^CZRqp;@HL~gCtm{THBGEV!o#k5_zq2 zCh`nHojR`a_1J(fg$bH*E@0~ZL3RC&=_`kG-$pe0i$m{Xw!v_y%9m2BY3q8Ar3OlU z=Z-dS4|U5sh=WGm>+1uqYo(i**Li)jE}b#?J{(falA^%DICz*{5O3e}<&#Cj+fR~$ zxf3@sS8BrbK5NVbT}4POKF}}@4K+Gn_J${DCSwF5@2V!ZvrkC69nzmhja>16+I(qg z2D8K){z0GV^a14B9Gb=Oq*G7*qzvob9K@Dq&ojC{Hs|r!_&QL)n#GUH{Vo5|6#^FE zR%5?uX4@^Oy`%SnYNNFx{|0k@yE!i+O?>6eEAO^a+^Y#^g;MoRIpP&dN?W$s4r>^YKY?Y(mL@FCuM{jcm|uaTVUlG6;7>GFG@ZJ4CtfSc z$JtCxT!E(P*es}2{frWH6pNA6da}Ndh(KJQUrgmLG&!?$c3r_b>`$+#nHhd2@7k{H zO&0BuYrb?)(dZ{z)@K|hwX9!n4Rv>q2L}263@O|7%obFls;Z-tf#{rbGpsQR z5dB;WqDVnM(@|Q4ZxT9r_0VOGZzX6FH1E-8GiM!6ugw-a??i;C91TUZd_VG{w;*$T zG@z1NFy~2x=ih}fB0to?W0@9^d1w?w2 z4x#tnJE4c(0t5&l>&EAM-o4ki|9gyeunyk?jwpk1=ep-L=dVrt*|=7dsV-ECRn8NJ zN+u47Qf5r?7~f@RLS7tK=)G`*cA8XWy5TxxsBi6jE;ep)TeS6b+ysd4D^(J141M+8 zD)?frEpFuLa3`pf{T}IR*edK+TNqy9WHzLAw>t_V3_ZadU|~SVyuOEnpR%4(UwitG zeLr12%II!5!vq{Vna46&@L{ZW+yxYuv)i>RNUa7O_?QF7z> zO8p(c1gF9e$We-e0T1}c_m`dApz8lNeSGzb?#MeH@`S8^zoU?MQXFYpvOO5UP6BL1 zd2~8^ISucHSeJ|V3|khQy`9*Kx|hGj8)hEUE|kU2dZU|z#H`2dQLGn~2gnhTSV*l} z5s+ussZ_epRw=-?ljoXq#;; z1k!A70CPe``j6J8U$=(x!sxhX9fpqp7!GaeK1d}YiRfa!+!yg8EELIJHQlb`@K?e^s}DgF1wK}F(>3tlZ^d#kR%hZq&xm49yk~u zM1@h~xvqspJwr+Xm*H#d+@6>{88r4iZIq6HSw0bR7j-ix76rI#{pv`ZB6d*NDxLGM{H4`pa&^;|h{ku#3XN!w2l}b9+(157P8j zWLE9!@l0w;SNqG77dG$1wN>EDzlZ~oizs0Fpsd*v&$v$?y=@No#*0IfbT88O6Q_5y z9UT2718omvK~efa(jvH>sV9aF*Dq(q=a*9rpz#X*&s6vtd>)%(d~tqy`sJ5Ixzy6Pf8vbaz4#vH4`F2;*Mt}zDZ%WeyVqYFG5&d4OCMl7wy_;!*0!i zxtLdy5x}+p?Lp6>*T`JmlEF2%6#y1%41kJAVrI~?x~@p;@x7%$hGlGy0^f&DNiu|N zhTx5kKmXp)4FX)l)5bvdOU$}?$GrH%f!|+jS^CC>FD!QGC_$9nd{}cMHDEhX+4a0jC_`XcpGeLpus}iJFl5AffYp6?l$EW5wqi8iGThqC^)wp;0P~npgZ$ z-SnT&G6lucJ08(9KMrDJQ~Hs0JbtG8L+n*GOF#!t3M{+U)Tpb^2Rd{%B4l!Xna73e zn|6=>S=Y-JO$qqe0ilfDgh}C|@v#Co6?Jo{u3bew&~Dwmh|fyxnay za@xoWNF^@6T;gwQ+0b3W_Pwbmci#vf4|0&<) zbxrcWJ(nL|0oS#rhdD4ttFXf?M9+&BCG;+*FwqO&MR{J`#(DOXQj_sz<@{zR$idkdXqIXs2ZUBV`M!%#&K>(bC}^nEX;G zx#Q+X$1vl}WA^>yG@#!KR=H46+R>~#2Wb3LJlsrvcfqT|MWG@dX`w7qp)eaH|SeXHP8 z`nU13+VcajV)crEXKwzn9~2KvP>-=2RFg0IY6kt8S9jHz1ns(ux*qYwCKXDMAr6q~ zsaPm7ayRC5DBUb9@&cGzN^#=DTfI898Pmed@b7Sr31K|T(EM?X1y!q4P1-p+Kjw8qZes5Yi2qxL&u?G8S%7}ctiXXY^Rin} zP7xGX1LXEKBg?7?U`oh~@1}$?Xib zpRtbOKtVeg!Pb-Xu*15P)jeqUbx4xDYnmQ%y~Co@ELua0 ze?8dVqRu4wFc`?|TY0j#Ih~;|yU8J+#2AX3Q~js*{eLxCQGV5r1OC>&FaP8*ND~3D zSTsxi>P7A>P4)m=r;{PT z?1Dv4Lb1PQ!P;Rw4w!@F`g)713=yO*FD1JW-?t6vV`omSb?ziIsN8{ka46t~f#21sK54!+H1Nkv*GUo$_STe9V9s8#xB2*Z;$F^8TQEJ{d;3_)VR|!IrbGsJU z;6hZ`v3gEkgN))%VMXT-t$x9PiPjfLQRSZjMl2)u9b5&l8ra`{IZJ;%c@#K~$r2dc z06c%ub+hxcvZRrA!2?7`7GZ7?m+RYZkE3Oic*g)+B1z%9;XwKZ&&BRrE+U}wQcBZH zI%zSXUI8!NP0!~t4b}rtPVKGEf-Q z8QoNGd;q9EUwa2R2$nX6e^8Yax);JY01()3;5k0KjGCr>*=)`5R#jK#DZ6W#_kSHp%l`8!`2G zoUQ2j*Ysv!(9~aapUxNYFU+f%4w98IoB`nGK?LGAAJ4W;!XM{x1ehj_vFMf-cdn*ZPwsMDT7KnK2)p zg41SgrmdTRuua-afbmYJDx}wc3%v`kkA+thw&<>-Qf89tvFvtsQ_&O3V|g%Mb2y~55)0D;*X`{r z?mRk)sj;kFyZ8Cd{Hwnb+^FoXC)4lKfFMa9D(RkYZ`t8a?%I$QX+Q8w;}R*%6!&Z8 zH}E0RGNAi}hCz3gYoHRqs%-XPgv%uY0xTbYt(q#hm@B9#JOI#j@jwxc)%pB?tRNV+ zYP0Yrb0K!fcYWv^C816cF%&R7_JXc*N#O_Tj!96dBEs8U#1YfGl}f-LHE!y6cTJh8 zI~ed8Zn~*-Uf*QD5}9%fO8zSE&H(*?ZohXepR5J+t6p)QM5r@K+C*WtPM?YaHN18MuH)!xK}-RkHU zbJdG`x-tZnz=fewu`+A3xmqU|57V1g+Gc^At;s}Ngb)h}0`Bu}=K z3)?6E(cUC=nUtC?GA!2+@>f(Y5*6)Tp85P48RC*y3T5^*4s^W~OtYgFODKi4LA7TU z^?r_?qJ6v+-QMO&ANsZB`*68nyl~PvZun!_UPQZy(u=bsNBH}LTMU8Rh4sf9MFTI% z>5k2a{-KWfN|*nSn9-Pnxx;wSOx?ZI9ljIACYPnRlybAWm7-KW1n?L-1(zu?=wP{ng9cnkRkUDq7jETxT2l6oL z^J|1ZdYn}vJa!Z5kEihxL;44&Q*B_%gT86*)FdW=%*g$S1%OS?)U@xEvl@UpbSca+ z>~OA;CG1v9eaTMsLT0RiaPaEWzC*q>IY0xPkps0oXK~njvC#8OuANKi+RR^G)mg-x z$qq2rrq3f1%FO=F0^orcRdkvXHg6Wz51MZZD(9Q!aTKB^oY3B!Z~|AG9qN_iew_CT z2oJo(P@pOd){oSYjzbNq>q8XVoVr zLWcTIgg&?YSF(Q)d?U7OtajNVhjuOW%kGqAA)O6kzq)9`IGFDGr+<$9_m5Nbx}ND7 zPbvYRs_BHhjjoTAXI5t~+J3uoxPa4jw@Y-W#%9HS?~_{@Q5bk|M}(txchSA_$$a*Z=6ewk(=EZkrY5li)`w@o0f_C7cXDwhN&b?bVeqG7Z{kkYtAbsg+>XT` zL>2+?JYBhyS)&%>@N|YF5p%oRc2XY7aQ(QmtAmEy*QDOnN!67Dn0|;3zFI-vyHxcn zm8LvCBlL5?4u(Ca|3_K!SKj{fc`5K?xca)q9J`^fyX`;Xx;vw|{0FmAb#B&c+goUv zB!iYOp4$*FIa`YRM~T|y+FEHH$cM|b*}I8uk3{uurU4NQC4apl8UMfUzF~TZ$mYMb(ki;wlZU&S-Mj2=-}322mnOU$wyy6V95f7AYw!HQE5JYsFz^>CTSz>(+`c zDZ2WLUb@S~gNGYol&1w8VUoOCXZiX~KZE&h*C@sGOJnsI9mlAfzr{c6tub2(+h2}o zIUv~v?)03s6M*WsFz(aPe2fr2jr4GE{gF2bZ_Ir?#1Gr8!(5VM56>4FViUvMVqhzE zhyb=TR>y*on;e>su=Rq|GKaH3EPPdmu?wL{q>kWq$i3e6bY)6in<~hJ6}m9?mRA0k!lX2w z;=T)F7M7hV4C1Ff#f(F+U8^lW|3*~Xw(Gexi^E!$%8NjWjKZd`Fd#1Tj>KO;DfmBt z(myF2KqL=oPa*({KgOKYj3eDRc!wM#iZ*g`ed)CH1RR$>J_ndRmVXQW^4IQ!XYdov zYf}n_J2RMOqyd0KpnKt$Gze8UkZ)|X5{>npt8*Xi**l)z^}W<6EX=y%>6Qfs9JGq~ z4#uEE*IDo2ac7wNdbT+zx)=JxeZQ5VKg{)XCAMFxph(^aQC2fI`I72fG7F zs@)*Pnn{x!o8>J(ufLlC##5LMfiCjV-eu2jmI{-`ybA00rPI{An-?CeP<_zpkT)E? zxd?ck{#Wo^ImEKQVK}JEBaqmi`%2zniL)`eV2md-Sp949N|HOcmi~c8Fi{6y^ zKg%c-f!ep+{iv532&4PQCW!efrKkK~4B3CRlLY^@Wc?p(a{o0M{Qol${`blJ_sRT| zF!xtX{`~)m>GZ#6=D%m=zh~xOgXRBQ-sN-naRK3*;18C>vP5;7ylLY>M-^a+R3aQIP^=uPHNnmhdI%@u1eTCRV6&U9nGR`vQjp5L8{ zFoWNBzD`8T1wE&C(^(rDSYUqMDsuk}^8SaB0D&G+ko4)tpwnF#b%IJ3)RfhcJrN1V zHv_}AqUorHrm)9$RpO-6aL8N0>&*6zXYWuiR{DI+w0Jv03*iz5YeM$W&b4OPvLqB1obtfNv7`giXan~RJLpoC&m`aWy95}AE`iF zX)H|7fKzzGTT$)~`L!{Wktf?pWb8_4Nuep!+Q4I*@|pRN{OT-5`bjG6*bgRFVu#+SIo@wVQ0{HfGx@my2Een6P{~NN~b5a?ibcJ?n!_*ubw|`d`~~9{00R z-+L2|LYUl+oW-6d>$pYu^*&YNw;nUFq%4iL_Gl!cA80*F@myPw?}ebii)VvnO7g>} z6X`#tL#j@NMTmLJMj}^xo+$?|D>&cd0;~BRsZcUT^QMiFoP9 z_2>xl`&QxFPzALenayAUMn=h*J8n@i5G;| zWkvcc3mS`_?B#fxc5=piRnK-iRacR+bWeg6Y@!;j;CcXOh|WH&Aed?n)(`uI{6zRu zW)_arA2S?oT0ufLS%;4*Et=aQsFdVbBN9p{iOc}V`ifS1Ij8;ZY(>0g{s+Yvfy=U# zwn)=))%yq%mrC5R{0Z%Un~jCPvIr^p;td%ULG9u96#_HLq-peIEM}}M7xEFuiBJOv z11Dg^WMz2n`@_^k8EOz$&d_cox)-n_-B=ms8n{07<(W;-+7I*G(RhR6rPBAJbnZpP#`UQbqUc(Vf73eh%+Fs+} zOxFwe>B@V@`9{{CGVJyzjlZzj+;XQ=H={tOBP@d#6H_C4Vg||$!9>KYmEcFX>UZL( z8N_M?UTTM`tcfhYXLczUeAR!xB}zr45OLdc+3obf)4^jlTuai+EJ zSZ=-reX%m8?N&#(#T@tT;UoU`s?b!s!m9J2T>W7!gSm05dYtfz=$m|N&9fx^P15@h zp!jBLQ;bxOm~#MCK)ek%YiwFF96+u-O+DkKrq3-SWP2=f^CRJevSSZ0wW_?}M+b*L zH<~=|y?9ItedW}6T6ZtM5+b7ZJF8`Sw-yyT<52af7eLI_(;1@AYTu=&Q@(lPFrw|l zV05Dm=^U)HkK_?7dS=C#6$PA}mkCrzf=7tEgZ=4bl)+c#AHDLe*ln+>gXz5*Gkzq@>`cC7$)>=x!OBkUpbTtxu&*yzvzDFivX5S2>bh>-313r>R0n{zMHDzV$I|scLGlQ&6 z6~SHhJg1NsXA?I}#G$438l?^0FJBM+-){}SuSJ3r(YV~$T|fJUMFeUzE)UReD>?2! zV7>QidY-*Rw0V<>X^c~fLzfD#$24IF`D6n!dz>D$Ed&cVjtq`=U*D;73#Dx(P;fF4I`iYsp5Vm?zpB0_y^fShF@w{e|yzU05NNAzVSN#v1VKlgr$VEO~| zxwq=|dg8#TvY%1(GcG9uS z8e7Z}PIPq>{R9+dIWYl=pYtFEXY0@HzASB}Pi&*wC1xw?mIlAC+j@3LJ}V=1OyKJwJZ_qGp+s9_eN5LT@*cycOUC?J zqgFg1)YC30E}m0=_kA&`Ty3Y_oCTp~w)|UnYsh01*Iv?RHaSZ3NbG&iLX~jOVJUt6 zUS@Me`F_*E6ir%lh0C{~(a#iANMixT9PmS^bRg#b5xDD-^W58|y=X^6Jy()}1zlHd z2FDEEiSCyu`2br2I%N17N;R{XnVzsn!B-F7`wt(*>Kg9PDJ`T7&LNzgaVr` zg$UbWGYpZGynY88mbP)W2wY!Y>2ZQ7x>s1C47HP?z#cDRHH!hoeMFQwYw0@Em7cC9 zR!e{HS_tOXLKb^S%-{7$5bEQdHGWvy$;BM6?>hO=g+HH^mMejOYfk5Jo=pG;^|KR) zvuG`_2!H)Sg1H4!Zq6aNR}Z9Ht~X|Mh)RVg0J|iS$>e>+3m|6O&&LxmEe>(zHC*%4 zS%73OfNZRzdPcH`d&0(akU1+3rmb{%>+%_gXQe5#75&tV4HdzJ?>TY zbZ2{&$Up>@A9FycpyO(fy?DFx_D6c{w6lEY!B$3idno03-!J7vo0u|e?G=EZpX%kq zGt6~w3t@HLS0@?tXp_UF#9hQ*Gp_ArVibAu<4Sq;?v5**F*DSEYF|h9*MEjH4EIpG zi0#L?B$eCL%NIId;YB57xL z&6Db9pA~J6RMAGzbyMxs4j)7GbD3>eX!Lo$spBoZ)Mj`tJ707YIsf#EBv{zd6Wgn2 z9IJ;);j~ZBsXh3gG3w5>_;d4?CjlJuY{3qlCemN5)-##ghP#V%*aZm3*4eg9nx-v`qWp%2V^aenk49>}vZ zE$|2PBP!S3-e7O9+~`TcashC&*p`CFwd zjif)(turnZm~&mJ77ZZx2K9G&fiqx zwb3jWCYz8dFN5kLmgPZ>`30;{jz}AW2F*_-aj5$Z*NIbp%G`y%AE(ZYS`9gySDHr` z`9MEgTQ;Etw7&G4c=8F}2d*6Jw%(d*8)=j0<1)8R78N8s4Mngs4!$7Ng}G)CD#VO! z!n!PklAkb)9bRa8mCD%{P=PmXRkauJ)d3oZDWsBFtg^d-9U1-{dx`=lNihpcOb8Wc z9ZroE;NY8i`kTS-j6f%TP+7(VH~Iw^Y7Wu0N-xfuC5A*tYYhctNAMk==HKY?gLgYV zzm1Jvg@gN(%*V9r%9cI>gIHjh*a$S{fEA%s@p)lu&W+7ubK7+WP1J@Cm9R3?G=Q|; zu6*}Sgyf@ltY3Iqvxpa&jf?mRe+}ST&6kZ)>{ZmCqwZOQO0A=3%sR~_>~@d) z>*t4(V6iY(-u#*Foqb=%BV6btbQ{_JK)C* z?GuFmoZZ_IWyJWy9LCpPzA272;0ku5w28noFeK1Jf#dx}gU_+0ghyc@xm%G$=JdW8 zwfDg2efyEGcU>ftB1-@Kfck}&+f(@d87Bje&+{;oW>#w%#!r^Ir*QXHpNtiYR7uG> z`u2>F{tJr`D2m2|#~9rv^K_7Lb(n173&Yk((qqrcv?-NmHh0zwe;=1nPctMTyR$b= zX<4rG7n+B9iRtdLYd+A5^lW_RWL|$IGM{G2ZJe6T@N#Mo?fOIb@Mg|6L~S#Jn|Ooh z;L?^OtNe(Ag6%)ct4e*XyJ?Q4k5s)W`UulP&G}c(MFwFdDpG0Z5UuX$+-DyxF z*3yHN>GFy0aQ3V9>cY+rpRk5@!Bkbm{m{&YC|5>L&Rb8VGYi<;7c#_pye?wn+SxoF zC7^J^)v4~rq23exVcpzJ(n9Xn9~;pp$>Mub|#QOwsP4+ZoV~CRR)SE zI}9Z^VYg@(pkIU1$r_(9xZ1y3gju&1$aouQ#4dhOsT|oG7!2{`x$amM!#G|xS$GjA zF|KFZuL|Pdj3OAr@kt@A%2rlCB$;$Gd!X$c73wd9_FGW})M^;0uJ|+3gd#zWYs&aQjO@J)ZScI4rt`%agzXE(m&09lEWf@i81-W~44or*JX&}4qZU|e{xBEU#L(xfu{Ewh;S8vN{+U1D z(JHUT3SBqwue$0e_HwGwBiW$`Bn98Vl6lqx!7M?#SDwdwdhE}$u;)4{(!T)2{Vw6! z`_OOm2*A5!c*pQ=k5K<@kU4SQQ$mJ zJGnj_n)wBmz8{^9Kw{+-dcn|u-I`_4kh_x8xsR)_@b(f|A~~J<#5B)(loXmA%)sk^x?Y%8Q6|Ik6q)O86Z; zslBJzrk5(Qd|Ay5=x%!5?d4Fyo)u}57sX3&!76`n1m zNX9tRtrKUvEw%k2=q?Y?EyO`a#OsP9)z@^$9h(;dSbh0~*Pa{51=wa2yL||-Mbzu8 zo5A`gpPBaj(Jf=$sP^$d&C<5XDXWw0CcD88_gnc~hys<=^X}Y5`7x;Ik zpB+;kYuVYHUHYb;x1E0`qE5l?Ov!bwBr%>A=y1RZWrdYv7DWxz@U5PZ90*fE``!;9 zS}huiWSg72r0dv{N(h6y-?uB~>~Sul)s}*7cZe}9W$m$jPmk^9PDqH@X}uZdM4fys zukvu-^BV3Vd#x=?%|dW@9dczw+i$&x4V{vHr+FV=l1sQArn$%B+#RE;}<-8fX0o+4q_FEkbzo zd2jr)EJeWTFm0=GU`T=*PTv54MF+S`cITsW9AFdE0Eh$FXa&-9^Mcn+ zqtvuFCqc~7bo3k3vz%WlsRlyUQ-5-@)w48V7pEu<^g{bVL@&ej1f zgmoq|_jd?_0ld>zCg_E1)F335U*UF@P!H1kw!esJ{aOel8$lp$qmQ=db3Cej3f;hA5X6pM7Tpt{sM4z&_-{F38!{bZ zqjK|9#WOy9suvEL+Vpf+aV@+ho7A6XY5TRyKD7SgEb&%N<;?gUl%c_OOylhF1oDU) z)~vTcJfpPF{9PdE^!XQ;`U#3TTG3|)-dOgtmUnm(uSBnO5_v+`D*-gpOK285IX#I~hP#DTv_qL>o;5#A z(pApANeLNHiSsK2rkaMUP;y1~u!u3xhVW z?F>Bv2&aZ!)>=}x`Q2JHf9E>GDpzlE+VH|}zG~7~zN1=aJdV1?BZ;NMW>Af2hXZ$r zGF!`JN*yxLV+n}rH%bdA=Di}ij-(caAYSzC0vBn4ssHy3a;)&5d$jja ztXyACK>QCI@x`;Zm#x~M+x+cY-Ad$Dg&B~sAcD_cqz5I}-BdSEzwg|Jt2p6{*lCv! ze`)i*d+1p1Id>fsPB87$!}E1J=f2waM{PK*jU_f{dnKtD%S~Yt>;5l&X^kSwe{jp{ z{cHRgC+f6{MGk^7!7|$9JXu@#<;5cF)QO zG8g+}9+>rB4PjWM7j~%y-&dNw1obMrhQIKbTp@Hkr*bQZL`t6-X>CX4eA~R?&AV4} zgXNf{H%RQ(`jHJp|o;6gz@_QnfIWx&kmu3Z6F!O=?sIJjIZKT^WQDgx}8rD zXB(RrclG8FoOG=1o@I&YgiFzfS3-N=5$N1vZ9y~(zL)>_B&K6III!LIeh?dp4@)y& z^Ic5$C=D~e#r~bQnA5@}T*-;K)!r8EQx5wq} zJkR1$7QZJ77t$SWsFGeZ$L`*zlalsKJN!J$m8}y0obj%sh2`+uXY<)@+elXy^M?J0?$zu`c9^vJ~XwqJ&u4wR~14e{OS=Hh3Rh5Z|h!y(Iqa%j;!Fp2xz_L6`qo11j_PfLgM549!D<@go&Ez59XPGz` z%?(o8Ht$NW0IT&_eNzs#=2v$Qrsg`vLye>$uR>by3yQ%H2f2-bvqY=LCBQi6G!T_` zkt4I&0clwvfXZ@r4*Z-RF~atav~l;_ z98l|Y85o!_{BxD()DIrmNGJ(Tc=K7mB>QO1LL1Fb1CBPFHryzqJ)Y~ef-)84*^_m0 z;0<}7uAcI|-tcBqgL+uWov&Y5*&alG@f3T-ydreH40mC#@_otgEW0q;Mg04j!4Jx4 z1yoN-H8AS^eJOa?u+6(JW%0&7DWD^n8l+9JUZ*Yp_x3Udszqe;kJPpwT#}^Jop<}V z+eiB(@RUx24+WK*H5T1&hBCD?SZ;>>Pd~3Y@|Aq?>%nP&@Rtp-W?N!^?jC#`&ygZ; z6VS%dDhx?BjD{bX=jfgPQdB6TnzTA^eVh^ zO{MmEgi1Klz?uqd4&sx;8y=DqAs2%8?`@y(S1G^_<((QHDz5CciZ(G^90VXqPU7_l z#kh84&kWRp_J4s52YBW>#M)ag54`Sr1)e!LSKZ>DBOebOd8#n~JKX%1BwEEKeRuPl zE5eahnLU%w^`<%PR7N2aBZtqNrg-jyca5b-a>1uZLfns93evE*9TI-opPa$SR+dga zzt-wrT%}y=(DM;1NrFD?o`MDmi;0wa&F>db$-`>Ha)*6@cV`TNk3 z{`4D9PlvmX+fgMkZz>%+r$sbos!x>od!-Zv4V)v&sqUcxg1!cK<>T&EnBJDTi*hQP zsdNpo|Ftc&KkjOg=fzu>{@hAKZr;Ci?EYQiif3jigT0ydxC*P%QY9eFt$a18n~zM` z8%I?nLIC)@F;6GbXKg6MJPu`mJ3>b0f^QB5bi+|MOezuL)>`YxT1+v#h zdRH_0cbrqERS2+ThAJea?qDBo_IhxOSn-yRcioY{9_UFH1%RHxg(P-rE27vfFw9a* zhZYo;4=y<3j(RIrH<`dSQtHyl2l3PO-JSxAiiLHnikH-0^&iCb3xuI(45$wLO|GGlDz#G{N z;D^Ff5<8vTY){BVY{-D`rk#%ud)Bv{mBCkdW*$ z!znTJiiS1UJ)~|MXHs-c;j2pt(E^y92v1fTVMbg>?K8GxP z-!Wsdype4$Sswyg?Gu`|((O&eNkNY)AGpjl*$eFs;Reun1a`|jmAh}KRSv@;DDC*& z(0tZ1e7o8e8WF+JxUP5k8)3kMn#R_Qi06*IX=YSS6&rt~2w`ER1Zkw9Q+F z&yQsJE)Kf02QQ{>7$(iQHIJI+3ypUSM!6h{Mivvbk}kC;zzd6@?}yR;XIdFjS@m>g3WOzf>aWVErg;kYRMrNVokEQKZ-7Pj(AJn#efTLy2_)aKV*g7HD z+Q~3+V5tGg%-1_H=&aa#+1Ad_3`ts=Q{4WLQ2Xt;L@jLnkH-o9L1O-QG2JJn{E>+? z9H`0MSDychg@iS}nSISKpKD#`+BbSIu|3{H%AK<6B;h35<0P>z8XJl=tB@8P{?%{i zQD}^~l;fqFIc1B})am(vbYh5Q#0FHl-^MKJNoN7>7DhVA$A&cX z?Lb~E0cmU!ah{MJc!zgdNeIU#bP&4BbJyeA4D1`tZQvlz~&Y|{5A0jZo{^Azg%p`S3Ox<0&tbB!Q1$- z^UFSk+q=SLm`z1CIRi!yngjcj4F#DgMcVq4^QAGGk(TUV@z?wWGwn|-vZ@YS`G`NK zxS#2u2V}y;(*dGbFUX=LdTnpi|5kmoHAbo>;yj#YdYsj6w5*Md9S)fpLI* zz%HWNXT=&1+3oUaeXf0>xVJ`}Y7%ObYVvv4b&|jlBZU!@+IDlgx{IV8n}ECYqmvFD zum>%n$DCx>-i8M`pK$4OyB2-8nB@HV4HxvwpZ+WF>y4e7Z5FW{*-nJ4b)Q&8;Yam$ z4x8$^yow!hWzgg6LzVgtPaQtD=;!vevwf;|S%0AMMt_#)C*f1oECAtXIFsz@CoF2~ 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∓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

9#riY@B55@P*2z5 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%0DV!+5Ru8+&=B z2x_<#-H6x8YQstFTT8@XP+#TwdD!iQ(%GDqN-w#edp3~E(@L+ZqY_VoR=8f)$!-W} z)Cl1@W>px%fN3sizDK;N<=;9Al$TWG3bu5B1F}UFXGVTmUroZpr%3argJuH8*bBl< z;o=-2*NRLwLVdn({kU4WR?N>koPnJvcj=D`4i-i268U_ABo!drfP$V;djY4G*1b07sF}JPw@yla6Tb~TiM9)&E8)MHRaC6$O zs<3r-`B$R*!EI;|ZN}K~-P-k&;a9Auqg$AM$XvZl%znRrb;*s%YP1zlS&I+Iey`g& zK#~ykEIJsYHvWnI*q*&yua+>25hYdXhk(0hsg~+|ylcA(nSC5Z`I$VPfsF?=+N|$+ zwdxbSPWA{%g-3|OIlo_Up9}oQs=1$S9pQh!_pF55$6pg+JZr^#*gWGCJY0l5?LcTi za&nI;9kSoUdf*7?z0p@Yj78DI{ONs&&G+wpl>6$uax>1t-|i*75ruoiGvzZQ!IECe z*t0OR(3*XRs}l}1Jn zq!^s^SnE*jV8}I1?Sn#D&Z!rkSs88^X&yEz8n<85J?b?sLk7-a`7dcNhQw52#t

3M$@{usd$i#&OmKDdjnf;y;^&aUA}20gRg&F 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

+`T!qfRkMFLyTo=(c*rSq%mg;( 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 Ke%?L37yk!#6pX9@ literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/email-params-test.png b/docs/management/connectors/images/email-params-test.png new file mode 100644 index 0000000000000000000000000000000000000000..3745bcd3235e9319517f6190dc2bcabddab1ae0a GIT binary patch literal 173053 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

}Z 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

`?2}VWi^!PRP?03&b33z0#EH!eZd%G|t};0cxW@ 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 ADgXcg literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/index-connector.png b/docs/management/connectors/images/index-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a81a7c0e7618697415b64017de941b3906884d GIT binary patch literal 157290 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:vUBNbF+oNMo1X z_ALBZ%mx_d@PB50s+>QHOW!8Lidk$c%0r_m4NBmWRjO;xXOq@+>WpC8S);K`5WMB} z{pv4aN#aqxUp%4*4Rb3TUP6&jQfrf%V7sW20>XfJexh3Q*-`r$Xm-^hVKUM1lr!Z% z|2c!?M`WjV9*XdDkKPK4`-yIwhh?oBqgEaBXAea{2t9T`D^KmavT~j}7}?p?9g*%Z zrV^GecDPotRZ<|}9r&b2;T{)ef7Nz%&O(z>%NP?eRV>W6%xJKo%M|bn@ni0Pe@8`+22V6OL?KFlEYK|k88k_7<`Wa4 zZ1SK3qc&w2#GdmQ`a^ma1K!X}pB*)il-2Go2{KtNJ-2ewCc(9?B*xF`Nte_)v2QTg zk5|!h(L_fVUUGcnfK@E;+t+VLppj08I{mR6&t&z-O9Z%i(J)E7tqH-oxwl_jYaA;z zw44ond3pPXwOyz|xeoKO27j)Au;8b!X9qPe!F+G((;nBBoNkRw%v1FeDa`LR>R(C6 z)K@wma{j)Af55Z>X3U^xCiV$e+VT#`q`UM8%62&8aHTGEe7D?FgV-!CT3*L0$#Nlp#by}ZD{aFnTgeGasM1W;5`nJ~Y~vjKTdCwMqH z)g+WP{R8Q9zalfPPJHoETNu&dZVOf+=7+egE~bR?IOeM5e-mhg-$scV@+tMRZ!a#^ z?7K*3?$DX-$NccJsTGmF)@W;(%Ktz$U6lJOexHs}oONXvkgA}rD`efQyptzy7$>uh z1ZDc2f39zvUCa&|&e>z%^0P#rg>~~<=7O`yvLxxnwursSv~T!iy+aN8+9QRauteB3 zhIRaT=uU5ySYn{pKBjgxfUWjzgMt7LUuT|;zu`OoxJsUYZSX>yjd=eORcL)NLO_HP zgQ+%{pdGYlXCL>-)o?&L(AY|n#f_sE_ku$`)wC^1z)Jzk13ko^q43(vH?H~Pa|g$Ut4-QX1Er$HjVEt6g~@uA&))uma27VlEEOyH5Kf7SRWm=I8`V*yX#3t>V?sb< zVnj~6Gw)ANMosPZjbiS@=%>F8_kUi&KTrPQTQ-ejxYV1cnGe$@+`N> z0q8*O8F?wGw*cgqMYd}sTb4FlS*&di%0AXNdttd2L-?W-4^}bGls|wT7d<%zJQSLN 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

7ax^ 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%0D08DGVzzNId_~n)9 zHz_0z(6>_9nLF}4KSTYoM-cqda3+lcs;PRn*gWDvZSf31X-K?hQKO}&e`u;AwpXSN zqo=3$PDr?=r8Q@Cak9UX28iB0^6rFh-!zLVD>cmGmu8gbji#zz*@T; z*`PqsII?@6I~GAmPAVdw= zj<8>Xp6YGm>i0Z{SY+dqDlE7|!_R>`qt5}!Vrsy`#RiS(zW*E3B-SL2q({V~l@8usC1}*@k4-km8 z>=ZQUXA?m1J7j#PZSKyTUU@#Dwdq(KP(!lkI#<5twslr|6GaCE}p=j9{LQkul&Q#U{-Nn78%y+mkFz zkB7-H$dUBpED9H!6AG&CSZ)ia!gT$XWof+}4s9Xu*##M}!EurvvC^&FT1eAT>3noZ ziv$kyo5O@EIK0M8$Zz{e7!mO8%0}aRN3F86@l-B}Gotd&HuOGQ+u^&2z2WQKoP5?y zRi0DCgJ@_(9hD#!wt-hX3p1VPR<0m$Nr=WMOgG6P@btTK#DxxMJ{n+RdZ5nC8TT`j8m7 zI9uoP)RS*Cgb;fFthJa`JufFF#5!$IIJ)A#%buy&E0l2yg86xn03R%QChxM!p;yyX z*m%i;44ei(=M$E>^C;#{#LqTO=|GDUfq{v(|Eb>-D!9Op73;7CZWQ7C>kIoZB0bp{lIU#wFrIIdrd43pr(YPca>&p4|hqo=Q9YxJIFV1o@rg7t=K)Ak}OZ z+0ZxCby4W$_oi{+iS0aYtp+))tu(*U_bTzdYGe2A%W#nYN_zRez`Kn4=f?9lq*zCd zA0$xYq^N6eZ!5o;;`;KmP;lzX4)@`?eJC45`PyL2AOlg2*>H?QALg`DT02@0<%h23 zY__U$8`KkRUbI^>*evQb{=<2NC!6J-&eCcce6RpLvHps?`qBh|Uh3xfK`i4W+Y zC*6O$eY`Pm7|u7p=JU<|#S+GfRUpF-Kt9BqxPmbGT!cZ6Lmxa685@MgXVtd^bt5L~ zuU@@!07;}BrPt^|Xh4gFK}_&a!eE<8I)l;3L(-p5^3>xPLDxr=e^1$c2><>|S(=Wo z&EybxQ;?hS8aH&XQ}p!IIfh`bha>4Z!tP?F&<7B5>8GQdm#FHv&Kg+G#)j=}gIsTR z>y@nEZ1%jrx1rh1oQ87a=z*A%qp3y?N~%1)ea3N<;hXv^a=V&k|0(_C5+O#(&YGcD zTw0bHt~4w80pteOgP0>yn< z(P6P41f)w)EM6!J6_~oBar19C|K7LD>z$Yg;N%KN@Gg ztO8=3?%E!!9uACX>u}pX@&S}-My>DP#OCRQ9kE!{vAjB*s)NX|bh>Ugv6w&pGMOh* zY^ciKm+YN67JxY%~#=-E|R-BPKxfAucrj%JO^o+Z{r$U z&%E!!bFjQqT|~(uny`VTS7fA%9bEo;dw@$?9;kr&c&Uzh{`k z2s{~aVq$|n=xF5`dEJ*)UyKM>ILcLM$U@Zv^^9UvpU>AMA}uX(gZv zyvq|C$$DGhY0ayhNz9<&⋙{H=>*Hh8-r@hcdBznKDhL11Wynoe?>9gA>9X8VryQ zl!%u)IuU(|Db=tJ;d}f!j--nvjw>DHjciX3EZ0>u&MAlpI`z2!of!NTF@|G-&CNiC z^79G+B2^*uYZ*1zWva#IGQ(0!8*mmzLROxc%c0rmw@U!xt6n^Xm_*UaA#VX)K<}{g zK0G0gzTA!A?LaFXHyc%k#RABQ-6-PJgUQ>K_(?Iqu16T_Po;lavUPe*H4HU6$FVxo z1?f{p4(M$qgH%Dj>a9=ISS9@tomw_RPe~VMLvTr0ngIKr2Ev7`%@1eBe*@l4ZOAR< zR^H}N1TSQXME3bfNg>Ac$UqM1nW-7|KWe{Z=3aJO7(j%lJ$Af%I;o`WPPwes2RH3 z#0^#0ReLtyOiWx2`TJG z{VS6z%MRZ9L_T;UAqsr^j|{8V4gT%Et3gNt&z&~_{H{ZJk?+5~yT~2s=q{npvMEXs zhV!-TIxyM&C8W#KiZ?{Myw{2g%>QM%3QgCL`-&Qp5ElZz#!S-cL#Tf{dMDClW*tid zCJQ%c3j41c{O`03TNrpxOy%A0F4D-&+V1&fT`kTm_6lMC*oPi9URNS*?d>XNK*8PA z-%pSX#=xnls6+$5%lsutsM0mv!L!EWjE|myf#FuU#n8v_yGqHXCy7R$XjL>-oN+*! zhpMly@36D6frp$f&C1G(*xgO53%*1KKsR5fjNE^bNYzx4daLfOk~jP+JKFrE4Yrg2 z^z{#nKS?}x1%V6jZX>&a;G?_oVtQZl@^SuQh1c0B??ZzsES!O4$%TDe_&y71(*!OI z%K6&vx`7JRHTx z$A^%VR61~Cfp%D15MEqf?hh1-Vrdfo_e@dQU^yn8t!LieDBX1qYd2N%wMl?P5)<@L z&#D93Zi!N}zOT13_lcm!R`OuZyPtl&t0n6KjE4w*e#{-sq#^-b&Zoz3j3F3T@grnr zWMpiWVoj9))=Y#z1Pa_|k7YbeJ*Wc!dY!#$dgWHPeKdi8{a9b7n+MIjj8aQFGv2&o zFg+zxq_2_|Vx~?xBHi*}(|X-m7i_SK?vKx6gx+8Pe0K|{t# zTSte4gTwvlQiK@!y`?)MB2c^KZYh&kkWSj3s+K%D-Y2!+? zITD54NWlWjX%{It_7Y(qM85) z&6Ox391i)qbN7x4!|#NxJ7-V5vH90U^vA6tMv8PLq*GrN>gbWKWdA=%m{mK>>BUql zhCX5n3T7JFiOESxKxFae#vR7{V>{MKm@+A+qP!99?}_CM1hmx?sd+~EdbJK=0B>Gx z^2(6jMi0^eMIq@6$OsTX>9m)V6-73)B7KY$dwIkZj}%TQ2m2sdJ=cMN=Tb@r;`ds3 zVk1dsX${ZT=J?^~#rjvM4^-K*D;t;|rd-6{a?0wwZE%ErG{bU3B3h@L_l_U-kw{YN zmspluqGq}t9LR9X`AQ+czx1rvm`AJV!7pZ|C7-li^|xFUdS-l{(ecCz+bms@1&2#5?>-t!u)Mi`QpLlOxiH?D`EDBbV3*iXE0OC zBWAwj88mvhLM=zrje|Um18h543M!V+ero;o|)K>n&3R(va#9^Ke;%LanekOpCDBjyte}n%lRuO%rX4C@8FG!HZKO}4( z=3CcyYdz^!O+z){Ek~ITN1Ve8pWUfHeD81k0$)t;JaE4I_PgqVYxAgN25W;@xc%&6 zrc(3sm$6T27gFrQb5*%>iroA)p9g7_If>6dp_o}hmBYEa=Rrp^CCZLuFfWb$xS3({{5H0+m?l}C%+Z~)3&PAhn9=?Ht zHqOWU2g#oGj0_CT@jT`h$N*OYl%0u_!PtsWR22y` zQr*&Xv}7~^si_@*)Y32-Q341Qh5~^=a@6xF9oE0%P*GF!26CUCOz<)%dlT=VoSm17#Mu3bKwDWA{pRU6q;+FmK=x&08TLg+=VyIH8eErT>P68Kr%E9q~M8rPe7GP zI`?1;3VX=l%Q2uMF$68i0l|pLGTG=QszsOjj*Ud^S z2vp%Ljn5m0#=SPoPor|%cOW#=+sBhT4HI4a9+2bUbLDf^zyGG6Hx%=keBp!K_i-Tm zpxaw=p(N`Zk42;&=O2{%+4rh_yf#-Ak<|$6xzknCT;`A;Z%2j|T`kH{7GO)5Eb}n<@jL9& zRcjm~tju=FuLla}fig*a&=&)V0z_P29KiIEPlQ*pN^xAMp#BNdz&&mHNVsOW#SeR6 zRX-b8aam>br(^iR>J4H}{Y1Nm2_ON`3XCQ2s!8i1dR@;-Jf_pk!B5P6@x|S13dqH6|s3$_7+hofh2}1p(2(-sj-zz?1 z7U3d)J-&_7`J6=dVe=_d0|xu#H3E`uADzG$X2<5`zXn^h^2nT!{0oy9Eezy!@xBBZ zBNZW%9*NY)#gV%biO|uZA`tvsT;a*ZS*4{s^=e6V?_KOcJbT@M?)F^5;i~mrdU`)W zFsPcf-X+ZQ5~OGm-s&juoCfo-?oPpe2&8QX$PPJtY(rO{;N}w#exS{lqsmGLc<0T- zJp3|S#K8f*x^b{hr8TOyKU0*gnx6}td^S}aok`^*#;b?#ZYoUp1p-LloTZq6V&eFw zK2Fq2#Lz3QsBm?4)l@uX=v1~!sI{Uh#UkIwr`G?CQ335t6(2Fn!{H9eXss3!kLC1% z^RG4eF0YPh;9TkqKP_rVhjn8KZ{RwdVH8nAbxm4YS1N60z635&u*2qb&l{5H-eErw z&0Z&=f9FjLuh2Ry4M=3!)KetIslv)cc)z-5eRxS(+SNx=Q`?dObS*?FD9%{H48_+r zKDNJp8WLm}CB(0FyDmD9lncleEVvDIzUh^CR*ApFcpALrQxIH46OnD%_u6VVrSik6 zRPk+t9tabc3!;X)Ly49km`YWkxbV5hI~lhQ z@X$y&af|Qj_36F2X8szk7R?(iQc6INbQ~b6t!bzYRAk6%8HM;Mnt2~#MtAu}kiD^s zFXoqkD_6+mqBuPB$7%N+%U8202V9tT-$#smqCs8~Mu!nU*id_7J07QPX7Xlv`P{aW?XSDU7C z#iunIxRBAyX-V<0)}Oh$xh^*Pvbu*j5Q{b1_1dE?H2=WENU7^oVnrjwPz&3&^tLum zxd&CM28X3@PM8>@b$FxN{0H^0yPl+GwB35zCb|OfOVrv-zK1-Mh-VcHs!gVAlYXkz zZn#WdrmGVK312T)8)b!^+cSN=;(0k*_9HD51NZhZHB+Ts)|g;o*WcMWJAhv3&07R0 zWRL{DiOt{_kQ!ILl~fC|CcZ^l4;dVie6izJjpcaeQSWwO6_uBdvfbO@0jaU(Tw*99 z#KoaDO2>7dJPIgw$bBW;8@aGrKnn3IX&Cmlg^RD8PPO(kbejAA*kxEJn>>fD(o{s9 z$@eXR2fL#H@CjoNR$b>eqA$uL^(v2AT1Wm5VQ&Fcb+`WUlG1ESLSRdGD$S-urMnv> zq(P*+yCozAl}-uiE&)*l=`Ly5fOOr3=e*~f_x;bkcZN}B9F_fxwVvnue7@gRpw#a| z)+l`>Xnci2L^C{s91>nw$i$K%>{h;Wi0P+k^RrOmeA#p$iTUuVCOOK} zs^R?^J`oX$%hpds8=LJKXY=vToVd42Rl0AVnT7}1N#2Y0A`%Zo9d}7tMoTgf(r|eE z$~`ujYwzjQ+GvMRDrM~_q9sIAW&P4~jG_LuplRicbs1+)Q9!#R_42lVWSby@61)o= z3_I-fNd}$Z9QApO3T3N}E`9hbRN+rzonr(kAH0eV^?dWsa3*w*??tBu$aG)bjn_~( z<_ax*s9*T!JbRjV-9{Is^Qvjza%xCDMh>l}H`JfsVaZ}*X_W)(vO{pPalPP^+J(3r zmWha}{jpM_i&S1xy5m3eI%6aPuw|dw7|Vdxukz#E@FS8tb{-jORNWIqEKQsp(kW?c z%Leni$-J8Xa7iwIa&qE4Sp@6mJ5{|~UrpAsnadtjy1|~3yh7pnQt2LLSR+$G3OUPf z3n%>Kys29D3Y$w5wRIEN#60Rjs6hG>QwUnLDRn7(66J?MdThrsHmN%41@9vqjV^@A zhrVaIRTy*IgwWQT3!8RPuH2@NJ>V>`FaEbno$sn&uYdco)T-)^cb$8`JBFNvpZ8}+ z6NE^N3ogLmtPyftt#p8PSojta@yR6isVZ5;XDn{oL^ zXfdP^?TX)l5sM@BxV#NNd=YfY?^J^Uwsd)q4stii_CO=EB?&Tl*n(6{?qpq1VfNw5 z)aQkz&8^)ejkPnrFA4l{Robm_K5&#h97@h8N+v2}Z`{=9waj=m`YJ2;R_teQEz&8z zcY=Y>BoMj0BCK*b8?Ar-lKQ7miUMvkm_X{5FsoJ(2jf%q3F;osA5>@`ver{1fr#~0YYx))GodIk6v|?K_aU^hO}MYT>pS=+-dBY?g1=sNdBOQP|8^}QdInxduAI{$j?mjZrhlnc zKl#`P)O1V2W%qo9B@+@@5}vJE85&8o1lyE}rLM>r3+gyXOLPkUQ}fTs0#ep=gQI=# zUBzNrPYx@tbjQP)T$YIc(yZnD`1Sdrxh_I0j?t(0ONjiVjn>4_5n1Ii!*FyU4+a8H z73t3+%QuFdL64Ll>+%Q)2yA3A-qRgtAlk6|sKOMCMl^bLea$PY5jPF0I^oa*qT!(t z@OspK9%Y2V0CxmT#Xx@9HH6!Wq5O0ig= zy^`EbHvnZKGuX|4*24c4nOtgaA+PXAiw-M7%8VV~brI!!vycCHuq^voSnq|q6*POh zgmqw*Z_^CC7l^?y+nv`DMV2j|GR>v7wm$>qOrz13p0GF`T%4v*7@aZ>BJW6}Ln2I; z9BXwTTY3v7Eng)h-G{O7aRj67#~d;DBDn(c!7UKpZ(S?P3PBs3A*>|>45=zdYsD9C=uf!WbeP}GdDt)emoFL7XcXgmfRpRN zz>}xSQ2T0CX~g8@wE-_80j_!; zhSxnz%CTXmy_k?d1;A%88-`l6aT+!wI5;?JOcp+=V|o0&aq z&lyaYvC368^i+c`yq%EW7?(mZ;1G1FA;N2n02n%1kgO@-#pYGNA^|mK^^p(%G#j+i zSJjM1|F#}dh6q`Gc7;j}>lQgoT{bJ!r`**2F!Emfac>ZJr{ve;8OM@SCSAoJ4)?@? zH{>_F!b>t;o1AB8dt#A1qKW3g$##la$H}OW)^|9ZxYr6g>GpL=$7k7pmoK;wT|fm; zc(hm$O%H0k-b1BV&VM$OK6hz+t^C4xI#kA_OhQaCB$(M($REG7@A`WQ^+*^j&W|o}Ey~U_d3 zRu>>%toQnzJ!ii7(R-Q7X-enz=zbM(gR^do?cHc>B%=O2?BM8#_V!dj74Sft@6M$( zV%h7 zGsXK=14N%N#Vnx?(D+)Nl>iks;uRr-yg%?)^sCuSR#NBm#E)EbkuD)3+eg*okYej= zhkZeAX~Op#bo#}!qhL35(wO~e0h|)6oU;pVQ(#F+NqI4G!ma!C3-mc3^gGG?{z*BX zyCUb!6*)9IL*bb9;T*Q$+~KAzK%}Vj(HeYbQDha#*-vBa-`o50>5Inyxtb1yZx#o_ z-t`k>&S#Kp>5pcdp$IaBiY_6tbCiGHC?XydM~4VFyh4w&k7J?Kg^YhL79e+^SK0fP zv%f|)udRj7rE+T+*rclb(iFTJ53zSBUg^`vr(T-#322Po_zA2%_>}dC+4NbGo*-eS zwT33~b_|T++!lqq(?~^MZfLmIN;{(8cZy0|ud+9$aoW^)7 z?_Q`{Ha`>Ow}+~;0qNvc2C8tH=k&u7P>L~fM5WowS zDDY5G`Qtv|9-W?k05}=iCU2Dz%X~DjDI<@QE-j5JiG={pZWslaw$VY!L`@;$Nd!!F zm}f1@41jdT&WuJIr&-FlY;Y>N%n);2M5wX);7Loq!e~3+oVHB1cy+KyZop--Xm<5& zIlxc%&8N<;bY2_dc7H@3Snr3)Po`*-vSB5UEx!5#50;u}B;yy1K`;VLvsj|$;K0?b zu|x!;!jCs9;o>Ujf-jz&DuTv11Qm<89YC)NzIcKlw?|ME{azYq$FiU48JxL3#Hg^J zLraBNOK!en#HW=MMItT>T67UEvW|&DTczp)pA!I-kS_<7^FLmeuY8 zKEEigcx+l%X*byQTb%f8-tdfWfpI~R9{`>hzA)?&Lt>0tJfF3^f9L_j?hP{h+SO&4 z09U3}%7!g-8bv1T4tYyJNQfAMOie&) zdfDLPtoG+y7)YSQwZyFk>;#cwU)l)>TgQBhVz-7# z7exE&hH(_?F5`0f4=GEM&?;PBAM-s10JQPATVCBwExj|AhVxI7DjPcRybk$BN+Z6T z^K$$7HQ#>*P_KzcKORsQ*cdWbo=6HRZKkl$FD=EG<|7q4K>F8Mb z`~ACt+QfmD5jj#WOS-4e!K6Muv?B3e4vP_SZl8?#Mi;Cnl9DdCTZ@b00ZzPS)Xscd zCWv6e3t$eU-WJ-K;2i+qpfp8zY-~zN4ilHdJS@^q8RR7l^i3k)W#4RvX8>)>(b<_O z&RT276j1cm9?K@@hij{{(t;c*OC3HyH(dge3bAF`XE`eph#km*6BIAtNtUe-{k`y>S$qQ$z3p^Ki?^$?i-pcz@MHfq)Pe z_7y24U3;DGuPlH-aDckn6c`lXfB+VhwfP)#DNx#5wy3C#EYJZ<*J&8FWN0C!P~Bv9!R6GmT7HzIpv4)!FO6_X73a5A?w-$WT1 zwxEL9i^glpHPDImcvrf7hr|_d1^_t(5j7t8B%Xi)xT6~!(r>`-LV^7XlI?%mi+VVl zZ8wd4bEG9XPmI&?dR)LmzB!`Ro$`)Lwfl+r5shL&LzmXDj1EiGu7AHN4bOMgtjfc( zq~vQ??P5BYhEOwxE!NwK`((Nway8PW|Lxijmumex4-y~`u&^-sYK^HE?=1+Sd=68% zAPIWD zT;j2W?j_Gh5nYxXxjbNkC7`gy`i0iixo4cLwwCxMUKG3R2#_L%b3O<%O9}CV)dG_q zL_9TC(_1pPx8cd%k-=1BSO`qclb-dXo@!g9?A+OQnhkGDd=DU5NFf$t_>4F7xu{2K zM_HpgjJ)5^IuS5&EfIO$;l|<}DTMzRblctyx^0D1YS(Rumk=SkGcFsE&=e*d^23nT ztq*?V3|9GLV1)5QS#)lS&$My;CeR4;tUH)sIpoZWI;rBn^T-{goYI1s z{nq1hCnu@zQBtksUgb@*kSLs(%Lbl?dKlYPK*Q*^RacT*Vm&b?gt6&ZV}91lcjip_ zE?m>0)tyYWAnnlC>HJb;!u+sC)XGx{7>3C67kk_det%zyjIBX^{WhKHG?f_10w0Qm z90Z*1w9@XCskmh0lb1^3DdxPx#Fp6)9Oku&kx7rM*4`Ut!dt@WV1PFyxaKh+>* z?0VU!T3Pi;X1q6v%+fC86(xgGwmh*Cz}ths+%nw>eJ|?o4a7$*aGgg`A46VHAy%V9 zZVl>D-Y_UJF6BNyW`SSV|5)5io2{q{c>Q&JEck8&@C63!=jT|1ok8^bxZh(iv^fGu z7rfw4505Kg^1V|pDoub--bE1x0J^L7(m;~1+tgCUF|{V?W@*iKvb03;Wufz!6ClKxSawMOW&Y1otU#AnY^rpigp47*c*+&AsB4SL=8 z_inR27(7s1)be{QLnvQqU^`QnXr+eLvB6<+dUgIc*Pg%`x~d8KPk_Nm2hPgN01T8K zrxk#iR2nEB+awQ^B&lQw2nmdyA~kmRQ};MJ73(nf*b{WoP=UM#<#2HNdEU{{;#kVe+)C`yXkn* z?$_T@+);4H>qbs*etRSg2oxG(-2Yw>fOO{?_;;5WIPyr(@2lGMb_PAb_5Cj}_YXuP zg&H)eDN_S%pYXuLW@5sbGqH{=?Jh1m>PrE!oAJ%0_s=_}`2%jm&u>((x`Y3{-)`;M zKSiIvenJFo_eIVCdVH=ZI9yYR?%lyCOu%K!NY`df_P+5-=vYe4p8R8=u2M04{a+aP z)&J`U))u|f>ipuWMzMz&U}qQep+8J}OSEO5bdRyVtR~cYQ>Fm`0Z#xMGIXWe3BOpP zp0O9<%>4WP{cBkJW%+K&TPDx!PkH%h$z*X6-+@tyg0Vr%Q|{KV%@@bUcM73xUl@Jk zbwmi-N-J6Cov{%J_baUuTV;0%7adA}f8_t7<`4+Ku-yIAEW&BL<0g-ma%F2h9o%jj z@txK`r-q;rJ=Cnwfq*?$30s(L}pML{r0r<5n*$2zh>N%TScLRaP|Ibq%44f_ZprYQ= zK9*In(a|V=ets;kU%d*rqxFE8eRh7Xk{uL;oW!Q{NMR+T_!XFX(miYaxMz!19~e{p z;Wq_pMD9{j>gX7%)9R4vu;YQm_r0%s_ zgCcwmISh&k+H%u`Ul{m%S(v}X`fPtrRiJ0+Sgb=<`g&?}8^>_25wg^$h^(zAftw2R zU#QdX!3y#r>+&Ub{2IKt&J!B*2KjCQ;6K2?+rLdZEZyC0FRyHx7j*nTrs`gNy!Dsf zH>MO~_U5`s4ELeGhSG2i4b9D$mOx;J|82Q`3+_8t%a_w>FW<}u_XKHk+--l47VblM zkU;^qytlWvxUuneFKST?w)F*!*f9|i5tBSNN9YT6YguZn$1rgpipqOP#X&)T;N>bQ_T7hE!@#Di^2S1B5lW?)#25tq*vJi+~mCaN4))V#y%=t*t!Ptm_3 zq)K&Sy*ZTECdbXr(|Boj+F!X-mJ!7LF6;Pg?0YxVZe_7HXPVWw{~2;9t9VPSujeOy zs+H~5wY9PmOgO^sNYERuu<0hA zBDB2qn6OkWhmKv*1?6nhmbA0D zo1En?n9$6xi~*mS-Q%JBGV>@jtLqK>2zKbBbrM8BTmXfk0S`b80?e|vu4GjB6Ff)p zDhML#4?;*)EtHk{4M+}7z zQ$8cDK_L^nG58Agxc{q3;ui?0;SqoO6lJyFbTZ>=+5!xh&w%xNsSBbJRs$seFd#^G z1))J!+q4WCodZBBnTB57W;RKUH7g4Hg8Yi-w{z$rpAEvlVgc0A>U;c1v)`{t{JQ`@ zoW0AJntxt5kcOODtT}9T;Gc3|>w#PH%$k*U)VzNm|AZY@eV#!1ta9JbQHvCn@quT9 zIz@_JBi#RLB^$-xr|3m|g@&oeO{0Bz-7XpcI2$9^ybE-bb7u$A4qwaiH-fkboWvf< zudMxBOZPzzOX$XtRuSu}?&h#(<>%V5>EjX*I^lbT-K^lruG9S#AyV;)BMYA^6VX{| z%(yGfV=zXle{9Sq@?Jdj30XP$L>#k2ROq6h4aNWOU8EKeI4i?@0QmZud?r1tJ4S|% z6SJKdA}f@(4uzzK)FOXN2Ws_Xlc>){JBSRnd=wE8v3h9v7eR@Ig%t!4$~5mPsaT2t z5Q?JOmcj-DrfM_*I!PXNFKllngM=mQ41R}D5XMo0!PgsI0sN1tiW@JmMuC^#7`Qay zTVt$Koy!>xtpN?M*;j^a*Yq~dJ`1$+mJ<=ka%Q4%#8_`XBdWKhg&DMDZH0^e=5yB~ zJ>I9U7gnc--3RF#n8#`@1`g7Crduc+QwU0a=l9tR-0ys4PqSMQmdkFE#vjz%64Hf) z42}h(M#Th)tlCUTfBUXc#YD6-CE=^M`5a(WQ{VjdSb+17(>!(IGpUo8hqdO9i)i~+ zAmu$X=ZM)B2kBI`XjiF4`WjbB{77& zV7Zx169VYH_4~$4FjirD778>GL`;>pnORx=H0B_57CxqBq+h&;%Ay_=B?iAF*tt@F6!+;UhOh+2yzQ?ua6DedE3m-fe;qCHlO@ispYjS`qI*pgrk;?yg;U|3grI>%WN}UX63&ZX%RF`{v-TM$I;8tRVu% z4zAC4OMBn_1%g|U%R`B=m06PIbaQUyt(p7?*qIg;`Q|kG?zC} zkN{XDa*A7&d^(Xo`{G@Gl8v-ViP(A~p#@Fky zR}3Ohvk$lK^1#1?bwh+E_(wn;y$5Wa=%CDae*q$nLV%a=2^jYvq9XZVl<9zct9y`# zqQPIjNJlMH@6X19Z;DLeO=lkM+8O|sr^&dxk zo0sLz;22j%-B66l$OP>>b73WCH=5|1WmGzeSlG7_F{$*IiWAL?+GT;HPj;#zAo@P}@|syuQZe1H{fUPD19L~Kp#!M5n4a#;0-ZoE z+{`l4YXibBO8Io`__$){d)=k9yUVud*^V|Q=)qMJ7Ly|R@@+s%QRrXl@lIv)Q#*i^t0SR zSX@g2CTmkzO6VuoFhbOyzCz zhmJ5J_L211hhpWtDUw-2E?-`JiN87BUr@Tti;1(WP;l3-GQ(I*e>s#+f7G?O%p|Um z_9z4?HtJ-${7HTLqnf1i-MWPujmI+cD`axiVb!!m(3^(YhfskwpCjGFw0DPk8?qz< z&z_$kp0z0S6q2Qr!_Yss+Bjgp?k0S4`+ zsO}4dL@Yk}o1=;0rAEnToZ{K({pFRylf*1JY3yPJn(pCVLSDhdG z>|`eW>i#EED10}d7v6FDr9*p%6l(p26so?Px7l38fp8pH)3$^}qZN`izXepjV%o7x zy(z&_U)}P7-TC68v4GD-4IA!TS$FX$gezQ(s5Ic_OvpoOoon+twNHNzgix~t@vm~s zFynSxB6Y6ZVgHUYFhP-7Py=vY3O*AGX`U%cz|hs}oNRB`ZQ=&} zRk>%7E*vPyv$)|bwD$6FVfEPx&n81HQ&@AKq_;e&z|^Nm$fPGxaB$8`qG+-s1!hP~ENN_L6bnVbgB(S_P zm=pvt)GOEW)*h2iW5MXCdxwA9ZtpLOy`5{- zu6>&8Yk&Zm!I4db`+VpU5BH)#|95+mHI#kpO9WLg6kh`lR{z9NsW(ydKNfE$#GZ67 zyadyuZn+ns6-36DF7j**zYlaD%lUTQ#H@M_YGFo3AN2-ZV0vklG<;CSguL*jFOWfc zwhf_Q2-S3SSTzfWc^DEyxyC!n=2^5fw2dfERz#eB$e#=QqS#aFT3ZZ$2O%$(5`nKH zgkC31zlcV~{C33wZ^`9`mhm|g6n?C+q?xA;L?}Cx(pXO!I3^^$*foPag+C=bPBrWl_ynr$F zbzlBOhuon6IT`eSvU7BVhP#>|udyHkU)KgxJI2R}xtMD67@Yig+<1d+7o^mF>xwCP zni?KAG3N=k30#S}bGZ_0NKOdu`3PCrCBk`7%4_!|&F`Y-#B(?2zx?c!g!j(jRf^y5 z0yDnvi$KSio(iuKN4^r6#j>gST?VERW92`pBHW+}}kj zAhvMbsbHj@Q0+Uhv_|~XM>dl?4j@}+W!cfqw$&w7CPzh)Pwxy=br;7%g8kHDV2f+Hm3F$X0o51NbQ=vm z9+7j$`$T4o)hH3-WAo8}?en?+7q@xi5r>;%{DSS zEr%TXn>DToj7xxR7TUmv2_dB-RRi6@8nPM;9dzJz`rkA81vnU2FpLqF!Eja;O{-i# z!GMF=OC1w6-?8>5h{Bv~cwOLxo^_hu5tH261@cLALH>)-j5TYe^O6ZD1BOB9V!F^h zm)>KW{2ev`?_dOy@3tySE>C|ZOS*cMq?`R2Z7D@6DYt~?U(nq3Fqrcm?^R+{2~%N@ zm$GBzw$pJ#=_aI7#WtSWr_{vcrD^RnQ7h-z=n3jE!_S(F(^qkU3mVxb!FCi-*K3jCkKnhX?BmC-(nI)!)r z*U|#Ye?kuio3jO9-y7bd=4A#K;85>(k=09igS&akN$U`JNKF8=l7tV1;&O0s>|-s= zrRlnhpNe$4q<$8_8o)3XUjs#JzYcgVP3h576`Vqd>_M~H-qJ480ZvGwk37z4_y{gd zbF2p{z@;LUvIrdx5>6@zrc}O7?|>WAVP}reH42%=vdkj2ekI;s+JRI zrE<*WG=_CR97#LXSfgr*W*I`+eJ+z6E9WJ1%YiKbr!}R+JRU9Gh3MW%qGS)8#cCaM zSx66oZ#l>PV7Y(GEHyfQ_j0M9Em`>e2o|GkSg#AVZsQ@G9B>mQ40fANL9xFXT3%-r zE4wxfu*X$FF{$pVal}{!lLH`^dNgUb;NS#&LX*9P$q4F4o-zklEwPaJL2K<&$CJdQ(K_#R3Uc9Z{A7HuNPE*EL*zB8-` zXg3*Ip~_Y_-yTXH?1ya@_D}s&q&DLL%j6?ZG}`;S+9+-OQ2>@<)j~Of$ z>Ruc_ZOcTu8~CJv8fNDUXm28o0ziPu^-B_e-kVw;wmc1xEQf(VlG~;CYi6TK^oLP#J*NJD%gM2OctLos6jpql+2tQozHar;*;ofI(cp zvW2#kTq;KhSjY2ewkG}yZu(Xe$14vp^jji=czmV z4?K2^r=Z##x^sq{{Z+levBcHhp=xoQ+12=I2*^F|1f71z*jRG+EYS7HeqiyN{M{Wt zb(iumNAfw& z7_!Hqhd=BH8m~KufTmz?Z|_`j1#%PJ+w+}k0mGQik(s0kxxPFN0}1y7Ezw6^vZCntg zT0*(g=6(@N65-@76?7~N^62yUsrJX8f^u&v;`b7_F<0E(E^1%fWX5dwKmo{8P_TJr{S*VqqSe~wY7bs zu0+J1)I2KYWaZu4`4v7rO_lg(*+ljg!Dv24F7|_u15lGiXo%FGU#X1A+s7W|w@$~e zlV^r?yy=wOJ9kd=TUyRWb}~#`Y_w+|fceUPv)TNV3!~tn-ObbvwU@nh;N0C5o3*eZ zc6yQD%mI6toq9@%0iocC=wj%vRBz*~7R)XiD19SSvvPuXsJY9ZT@ZQt_HcC4dOJes z#;Y3mS1lwzk*XB`)Zp&jVc-x)K>6P<9wh5qY(Y_8IsxXVNO(|8{MN^6tZ``I>?Y@X zskt*|78V4I?|ya4INFStZoc+9fGBk&RQvOIpE*`@&H%zt9+0_I#CJF^laP?EA`jrm zmKB@_JBTEVSaO%tIEO_x#p$J1*yppa8`Byb@}b7Bp;Qd~r|VAIghfI|u-omao$4>I6Z=)fW(tBBPe`dz(B2lgoq zBVzAt??ajD3;j=1*C#U$qc#;S`D4`x?NFv2=FW%)uM-}6Dho~=rQ7*U5vcaZB{)?U)s;=|b!3HYN zYnMKhtze4)k%SmONfe?%~qpz$d zfI)!6C0a+V8Pe~s*q-17NOgFi4QVKYVhw3eJNng}&gY(x|K*D%GJ)x}!uqpVL zAAniv>T~+_pNq%CUNjr&9#=^%&=gK1MQUp5(C-KFT;{m+99$u#R@E-Gla;P}Su*Fx z4npuwf&TJ?bu}|fsxYb}4z=DNrcQ4}c#1JY#!AZ8=p84&BlGL{gY`<@ez=-n+_HAy z5m5qKsH?zJ!{_<(rCC{-Pv~g|)wF{e)!BHuO&)4F98!>+LW#b+Cdl#@O473ka#Fzc znZ<5p&_d%{yE%7hO`sY4uzH{0f9~h5UU28fuB*S+6_@y zzN*aCJ;#Ljmn+7&8m=mZlba2gbQ(2FVeO;7e1=uPAWmCBSkD#=PV=14Pr}Jq)mKOz z%Hc`~>q_f9XF2&z&X7^XkLsmy_8tTe$YDZuRPt}u`$>*o;Nl@5{`U+15^1X~>(lMZ z_Y!Sq+c3B>y!Iyy8k|L8k0A)fZZ*Eg54nYtdIuOo(cKf;dwdRRn)a3LLKAC?)xzQE zizvhRa}^&VTWrH_mpOOcX1SFIQ`;M`WXH>?38{`qGYcQ|xTD~D=> znB>+wzSz$5aVhMXnVBQ< z6|-c&i(ZzJyzCnO-(7@C*%@8jok_?>hbSARGpIvL#RFEk;iz*J&==G}@^$go-Bm~G zfZ@R(1+4D#4gaXiPg}!WWG=yNerFBiZ{OS5Y&soPNsy%WnHV$sHT(96k>_UF&-HTY z`4ax*{4TWuo2sVc@|Nz0Fy(%slh@c;=dL1@(4&AYnz+pP#_1J^>KLNW*R7UUpFp_J z@+`AH)O`_Ax89K&74^UmHP;^j{eQn!r4TwLeS;krQo(C=miU?cwG|XF<%{=3oIl+? zD2eFh5>#+>{cqoLOFuqN0^qed<2%CQ6LS`wlF%be*Dv zrRG)b>I&?IHHAE(I*w!So@d$l(doe``}Dc8^qB1VbRzxu+Yknh=GKn)oa+Nj#J@6N zd_dJIh!edCH*{Y@ZQO6Y^iC0DG~%-S`;+S{4j#~lY^n%p=t~`oQDrb_QX1S{naruI5mj$JbrT+8F<{+$|CZ}do|M?V{ao|cBRfWM9<)-bw=6QhgjRG?7{ysTpTnq;u)K*;L{(qkjB5Lqi zBZprstNiC5fXRb<5EdXrf!i4*2@CO4^MIjv#-gD^vOP$EH!zg;IpTlcyq zBO@c`U5zd_%0;U5L&8g#DB|s`C?H5v;pO-Iflt6{Bae^2l$4qI1lTJQTr`TGf-{it z4bx`EBpwqcGIKtba%Cl>l#!tBNOEBbapHV?BZ^U`5)hfpw)C@-L_ zv+Ze;TN;g5Ej@HXr62YxmSaygXJ^%UK+r9KWBr%P6rT%ovzm|8oFfE9JO=?qap+d# zD*L6fvLyy)k#>q~xS07&&+6r+?_NPxciXl^M-Q{W`= z*Hp67YmO{XC`0)u^W|?;9W9!wXbLUE@P~L%A`A+N|I|9|iQrbr(abl8!WR`9p`?1? zX6MGQNF;FWaWgW80kc8YqskXOkuR!+e-?etwnSO#$b2!B&OiFeG`}`7#z1~Te>B{_ z<=EEiftk=JSLuPjGYB&x;xNI__AGSx3R-R(AVKdLJU+N(ciACTpVpi^k|jFsh$eDCx9>xUYJ%T;9@3+(rB+*nlq=BPAh z$JHmY*RKAZ_~9cZ)jKAaz_`gXdR^D8lzam zhGlLj+xUy}Ie<4%GwAY)4-Kc6+ zWNWkl?cj2_?Y5-KzBhVev!C&jbh-ZoH(iG01w=+qx7<&|x5e9iR#m9_MO3Lxqcdqp zkNPXi?TF3o&F<27X5{nr(HqmjfrF_uEQZlEUY|d0AH<)W`c9wz)VJHgtgC$=&$7l; z`1BQvmjY$msk;F8id17}s??e=|ND`l54Gz&(->Gv1*zBUL&dXogvsG-HavtTaU|%O z7xM0~k1u5_!sO5hH?PFf!Y(G;rl4YM$K)AOX+ z7BA0WMrf&x^=u!TgL_|89)B)F?QqM^dE>aJs(ifUR5?$Sa#irwAD)xjj`82cLmLmg z{D|EpsbIN`tXmBFvs_l*(9|qCw>%CsbVtX;d_PDdpVFe*<|k$_7I z7xFoos;hb=ESwVf3_X~C{_XRXzVC@H{rzn!A((4lh0mA9cI(6>Z6-iO_D1f zG`fnQvWpCfxos~WnbVsigYU+PDcN4NE6x6qSl3DUiup`BXQZQCoU`ks66YhHTUQit z)cHrbOQj#>m$!_UygFxW$=3P?tp-7DX*)FJzCBRmJidSLy#2wBu9|$RjL4Qhr zImnSFJq4e=-p15ws#Hhr*+$9%-~`kz*58F3oG<$ zKKOYSl{=E3^v>-^z!FwCp&Y*v?;|5&NUW~(`uMJ6W6J~hZ&mKo?zO|Jo>R_2F1am3 z6@e%2OqeC40^i%`ad(c}^Tt9ah6rH7@7p8tb-Y(q9c0B={7luPhBj5b33j(co_)5u z?h|0qWKpL}Rw~%#PwS3K**4^sQ^#5ApjMnk`D-^tw**_Hcf%Ffud##*wU} z>UO!ojLPoxc-w-o>&}Pz`YtEJlg~5dsVfKfc1euh9`e=LPASuMw<<<5YQ8ZjV)|ks zI#X{u6<6bTtAdIDsRW!O^u%rUN6*0cO5YpH(fnPfUXUs|GQ{sz^(f4vO#l4xTEy8d z*vk0`-AKAMOE7lTZ71Ondd33fzF79|=dR|u)fTkuI#r6l+Kf|n);hPla{b(oF3;B= zer`xfrA`6U2;;=(Q*q{%StNeEo%n6NwxWm_fS7XvU*Hw49EbQX&*v*x&x5+^FjGi ztOpgzx1W`}e3zkwKbNlZ)hq7HCyk9PcjahwDj`a5gFftEmV>7_vLd$ zuJill2H`BlF=eLq)AX{J>j(z3UV$8xvhRnt@QE}lioZOgzWG^1$Nz}^@}M_=htMtY zQCxOzVl8X`)9I_|o0`s9Az|)xn0uqNr5AovgVc5>A*Mh8J-@KcWzeQ!z zCb;QKu9e#vkIsa)#jeAU$zD)KC8Ou7Dio^;CP>lpuymF)d!z}{kaYOH7!^*aQp_7R zKRA`v&Ke+kK*{VBuTJEFQLLgYUFmYmYLjrYk8kptWi8z8z1dKtdX?t0sXFy*Yjqgx zYvV%lgY50VjSP<~3IpO>d&kMDMJJO-AIa87m_{38hgwssU$0%Jd+e0TBMj|ZzWPz& zt{rY`R4zxzLTqj4;CkpG)MU}*{cSc%N4?mDD5Ne5U+}s0bf%OM+3f(0P?KvD5rPi7 z^JmBRmWrf9c|GYrh*Zm(yUH8ZA6x3BeyUQKv2)0n{$-HQZYTe`INre;4;>PT68k^v zpA1<4=xE{^xNw@xXE<#cQpe8yxKN`{wf9s2pe7Q-ZP3xOcu63^=5YshU0Hl^!qD0tcfw zTctjI@>+dmG%#z2~!X8?L zE1YvB7%i%lDemKcV9~)|UR{-ud8v`?+Pqy(zUB$P*U}2NfO$=R&2Eu5vUB~mJd)0v zuV8+SvzGOtq8g@^ah!5|6&)vX5-QJS@1bOHd%liz?ptUhnqOc^7uirb%frx4Jk!B4Xfs*Wmcx z@a94v8o@H(#fo0bAS`4+BS--ioVWUI-L_{Qv!&dBl=#SXuDas>Xv1+pg&kFn# zT`Pfond*=2Q!l@bmbX3}c)5NP)8?)DYjF|h)%?$2{||eA9aZ)Ag^$7pN-3L00XLy^ z2};Q(q(qPqrAu161U4DX)w#rOVts+@ptHY4R3O<-pITieB&Vfs8eaRxNk2N;&E9sr2(hSCXyNF`y>rSk_4B}O1ut~XLg1bG zr8L$~nrz@kN!;V$__h^#kC)mS#)HY2U~tR{vna>{VQP!&1Jw;8I4@rOLgaB~0%Efd z8?ub|rEFvL#i{eB<=rnLrQOB-CGWIyx?)O&higv9&%|5VmU{;rk;pJ5X#b|{x&i#r zBk4kEB)^m5XSTV6rQL~V-3A$?&0npS2hxq&Bh%ZXo!4tGkP000t2D=-cR3mpu1q@K z9o{N3l(X7bc;Eta%^9w+Pdz40=-SyhI@(!c@C@)%XW@E>ZJtH`*^5FF{)`V~Fj%|@ zi&^Wvce?w6`4!*gCCc9IM7rIxa~35~@rJC?RT3qGW<96jV^pTCy1}E;HgnMyv>kC3 z>gLm1F2rvgcbBQF2!o*fG@c=G@>j|MT~)THPaGe_*RHBOh8Y60%-YW8aXU?hH`{fC zhO$g6MKmySSR^IP_|Vv-FXf>I@@x0ofi3Sw`rUY>4g)MNz19N~lm=qP_s0zL7t&&e zq#!q3oBMOQ&910oK`P_-M)!b6R(*e0S50L=Hy6`2y(}+6RDGnBBdQ{M{R?C_XTEO* z)9mi)jib%B(jt@haqIm{eCAQNIwr45jg`G9IkunUv%Xj?7xXqIN=MK}V^+edcrwNP@EjGkc#0$zdJP}@u;bdKs@C>-U+GOs` zfs`dHjLw2F{S=QbSEcOv=_vidr6VshAEPzhpsF^#bS6R4PUkwkv#_PMNnV_wePIHg z$eT`zdgRh+4QyPkisYx6gZ>fI&c@jy!oCkr&0{L{-n{Q)vTw5~3FYoofg_Vi9?Eo{ zL#@mZykI+T-z{sB`(nM(VPkC?%;*N_6EBy%e{*H-8H$b)Oe2e;OZRUW$O?O z-AdVd*-nW(S(_eUR(x8P>P46<<8l~4tCJCXzV)2J`dUY5k%RK*iCeRc!XooJBUU=O zF|ThLezra-N5nJDkz=gM$+~tVSlxc;i-##6l1B&2i!<(ki^Nww7WRA~-sfjCRG}*c zml$_>y$d_e=g@K-&Z7^vImOo?+_F}Xa*!+U$#M)E+PJIsts$IqW7N?(~%SV*Na%GRP5SMu8XR_BROwDy46(1=m^0k zW@c`isCBu!cCotDamRvMJ!BzZ>%PZo()Bx{Ba0K01!PWUJs+JaV1^Lv-J&lMpe?YB z<15P>7S=YaS9ZOh_sp}FA9QF{7E->iTOsUGJQ?YX2XY=RSnrh>$I!8qoDn z>CJX1%zi?Rl`H6Uk6tzckT+7lr3m;!tJFGCYhet%8eZ34wTIKqH4V9;YC@FbKOO^! z3nZyT1Dl)e#}3|!2OcJ5A095*H#Swb(7KQrr~@t`7oybERO~lMJZbg3<+eJJ7%tl2 zb5cm{<9(Hemj3efBYu}dlZK?Yr$&RD0teMV8%^nk+w{jOtvE*B0Ju1}z>(>Noi(@g zPcv_B`fN^;;~nirRXd(7qz}q7Z+xE6yf(cI;iGrm7Us2f*|=1C<;_$B?6~(NXm~7~ zC5yi=EK|@aYg98zr+yc~N85H(`DS>&JKZb&zCz(Hd8QBlrIc$_tLvO@jU6$?mDh(Y zcb{Qpsi`d0Yt^keIp&NM%?2(v)v1ZllquGE7`Kz1vabnJ3vY_HFuLe08?^agv$?lY z-(P)r4`v>H~prt*n^U7_La!_Wd_9?Z=NxviQYc(}@x)fJ?5IjGGz0rnNkqG1<^E zkv7vdp;G~x#zDoCKxFG`z32tFG{DAvLh0| z;Lnbo6Goe~6k2YSm#@4dO(JNqb4-43!CD4N#H1p8l_uCw(LAYMH=@;s_}=29N-a+% z#*f91$#%j)Z@h)OLpwE38Q!k*b;k1`SC))Uwy$j0T|6^iCiaUORNSpLx@(w6e9FMa zq&9LS=g(9k%4B9~RZumI#>)-*4A9S-^1{p+;#Bg*xRiLwVpo$; zQ0az>tBWQ^6b&d}Wy;<+MemSdJR7~tZ-5JE4 zw9fB!8g{Bn%JOq++CjO^eFtJ)IL6(1m?0LGHb}M_-iBcPgM+yaozQJ76@KF$-MYdF z2M2Qo7_;hj(6+#rJqQG$Xueq3f5C}OnOJFyHe>g=QIKvxk=mVf?{JBtw{CuV#w=n? zc@avH;Oh7amnr;nCIIkx@ub%@1?F!aBF@5F$ggeIH9b(;?q1L3j@5{VPlxg^bC&;Ti-?a^55DPJL|2Qaj9Alp+G;0q;RYB zjd$tWo)Pfjoa}HlY`xR~e!WJR=+30|TpTyHH`cyK|MK2=so!|%P&8brhN|kDhWGpHhYTB+*(}0Kl#dD& z_9@i}+T`w1zcKrkEWK&xN)`R|f{D550>d*C=bUbfb6et^Aau-3XK*4)mzEpRd-z4b z5$T=~Kwz;Xf@?MAsp0Yn(SOxIz`W#s_N<&%$d3@M!Z2);cDK(ix7BG`;qh917S*@1 zx7=Z+8Wuw-rM7}o>qbKkT}ML$bYg1u(1btBPi=`1 z(VtJdQCcmg;`ia(t(iAg)}5E{37Fjw+kSqZeJ#?}Z7;z7b=4!~2BUmqPlcR-s*C9+ z$PYtJ{s>*q2wIZPiv>sbyVqR2hE*SrKBRS*AA7OxG2XSp{W^4HP|Bm~5%Z9zIGxMX0-Cay@G!d+h zpDA3A_jw>GdFaKc;Q!ekG==XE$nDX3yTWA}DZ)KA&}onm8Of)&55+O6*D|sBiVe9b zeg#)66jHdDbvRhD)@o4gS{NtNYdKHX#$mfC9DQ3mJiDZk^5)Gavl0`5W-j^dB1wq! zPK|tp9jl!TPxRfV1Jx%c46&9MRs>u$--+a-dv0EN9K#K6f?d8OnzvnO+Q)EWuc>Mk zG(;3|8gGXvFiYm`C;DrSOnmzKo&xlGS`B-csz9dJT<;?*7k97Js1&Z@ePw}3#CA|h zrz7bdqrxKNr4OLpW48suC38oKZr2kXCqK20dS$Fiowh^KrRQt-dLo6zP?3_Uqrr&V z8AjA}bd@$pYUX%j``&aSvK)AyeaEQbp}oVCSnjzc>4jVevVjY=+O|P1+ZSh2Qrgzp zjO(LxKPfHPSAAqvjXNZbK?qosn3gH7&3kSU(`&!q(IPOVo$7Vcu&g{V_Aq}ZvgqaG zNP&Y(6;2u@-KdprgF(SsvT9SsRCjR>pjFG)l@5p+(kk?Md9118#;xUC-7Nyn)2R#W zeA;w7OE zm(JzywMG%e=wA(h#CoLEePn5`Bze&>!!VaH0V7l=?Zl7STgm2LGsA?$D$R_q66gt5 zrTb);ZPv%HCpPImP8*b8a#P}sC8P_Plb3}*euv2a04qIyW6vInQ@QUYkzB1cHW^Em zM7_b~gsI@9?u&`zKX%cVpQ%o?V0B_$eo|vqArV&tmU>t!C2he(nDEKx=3fziG~)A1 zXNDNrb9*b@AYRL25nf?zQzAES98?R4n#_MjB#e_ ztTuRM_?<5DJfW3|mCmi&%{Mh>Y6v0~G5b`QeqU#@t3VYKqHce@AFTTMX0K0hYg&>B zMM|&$=|==jS8rJ-9M2MiVeF}0NkbDWF)vy>H%U3LaHY?`K4@d9LAvww$htNXscn(9 zjk(akGQK<=kpaa>j(%H^jASm0ck4A|b5h~iPfBkcGh=Gi? z`$^Q^pFY+JL+JSXNnFu+&)=I1&5);&cMIS$8_J>iToR$D!bUhR!oq1fAmz)4i+nsO|=G5ynu(DD9#m}_VGiy_z07CxzjdZ7-pwQGCR zrcvWBxdYXl&k9xys8c$_xzd~tuWHf2M151fu!m9O48(!K|wapGrM61frVX8X?w&Cp_B@>t0FB9Pzat zleHEKkB;xP!z71`WHpD>K;uR*-vt5@n+qGhG1-mhW9mFuZ@nw1{mL%5Mz;G*C-^Ec zfx;UoBX)v91Xplug5FtSf^k<4sYanycE=Zu#p*i`b}S-{$)3B7XU;YKE#aPxDFn|m zn5-hjfQ;!by?GPX>_K`33i0DFDhEr;R+Ev=3r5Oj&%|eQz1=Dt5kQ9?xu`HUKMiXAyT{1|LTh_ z{nisdA?zM==K_K0P$fg?qT(!b9dS$F0Z?`h>RO|aOfTnjidV^4(D>;gD^>Gu(H!5 zi#HDv<3^ijI@+h#bQtJ*-_b{i6j`>&I+qoly&HgY&0I#paC@Okt)rVPvE%OCfxN5y zJ{$Q;Jf3*NY2z4*br*dMCvQuK)6mUOn;|x&RXUI_;dh1#%BW%UmoDxu(y!KtxX&4F z58|>kySr+hM9isoJ&fT^DtSLCg>*-FTU0M*?nU84N!sx>yCX9ahKwK+D66Xkm{;?hQWk51gZErHu5hz5%}a#aiTRN!!RZQ>fAk6{-^I)z2E4mpf-3Fa7pFMbA1^E%~<10CRlM3*!7??Ew*3?-seO!&AnJ;6!3gr?#XLc9JczHf)fAMxWu!?vCz7D4f|0E zCdEiDYO{_m+t|D1Pw1YEU1%e}w0o%BXOn$KWS7mJRh#tRe-rC;sUy1h5y5l#GnWiHwXV03k&nnr{P?d- zPD#h~kH{c2ZDyTsTHk*iI(oK0bq6o}Ls+jIvkpM%iS>cJEKVp9ai3I}_cHBQrfCtD}nM>A{ciCvNdzY3|XYfLonUH65U-7t+|OSh(?Re9mS}IcR15 zQ+CdAO)(*VW&~^x1Y@M8;bn?JCTr+)VYAcU)J+=~O8aHCESB0_s}rXXM5GGglN7{ z%TZLy#go;EBt5ftm7m$DNv_x5K!-v)3-1`W6&2mZ^PbJS3xPt!HE53Pc9!=1N495( zm-@Skj%+`d(va?-$d0AuxA z(j}V*%GWJZCzl7Gg1(&8x!ZOFCKg$zGZBJ>E%|dTYOz-wz9z2~=N|DIanW^^D5>Z7 zj$J$GB@uK=4Hsmd-O>6HKtss)EcC^dCh39^P+DRP1(Gc zPqB#`9dS_E0QTA~i%FkbA-i4YhxVq)9dd%l6DZQ>)92^aQZhio8Tgj( zCmTBuhd|B6wwDWOb1_`-4T`^Ngvd$B3h-(=D8JkwnR?w%UF0pKEP_RRf&!+$?b_7R zv*AINy}G~5E#?u11l^D#)a2fabWoWOjb{>oLFb6R4g>V}()OUClFhR#&=DVl&buxL zoqokkik0_++SZty%%5f{zVXRtbmUUx#+I`>hQIwxvw5-Ds9O}{*2m&6PcB{iW}>l! z8ND*Ym&bh&q&EIGNn?BLa>>x5n5U$R=>GeNwN87Fu+V2~H=bj08(28c5Y^gnshuVh zXNsH665r~1>&PYJt8V}8VhL0#t0FdzNrXG!vWAy|)Q$a}sN}Pp#+0@~o6{im_GR#YwUpj#w?qr>KV?@x@O_j;>Fl-D` zoDpz&$u$H@o6?%G`mWcM%=dplj?jHDUAo65U8GmvrI>8Z8`ITsF(XgLc?@2A=jkUE zX@M{YF;KCl&COtc=!RMJz>{XOPLrecy;rCc(;5ZNTBCOL)31nnbtQ3_$juFA_3b*) z4xGx!!>Jtq6HaBPqPmZT&CCc0Z%xRwR8&*|>Vc}Y zz5QL2O<7b^AlRtShtKXT1=4}?M9WNODF5Dw-iFwolJ#w3{4{ANg<0Nb=O^pD0yxya zwuT|TtRqi~u1+mXYKKJ=WUF~tIMyrHLOfd;yigTZtrJXt%30f;(v_WQN%fG z|FWL;gQfaZ)72#IvD;?ZR^yBc<|*D+O}eq!VAL?Iob!<$XBARNuA#zF4JZQw&Q1zz3nESfT(OmHkTk&4E zcVEDFdV{Ac>ekSlj4boFJNH*B0(%PQ5wk*@-z&C z+g`}=^=EJB;hT8ZhuI?B9b6}ej?b}zaY8>?u>r_THF3JEi>8{f%OUvDX}fVs9p{HdND6 z-JpO4!49c-Dy@Y#k!(x4Y1^Tb z9z&vCk0jE%+qk=p-lS9 z*w2-u48;jx~^NKH#K-pz#X#tz>n%E{6~2zYsGjtV{9t8@T0mDfL2hJ)f!qp<0I z>+SEQ1l86^wxOeKhc}8j$0{aG$zsC7$t90l$u>>;U6Xf^-o~L7lu*dB)z^>11gdcI zF&^`wyW-~ewk{WabS64%sBe8HlU8ZJrrn{LBj|Fd!~j#Cwap{)mPojmXwq-T@l+wN zQ7L70AamJfS6L3}-k*Rt*2;TU%teFEq7FFTl6&(%*E^5^=j?t3gG`xh7~>oH`NtQ| z=XS*NGi5mLw5mP@)Ap3~oqsBUy>Q^bwtcJXK>!cE3u! z&>;HCTH_9d^KD@)GUxd4aMsy*?UGLQT&%sRy|-12r~sB{sZtM%1L(LKb$lWhcI>L~ zQT1_&lI`)TO*MfmaTPayu+!N|>6gjIHMliaaFDG|pX>{rLq}eNC25PH6Uh;4`JkvS ztwkH7+gnyx7Ft~eeuJFYL{_pLNdZnlF}-S=!;euOxd7=Hp6|+KR8u3mZXVpH1$_kcVX!nCCs^CNTfqJcrq-b~; z(&?$liFfg-l!ID4QLHmO9iz6vfurnhB)e}NUyqWA(F0-$c&H{34v}bGjI>qe_mo?u z_-J3y@(Qlg=(Uw-?h3P+Zu*S%8iMstTc75!bK@pIEb@*7Yr^FwA>)QeJR9sz;`8G- ziBpVWZZV{P}>ecVlK;nM|4ev?nbn0kRbI zYQ8wlg6t>NMS~mWfGk>SiXAJ*5JpvckpeE~;#Rm_$d#dG%_ zBz@tLy@+tz?F%^?W^6HOsMyL}7&R(!F2ilhIgPW(s>%XHS?V<2yFd56I||vt*8gMQ zZ^EB_MHcK|3`XasJS=MiV9o}EWupU{ijN;uOnv?Q@Q^Bxw1S6?r#{{Tb?rCXv@B$! z@A{0n*jM*nX0d>3IhjdCvrpM(Y8+)Mf7U9Ijr$~Lx~^*BJ!bWQ1Sxh~-2BVp$EOGQ z+Z#tadk2;JZAa5-tZoklZ8I6h5c*`N!c|%br4CO>?`$K<5jLAINpGs%@lHR>Hz^TB z`A753{*7RPA*pG+c}B!Y0*@6})$UO9CYR3`5*HTk#k~yB5tj~nVdF7(7kC{HX6}b~ z-0C_uoyiB)%R~r6#nBZ-PhYl5-WCqJuGw2d0mM}zAl*+r3|c$i_m2FuQnEDTT}dix zHnu!+5J+h9l;4T4a{C)$$Cg;{)*G+$oi3nkId15%u(<}6L#%w@im!FD_Kmy0llKL| z9izT>=bHyxT}q%|6^^ccR$fFqsECR7!^wCZz;R>_Gayq_M_CEa1sH|eg_|;CUx-}UeoQ~cXP~OF@l=YX`B-JdQ z5m_S2zkNXTGEvzs}tDq zCHO*kF}=a2$f0p-#XGSF<0>>lLB4g{(7PvjjZ(w6B&)_*!>=>Lb(73gTb}ug3ak5%qDB-R!jSYHBa_2H2^pvz( zY*syK1LFIut(9E%GrDwZbuA;~Cz0BRw41U0A&uy54h|P9c9-^A15LAJlIz;1l1ec= zcA~Ea`ylqP&p*#uC(jV-Pzvnv9&Cx(7Dh8ZF2}IB74L`blyvKniZmW~X`X7^mfF<9 z=M*AESUH7T3kAc#`eUzmpYm4nwml^V^ST$y%OJTT#qQj4Gw8Y9XyxJ{sJ%-N&TApReTVoR?%mp{1ir&g| zuOg)i>n=!x>%r9Eq3;Cq~Zvhse3H@>pW~?u|9@@bIGp%mFU1ZIE-*ezU(f$ z#ci!J%ln>m{+EZkuc)rD%=|y3RsZV?iNM2 z-KWnWKB077xK93-P&8tu0j8SANIBsL!SU}-zI|hrkPXYoXa!yiCre7q$J1r8Iw-qJ{KERVa`m*GBx7W0z(#7%}sF84ku zF=fb9Da_pN!N6qDF07(sUty}clAwC0{Vr{FyD)v{x z{!c!L_ZH86n_K?kB&i(KazV5SZ#T2$EizI#D=gwdfIeT_(jVc*G+g^YK?-Wm#OH0a zT)Bf;21n9UGyJ=x+G}{S#K5Gd_~rlfYy62(Xm52{@K4H0lX~maeOs?)4{G=Kd;kzv zCUVu~wZzL%f^o}wp@>JiNMw3~K}8Q8E*UV)L(EA8rjq zRq>;cA&|hwbP295mN)52a^NwQm)n?pda|%;C$gqu; zy)=%rDmwx?N;yx=*u!m-C@reRmQ@Z@rTjeH6{Eq6GoKq~R4-U`64V|*u~c!Y@5Zn@}3(q@V7`W~FvXX+Ikz&OHkmCSlq9?j-K$R$H?=75^MDu*Oq)PRz zNsd;j`DNQ>-?QgWveo&muaN~wb;YEIr=B)n{4ipBl_jg#MCRCO`y-L!#$FcAvLt7G zg@TC>0WN(j+P?kVK+jt713kPPy|`BD{s!K{hDkhr(XoJ1iWk??q{wb1gszOzM$*L3 z&gu_0`>GS#x0J8g8rD)f^ePq($5z~Q)MI1pFMp#_MaN1BgTJC~`Uw=Ik49TR%d1vb z`g2x5iu+hZywH(zzN`jdFGeD3E@8X`Lfo4DNGT)Pfmvo2cC=a%)fDXJP0E#Rw#2ol zeyb+`l-EsocVX*YsNLgT*6z%b&$V(*NQqb{DyD}GUj=P6o4(FHTB0#gz_;4S;#u~I zp_F@yfhsXe$vq7rI}C5BI=Iej<=A^(yaPa8US@`$@cBZ@yDn2<+7Vh z3l+h5PTH0i)+T(JPI#2WH*^kc0ePe+dTCw~!H;~PkPrX>O|!Rv0+jiXlhHpfHS%qG(-vreqSI}91 z>b+3nXP_B!)8T{=v>%0?6YL-u2lM{s=S~UZIsf5y3_Xfgz?Z3ApPs`;1WwN(<%j+^ zcw-EZ%0R;_$)BSG@(ci?-Q)!C@F%+e^pAcJ+Hk`9nlM^yv>kaG99UN`m%TGmG>5 zv^HuXuJm-*GX(nxb!{X9=8L=ILSz7UjW*;zn96Q z)_@EQM&2dv{V8D-e4610X#Lcxy{#=YW*;E3-^Itvl$V!3%~ob-R4D*V%3hB_TYEq5 zJr{*d0_fY&P$R(ah9Y}l0u3_aAIb9X5Q64CYNH}RtNytVe|{;11oawnWykClyuhT) z!mii@yevi=NdH*2O?^qs&Sv%x45SelV!FX+xBY?S{(VoM0{u3CLkU=zjj>1r{|`Ie z>hbv3&pwAicmaH<*SQ-{hG>ASSxI$Ad%k&kHQTy>j%ib|51p(I6 zTUD3##{eIJZxuGE>bIar)^2VLbb4Wvd;@G1Y!=dyx7`8xwRoyzSb?d($zNOYAA7`I z7!+A0;Uaa7nSg+^L#|~BZ^4Cv&~;fJ3G^Lx(oWMsgQn-#{r}%cVFk{U_oL-C&3$}1A^FA!~N+{+2>yp?+fgFyL|ATSQ{;~>x*T{2dzLc;DmfQG1QsSyt$x6PPgY^V* z2>lVg2c-g!QXcS&8J!*<^Z-W8I;V5(SAN)- zAMgI>Vm%85VbvIAITZ=8NQC%s!}LFBEmZWp#>}Uh0vpQl0HMe_l18-yZdXCt)U#9l$G(0k0%T7ig#pib{m?Y&8rKB{tFH(+38mBGRZCkD(>31xw70a>8r&!e#= z1+hPg4SdPr=iq34nl5ugEBbZ$e=TAx3de{k@qF?Q7}wc*sLBroUb_KKHr@F)O%hi1 z#DM{2Ui~Nzec#;jJizti__?Je2_(v-eKVADp<-fUEnL<6NHEonNihbl*W|qN(cCVF zFC6!gKKj+@S_1*R|2Z_u>hsDxpCLmHT|c;@@~-)!HEjPu5IU&WCXVAiBI7d6UpUpQD@CJF_Cg{q`c6sYnTpfNmE&8XITDvp6MV*MAu8M*=>m zE6*?T{PCp#9T<7;GkelS)MD4L*Rga=o#%zV&LckQCr2+uh2Q^LpPd8zfLH?lIdN=6#kmF#J_a=-yUk_))?~=*sW5W z#yxq)Q-N6apq%jGcW(UIjyrcS>pZUGsQ-tBOhQ@6jD7a$P z?r^-|>Ar`xjm=C4=#U_Y8qOkx>PT+&nMP}9S%do8jej4}|1y}8nC^{$)+eaNlw?HR5Kty{F|2@) z;we7`Xc;Wq5zV=EaJd>78@d+FLW8TI4U<%~ph+LIJzn&U!hM8=~ij(E;1?|(WTzo-GB?>SGO3rG>ezhFRsq`~S9 zfEm<$y>S6`rk!&FT%C6TZ!+(wCnka307|{f@9-b~@<~6xg!_T>fX%%z&m7!NCy2Sm zZNGsMx_96b%eN|Kn|2HeGuyB6THgZAXS!%#0e;>mp!tiRjbh@@Px$5G8j2fbD*F;M z)hj@xQ!4a*G0tY-wK?dd2G zILa0YLKk6uqjmifvNksyyXmh|p1W=*?8g-ytLovAk{+QEznLPY|-}vgNYo3D6^EGMk zwv`Y2FY1EA8&1N1FfaX+tLEpS_8LW+ve8c;!VD^k*L(X=Tu7fco~<`-UfcryMlE%% z=s#BGr$$(M0NHaVCI$4P3YbV$yRKxTI0V2s1lth54_`+Ud;K?1+uw~)6UxBCP4GVx zqi$A<;AVvyFl-Zo8nF3Z?caQ!pQC{X%P=sYl3!94Hz?%$0a)#kLjm?D=5c^NuF8o} z{QJA!763nP(t0mcfQw>HQUmq>cA##wmZS~R4r(UQ1JDTm{WPe#3KkTV=F&vHv&nP* zJ9(R^J1sCP4P;;!5D>Co{`Z^EH53`n)W?UEYG}aQ%F6xIuD1%J2BcU*`wwTN2DRT% z`GqkQVj<=Q|LqcRu>}+(e~%jd6y84`YW7j))-CWti!h1`$gE@P{(v7jcw!d34MA}m z;XnEb`2YL5o;%MCBxre&^bQdRngO7jSH1q!O`x|p zod2boQ@~z4JLbf?g-r!CqxkF8F0N z$18wseiLl-=Df?xLb%Wib_*L5f64C0WfFWxEEc>8b#;yFE*$kH&wffjm+`ms|B^mx zZ4Q5%oUB-OO0m{{K%f@=swfqpa)fQ#ZUS>5#D-#JC z@5b`v?~LznOo=#>TPSHd%sgAtobXm#gAhphR9W|?N(LX!t%44S1A-JKwX&b~Cj+>7 zJ|$t|QVP91cm4tz#*YV0R`(aD?FR`FSr^7inJrrdyBGyy7f;FT2MjV@;_P1I!CvS@ zZMdAVzVcyjyv^?HTWW#@H6Skzez5Kab5VDui2KLKVc=ftz3|HCvBp^Zk>x9&cBybh zSju{>zfU`M_`xmhD|heqDu%>ev(L$3WvuupqH@5OEc*tXD{M{j-^fl}_i(7N3D4yr&*3@GXQkA@RP zllOyt(3j4yY&`}qb$V$X^dSAmlDa=;qJ&>7PF-n%(851gnywH*9ASEzAI2i%Cz7}q z^}_#J`ah=cZVqNY>hItZ3f7I**5n%BN4SK@!bZrg5k)*)*we>0SN<+9)E`m0fr+1T zE~a0{f^y{AIW>x~%ko1x*c2g;WY@o36yp&4n}ENMB6JD-#ihGGcWEi%&tI3syLbDe z^Fz1c8B=65@C=c!*Z$|Nj=>rp^rj>j-U72Y{5^~Rf00EWF-+aIg9UWViNvKPb|eVU znhT~76nNwt9B^cHW)PDzESpp8(zomHqa(@>HP&4jb_a@}=139yi|$;TLD>P#3Fr~L z_%h^UV$wN@S`j8+`d2<>ZZ@?dsk!2+8;Q*xP)Jy{kOvMv?8=3WkY7H6^0p+{h3`{B z-cRfH5W_~C#!tjLZ##I^PZL3ACbWxt6>re!-8^C+VuE6I0~T*jP9+UvJ-U#Viqtb? zyWTy1zN@t&UE!S#zv$@s3-wqjTZWxySK6jq@bGbAuW?`WmOf;He%o;T!+so7$P#fj z|5LMp7H*Q@!lt#}yGADggJWE(1S8z)nF6L~rv{idez{vuZvA3iF`nWA6&A9Q&;^Up z^nB?$&qw%|DPThGRX={^bB{3a{{Pr0Szx2Iqz@g$Q8sE^6ReTQY}jJp0w&b)y^O)b zUw?mIQE2_k$H;ze2B6vUrQZ47{yul#K_L(8%!q)_|DMGkRu*MKf6LEgobGPl$VELw@MK16ilM0e9rek10)0E2|{OSu{lLlVq*QXt0XUu=N z+_xWoce!OEn@?gep^PqS-~4@E<<@}JJWt+T=m+iMPjjI$qrbKSV;j&iOOCDJ5*UC<0l zN_fW0*^nj>h6w!HcgOPQEZ(F2p2g4g{Vj{%JL-EV&(`_3Ui>X+_**Z2>&0)q_>4HbNYt9tHpE5B%{8w7}`$ zIAbhQg3W_pOZ~53O9sBi*4lm5jgU0p0lc-8`t{=f$Edtm7*OkMNh2AM{%#cDhf3aF z#s5dL|Hr(9!oi%G+c@;)jT%8l^U0%;|5zJmFpq=2G|s|ZRQ{bK_uT^CzkeVhE==!~ zUjn2g@9w}Q@Xh}xgZVvSPx%0(_<|G|IzE6k97t~#!EDm_#Si;)W}ktZ6r!(^_J|Rc zfYkQ)bNV&o|HoWHa>3G!4;2~o{h4{>;Q#jz^!+Ynbd;3SP!8pP$(SC!qgXydhBDlGLrJI7LjdoPuW$Gova<#`Y!l2L&x4TOFJx`^e@#vsr0U@|_67 zk?WlmrwHv(C1!Gg@+rxy)uBn4m9Pt42p$3F?FULFW5+QSAFnGaJFi97>>lyk;@fJ{CV;s<_h|YWMR@`0>C2 za?5&}iQhK{D2J)edgX)loD;g~W3!4g&cD%jyNkTga|=wL&_(HwI2Wk`F8+Bxrk_LHMDki0`9P@TISuB#i*8buC?ADw-i&_4Va4Nsj&!t8a| zoh63Bc1EO-d5AImNl9&`XPtq%&4FX#4P_~2@$>uS|Bqk@Hj>C@(YpTm!%&b(}u zVg*er4~4Zm2MwSFL$ZXq6|>qgKUTnx z_Q_TqI7S@Ly0sU)=1h0CuI=q_A?wJXm=OLA;eqUV6})kav?$u^i2ZM#mOD3OJ@ZQi z`mBQ^!X109x1@J8XKp|U6OM)^ZN}ji$0K)2$8@X0i0Kh2wusg}rrynCooYj3+u(@B zp}8AbrA=zC`Q`p=(>-fL(cwtWDtUbaQ;=vuSTzhWJ|Wp!X=@ zsJ9pyOZ~z(;-PBQ{`jlfVR`J1>tiFxHOgvMFPx3FTi%dYKDCZef?rH!6*aIemB8eR zz^YVZ5!i~b*wIYo^5*&pf?%zKlN}_IPK#V_5RQLln4q4^gU7S>@?@jdFJg>hS8%rJ z!>&bM>jkQKjI&)UZph#i)k(6;dhLejmc5;u!qT*^}7)E+91Ds$%hI z7)Kz*_U#d;7H?@WV%hqOmN{0l23*VPtz*)9CiRtrMkD(xJa!w@&v>=hq}Aw(1vl%N zM2hGwEC!zWSxz`)-cVHHE3&eQXaN|cBU(fxMoMsI!quq&J^%v z29n^m^HR67>J+&?sHNFGL=scD_IQyO@9Z+p@s{+H>rEuN`OB4nXhRu+(QaTA9AQj~ zm=oNe|Af>Hjp0itX;()RZg$pwpSSK@=%s;E{vs36JaF!iJ7F-9h(1NPb;ot|Q-Ie+ z|AQ-IljGBGC{#*s$TZHO_ZwOU`!$f@GrsNOSzXT@s z|9Up_f}%a^OmUy`@7ICbdci)Me$8-}lk@*wB`Z{%_rdE=4>@ zCx;EDv$9lPm}2%=*@t~1w~=qh=-d%OSy$}tttXdAUon`(a<2%`>S@+mYG!dfKD8k$ zQDiT&dvr?YeRo6Db|hKqc*hl1D!3~cTr9YUC$_&nq{RBoQTpD)8x&75p_6m|oIy6~ zh5MII^&97;tF3Gw9(%bule_6tu$hGlI5{Ic0@mqHsRhk8Y}qFsCa_<=x}kKkC%EZc zR*YdZNi5hszB^c?@P5Ax7@ofAF7WvYI*sD$skkgpq^GcA_somc$sGq+I@vopUHbOp zG>wtGstIg4Jicl$cei6DE_1iwR;nQ?3gs+}PGXZPR@Xhd{U$HuSL#^hYULKoI)Rv? z-~+YCZP$cSSzNi5SQXpUHGA%OU$Y`34}WJuTGd1{o_;kTt<$RakvczN>HcU;`t!^i zXQw)G#F0)VmSPKh_-?&g0=x;Ye7t6(K5};Ph{ryN?b>OS^uKF<+}`YJ^#1lz`<=#! zD;ZrAv)@Kf14}N)*1Bb)UG@<1;qhXeYMSYd72DN7(9c$G<+=i6`@ff4gJ8@m3;XzeV9AE|mb3 z9M&M!yzDryzwu$cFE9e@sM2I-*Y67)GXZis;opbZuQ-tJh6kiM=mOg~L{9b}SRHM4 zW_f97RhYulcs^8j^mm%XO$X8~O+7qX7@SNs6F8m9Qe_*h<|%iT+gLh%QkOmNzov=+Bg5It->aSM>5tSaVt43+I^4n5c)S+inFNXfy6HLy?mt*w!; z7IttvVR|{Vr1XEW_n%Qsc3b->Zb3l=f`WjQAU0I0g46&iDk@E>N)-_S={=BwNQr=e zO7EZ)=^#?11qek!K-@@@Re z>^|vuWuF*rh->cP(^utPsnIV@5~2q=scgzi4y_B-NNo=&Ci&q@zqsZChio#LAPsWg z0A^F#sYl_Zud-|-Waw*t@#}$s&=7K^%maSx^7n(KRtS&r=WqF`<7>URW~Ar1o;WAJ z+6Bcq4p{Qwry%@trkMSZ$-*(dnk|%fnSMY5v8|6CH$0zrx#enzw?s4C=|f>ZIXsD{ zihC*t55EO%o>DCfh1D=jDeA%Vp@BIY#(c01sl07sGCQP!M8u0ArRo@sEqHuN<%oG7{nzsJ}xJ-E)BDb!!;l zU(l8mg~W)ZxEu}H2L^cgNu`1N3g8w&aI4_!F2SJYM%B#*QwMM7=E!=LAXV1J1(nPp z4y0#OVjhVqtaqcq6deuR$gz>PCRSZKI_FRo!wZ$s z{yf1a_%090AgCf4aTx!`Rie^%agHG>+7|`=x2;6#-ZJ~}22H-0Zss=?v)u~vA9Flds>vbnt??Gtul&Gh0nDKj zDZ1wMD(BJITI%Wh18%_<^(-Xg{_J)7pjM%UM@G-Gsv0{ywt7GuId`XQ5Xr3_k%`{K z*;T_F?y=>`I2MysHjcBR1@YN(ECA8Pldl0kAE#$9-jpk zhi9^kan%4<=aOp>>Ng~clY>xDb*i*|d4oi3PZP>QDe>IgutU2e=iXfg{QQ#Hx?Plm(g`v8&ln`<=g_cd z_aL-Jm|@ktTIN*i!a@4sUmL-eWg73jadtWW>$YF!Q!E7)hJNQvmxw;lro1M0Dmf_3 zjP)L+l=tOiRzzsQPfJOTIOCTMgw88&RGg@%R$EW@&UH1ZsVniuLQ77e$p3$bWjh2Bv(-6Gg8s9A(?Y3X;u*)#_E)d|s$ z9c>Zf9s3>5^|ax|@9xw6_o6R62T3+0a#bbjulTP6akUB}6n z^WQZ(!G2ijuKf)uH z-94=@LZ7_>L9C#nf4N{*RwNzFp~Qi)sh=00eOuPq!blocWBH z`6^T&S*8RwDQka{r+O(;Y5hLB9xth}xt&c1D*8hF2~)4I)%GN_L*O~(XFEe1)8Doj z&KI!8+XH^?5_G;VIeutDF8>I(qiSMFq$h1hYOy~is%R*sejA!ZbgIeVqpAjdw(neFO3Vvg)GS`!n5I`lE zfiFX))8;=V`hUIfG2x)CoU1>N38(|j&p3TZ8e7;mq2UZR!X#VjEay*O{j+K2V|H7U za9KbdPb$d+sf&QOdq6I8`}(>%dti-C9?-EL^e$2AhB|p~PT0xqADmr z!t67N5n+N)Tl@O?;bcyvi?K{`xohW^kO(VsHJ15smE}B^6*wSN!BDhLd26UkVtOO) z^Sk%(#L-puN|v+2e;M7Xno zPS&hAtMBPeM&?#c3<;P>3EQ7J0b#0f)$!DrY)#%?37_*1(Kq~PPPpHUwc12feo@LB zy*~3JB;ya_TYZVPFmk4a7|1xj6R6XRL0?7l1PKzxuM*JYwH|pSo0jsRGlA9H8eCw; zU&h5{TX=7}=Wre;JGH?yR}6wr%jmH-t;kjL;`NU8_WBw8m~hUfbJ^FyJbXl5umeZp zHxabm%)WIPowh2o7W+ytv{eY)E+U$|Oj{IqQ96~&?DM8(TpgclC5US3Qif0n$GpOY zfnYZ|+iXM^BN&Wa@-H0j6SLx5&!G;U%0(|7$RmCG7(G3;(A_7%M~)qHegtEWZoA}ARJ3Um z)Edwzf^5bXQjVL&yKykvu%~K0Kbxo*^;(C(s{F3M>qD3O+_omlgU{J|E-O4JW4e{S ztwX*ilWd%~B|R{^ooR`6tixc%V5i_8%3XD<(hRCT8)S-5svE%PGU1424b8znGLn!Wrf!i^?+TQXT3)&VZVtRu}QJoMvHs~i_MdR)6Gc~Q=9oi zQ?Vs(SIA@WVCH1dCk~@MGMlrGKp~1!QeinJV^UCy zo3eg#r3~hJ#?DFmF$zSrpO33&*p8RIWdx7G67}Gk96T!ufuu0G=|#tlz_O-FToB%_ z%b@PE4x-beqy=j=$9#z*VMK7Ge&{IUb^-N-pR1YFqE55f`?~za zs9D3eN*HD*ftHcetSlW}FH3n(s`qIg>ArNQ!dCT*oHR$9lZQ~;M3bE(p|Iltm4#aV z#K?w<4vJ))oSSRzYgVm>XOzR+4hxBKjg+lAo28$d3awOzT&6aC>l+C}&ns4!M{V=B zSId(}Ck72VKv$`~;l7k#bA5dQ#rfL~b7?EF^tL}M5;Qi?5wFM-o#mYXrrW50v5LYo zjY0+AZYlC~uCnbMRVAd2a1i^;6o`9o3|nR{W*xKHTJFL# z8J-Zj^F({$VPC3-ZF5I>DS)-kFT{r|@;YT^*L=q4R(XO>9Cac!gbMkG*((lmv2;>lLjrQRNo`RQHr z<=GJzP}kA3HThjqMuZ=;tG??;z=wmOYJXdat?Xpzv;V!Nue)pvmri8EM3E8(<(y7> zpQI#$sa*mP=mx z^90q7xiqG~9t+$q=Ub0duWt$WMJ*lK=11BN_ZIwYHEX!B{GEeRgq<=gwKh6@Arxjv zJWBCUqa321UT))ff|=HhjuWh+W$tbq%Z5+;8IH9Y7|KFl$!nBv)Hv2A3;K%|U0#(A z4j5Dw7FT%{J+j&5x$eiGbmbyLpkT@Pk?GHoN*+uaW0tRk=#wsTTPHur9qOmX@ED4T zn1U}NYea&O97H;&p*3M{&*qFakRk;>m$rt+BR`cWQM#TISewOA>II0&(|M{EjjD`| zJp!D=D|a^P3krh8Y>dHkxxS?g#qE%;H-e>xVhQAq`*q5;?R@dB%_8})Jzbmv6Fq~( z&3)?a4GbBh#^w~Oh8c0nK(6(>lnZoamJ^fQftDtdKg$~^H=Gc1n!GpkBz%T1D17;+ z9CDhnG^uWYo$ktqi^C_^!|PvlSDvn+yd9I@syH3-%CKsp9~CUyRCu9RcuhJmN3>Jw zT^+!8H$2TZ*u<1M;_o%L`ZnU>LoL{Fz!sN0O5)K!lgZ<2QFdgkUsup$N8Ff0PP{sh z#EJSNmVMBrrIjsc4QHNB*wb^w`=$g|RqtOS#4FeI%i9^oZltYiPwbgs)jwPK65A(}!{mdU1(i zj*B@+Dj3RseN`aVp)g{axnbcA*;Jqnrmk*3zFpqf5%V%?14=yf4CFmz^C3&`s_WL! zWCt&Hy?|uP9VL>FPA(k}IyI51^G+mbd{G5}& z*^V$BN@|Ht;r`v=4mTbMUNN~ducS`V_SoOV z!oIXo0jXyp%m(9nio}ha4)(S{{kZOg^3{n6@6JG6nf)i7ji!8?h~(#quNBIzreNAd zS^{>&iOp&3r{@phb-xVJFT(`Q#mMb?v$Jb<^QMFk+73r2O&6L4#~J-J(N2?usF3LA z=r!}kBO_d{4Mo&PxzF#k!McvN2!@z<1op$8c$Kn=eL-JEeXc(ZX4B;2FKsr!B{zx< zj~9^T6X!z(abco*(hY>uiAJH#O`8ikMoE@H1$*ESjf^P6LBaO%f*<3ghE}@j(uc>6l{pjMa0^H4YpQWu zccO`O4nr)PwFYLDZuC+W8bWeoftx_-W-{&IJ!+FKA6i88412sduztigV#1N!-4p1-zTeg$&ktW7r<=#A@HJ^g|}V;5n{}} zS!Q0c8v~^>Qb?sSz(nx+xjKQ-v6qtHXolpOv#pg!(rEnQuSAK)JZ-U;!)OoB^2K~X zGMKvF~f>YeLtR8%!DB@_xG{mAB=(EX~~4 zC5zUhV%008>b;GW|`!crb{Pwl+y zKMwXUo3)Rn*+ceIogIoen=zU-KPvowe!9ha{9t@W>2z?btipXi)*?k>n!B`Nm2kh^ zcoK^ygrxPb&}yJs?Q)-NaI0v~m&R71VP|i67_~&BRMUZ=+sE5dhxyrfFP`gljb+^{SYp^{_f+rd#GR21AW5bAO!$U=i%o-fzf1#}%V{vg7jK z9B7|UwDL6q!TF;HF$t(+$fYI2AZHJj(J{PM^r@>;E(*k2Ir6b2>zoq%uL&?{xZ*|pSDT2cH^KIu#5iPRhIn+WRJX#8WmWZ zdbO=RmhJEC5H?#9nyOqi)K_(j&6($K%Dk4MPb<3XivkV6sme~1Z)+BTl6n?UQujH@ z$|X{VVPchu_$znuSNIlx4s^=KMt}Nu`>ur-9mDrmwX{SNd2zn7{_riA4Sw$@)hAE3 z6#ZQi`wxf}zZk_?h}M1{Q3STY7j%sa+$}%%->n7zc|spv;L&9D(j_x#Q%nYf&T)DC zA%>kFIHd}Z@+jbR%B-E8`xnnI{!t*^Sw&u}0ZbQe(-rp!Myue*>bLxPOu@ef1bPCl zP{C=m!v=OX3;#I}+BU}qpK;B0css z23iaz9!7R1&?>eFFG$4Wp*@5x3<&#CltoKgC#`8ABj(S>^M4iQHUZHr<*C~|`}b)9 z7x(HAq4fliVQ+wwA*_GX&N=uaOZqRBgaRtz&C!a}1`aqV(hNf#e_gqUu+sryw|-KK z)uHugW7yf&cLw-l-lt4`2413E#45bT{N97=8phCL$>K=zhPc_7U+*^1dmq48IxK1G z|Jw3j-49K=SFY~f{cs0(w6kw#?Pwh&K-0$FfnqL8xzG zpog`l;qlZ60r(Rx}^_v&depkXhX;s3j`2h6gj z#JVl_zp&vyHv3;MSZS!^4WjicsMFf{4R_bT*9U+*nCsqic@FgPugwzgzjTWJL*YBH zbi1TB#%a7sJwe>;M$AK_;}fX?55n+E|Mc>uz= z*}{5fYlwi^USrW*DIgmdD-HJ#?L?0yf%YlxY)A~j$TvjEQ?*zt*t6(XtgZU<5W zUNG;`KJ^H|1MW+zJAlf3WUsMkI3%eP3BVO|!9RG?heyCZkNa-4bpUY{YQ^xYa1Sg< z1onlbz60>t3nEFkr>cTHP0glZJ@g+;k*jS-x`P1HzXqnD z{54FU#tuA+8QEZoQU8tdQg0`M7blYa<6w}Eh< zn)4jxDV{5D;oQ-`Y8Or(DqjZ`d?`KZ(RLf zX#1a>;{P>hGdtY6RBJBgH-|^c4QtK!X z2#v+ia+XmBR-uLU?_C0PqZ1@@X|0Tbhn~gPos{|eSxtX6)=dEA%a8Yih49cT2`<|o zaAWcOAP>ljk^iv_-cOxlF8=EJrl)MbOuaPQj+}~L^4p_{_*x1*fOuVxK4${`Ac96$ zL=z;}&=R~-Osi3s{h(a|!2yZVCc@t(nuV3Czaw{NQ>Wel8$8Xp(*u1l`1TqxUPRqN zod36IjkqQO3G&K(V|wgJaif;mdR`R!weN))`*&yjJ2iET6*Y^22Z?N|#(kSM;hxfM zQ@DyvDE14pFH`GZy{am;e*X6PUDuiW4_pO6S?=+OGgSgd2w!9}cYuAu6rVxcU?QiF z!m2$R-wUi7ouN*R{Bd&JzsGYG08WGRbE{7W1^8-~D*&hV%>+ho;$kif%vUepyG2Dc znoh++VSC6x{4)^Lp0er7@**e)(-k&{hwXyTVWvF{1ki!8$99k8tQP>55sp4=s<74T zIM4%HZ-{<^TID!GUjyq&ipjaV2ix=pB3Y1^H*sAWRb1fxIr9>FHHU){wOHe&+4k${ z?&S0F%Fz`BaP_+o-(hdQGE)zn;}82B=8=WVdpsHR7u}W|bjCl4rEBZi%%-@AK*!&E zI{yVewRad->O~KMqH9osP&WqX=#uW>KW9xQ@-#V|8 zU5t#ASL_mU7!Wq^_Aj^kY}NM2g_{oLxF*M`N7JrX(Xr3C*`kb`zZH%#wxTAZO%;Vd z|9EN42izdakN{uG!iCD?f6MgKk5EU%@m0(2@OF*e^t7d&BIb(Es?AGrdWM(GMLDskcCW|CJ0MnXUsUGHpGbc=Ig!)V|ll)>yabNHlHIpTL# zCS#bP95UjOW#YNq%0)T8>FnBV z1=%KV5T<+!m^2mFJ3nr!O@gk_Tn&w{M#fl%#w>G^r*4ts09!gkI9B^2T)j6{W8unh%%*&34SQgmRS2q2a=fL3`=@|IhlN2@eGg~$?}i=i)Q=> zuAEQI#E;_Er-wL0A*+ilY10jOSt`?QT0_Xv*AKWw z*y52sBNsd922SNLq;IxP)-pLCt1KAv1p7KkvTV$(i5Yc4U2~BGvhwtoTHN0?DgOQd zf(=r&T$qF511U(qFBj{J&nxdwz=@eYT%YtJh2rIn2!)ibIsb5qJG^<^1h`6p5IwHJ zKw9v=2Hl#ql&d+vI5d8+5_J&N@9=e+w0Wcs^IG5gHnS!C@aAhESCPr_?8aXS!M|Yj zt8R+eOB5}zz*hvR;J4hlMc;>T!48iu3l|f3&3wLCGMfi^AQl^mxFl3ENJ-dB%?RE) ze&!0$!ao*iwtZrn=k0o2l5`d~B(11JiCSMcXMa%tR@(H~Ld9GzpN8ya!&1KE(znb2 z`Nb-m+M1QenbOq)xrOz>JxDrb(j!pqjlNh*%@U=>ht`cJ>Upr`<1eQ3D}MiWtn=pt z^+$uNV0|7XUJn|Y#cDR5Y&0ur9@RH?Q!ii6udMgx-*R|pmFiy)xaLWdvIQx#xx6yQ z;_p|++v>cR2eDp)sfr4b{&nHIdv5-_XLKYiGTYm%0QrhloL#;K2z@j zQhGvIob`gw2+*U3N2*(0t9yh0`?aT|5b6lnKzicPQfFu7QT2ye`sGbD!PfLTaj zmpRw!(%-?(l|x#5br=wGBb=~+=aoDAErePl_gxwrp$nEh1mZM?-`!{zKrzd%*J;jg zM~eAtdjB5x_0a4auh5JGO+$&drUUQ@JUy--%`0u}5-hg$OB2a8qLV8V+smP!*q|%g z)irKTc*s9AzHLU`USpPMlk6JJ%$Rc;4wzL}8Iw?-!=G(S@3Lb`Laq;*`m0NgSk-pD zMD6DV{{dqRYRZqh=|RADq#OOSqe7W=;^vwKH7i57Fj)RDc!E~F*VL#KB(HYT8FrRKb|cl zdL&q+^dV^zrx6o25rh((U;SmBf7nX1!gab5g%F&tXq8umW#H|H1=~team5Vgi zDg7?z)=cikkM3H4hynXN;D;nQwVg4;D@nnuKZv328VT*{(N-|;v1w_)R_gLil2cW2 zJL7VIDPl=?0fAOpr#MbrOeBFmn@ak6upm301C>FJq&i^ZL>18A6u@#B&h@-Ln@(##M=cdg1pq}P?ZMN zV|GQ8r8pn@CO3FZe4=iAXrG-7fCUwE`5^f!T-z{#X>%Y_&){-`XOmLBZE;(#SIDT@ zolBa3>d}>zYqbs&78KBqmL=7&@K@Iut00~&umVN=1z<9=XjqQUM}#>g-4 zFD`vjMa4VRSj0s?35xbLu>WNtA1cw^UctO$stRKk5mH#&;=;uW8&oqG2H{0~PYxi% zf<%=ziEnXj^3_?l&O*6<$3Ic}JDR?YVMNK!Vodd#U z0|$`a0Z7kvU-v3l*)Ya)+Em;MpN7K9li#q4-IW}YN-&obJ-i<_Uj(DYvf%K6F#mAP zZ55gE*AiV_d=BI1J}R#N>R^H{=2zlb;_YgBULb&*rje_Mag`{fU~bjYy@g@(W|NbO zWqq8Og);2V5&fEF$}pCv#_fl6Yh^`^(wTrWtFZy`PO-c!Fij?g6t5vQ! zSHj-~)PLbSq$^Dk#ED&kZlFy^`e&;2OtWVch`%mY3vwfht(g>!0D0+AX6O%+=pdAh zaU6vn%plFq96())9?!h&#ek;tbkwgEVC`$?0_4pUI{~Wn*6I6C^ifse%aiYnoIX*v z`X1r7VQ^?|RV%31*mA+K<(puXha1AXoUPN14kW*@(nP4ngO5)oxU}zg;mMyO`d=oz z!kdmLZe}T9uoR@0r#^{dQwCMvz&t=7k?4T9z)UNa8`v~I>oqX-yxM9h;zTuaCf7{i zt-miVyygmRu#5u=4G-Nnbz8K-j?{>7ib1aHL(AHljnNDs?ho3Rjq8xi@08*W^Y|%I zaAn#Gg3y?t29`gT7CzSxd{Bh;<6aa2_ZCy6XUxOMn7VBaMM^PGegEL$HJ^_#z2NWi zHXGA5JiQ9G>BJ1T;}xAL;UEL^5Pd%h4f%7gPfDbFdcZGbj+%XJWo-0Bt}UDLUNH(3 zeBn?-tl0R}GWa?{GR#3P!8`$L5pBdemF!K)n&Q+9z^_atVtV?F-S2!o%J`dWPbW>_KW~psD;;s@cOq$Ms`u4o(@f~R zMgmvVBl}4KB~_zUV%s+QXVK3!yRzXCIniF{5zlF6m$s|ctG)MqkAMT-6(#?js$M&F zZsix5)<9Z^hFzYLKtj@GS4fqV6Cbf&I{dDuY)pPpS`yW#iiC8!rVP1r3x3 zynP0LMeC0f+Q=&#aL&HV;!zJjs}E^-JYkxdEZ0Ns429l(4}ufU(5Ruukh^x}H@uFf zMssMkU|ZJ@j4X2E3_lYIv28P(u02edpGGrbA)|)c3t{qOld+-|goHI0;yWez>dA$L z=1KW@`-;0Vi~S#3D>EvnKa@fKt5W?>v$vg^`__jA;qxDq3xsE(_pL2;F>lFgn4XKs zh<@>{L_8GMpIi7E`|Zm#Sn=@%1bM&5A<#h?$X}V5{{zf3r^J8zqV&Bt$L^E4HY^5v zO|5GPU18N%)N1OrxRlJE2)P2=Opk_iT%=H_OUhDqWJJa^a~va>MPXvJaIn&2R>mKv z(GdESKnN{Ei|`V+@$L!cL!QebWdU}jd|Q1RWz^{=angJ-$dmjz>7!RCBt#y#ViSdw zr*Y!+Xbm?~N0$bOe~ZwZIl%A1!~zbLrxciVbS(A|OPnmpw|gpia=feEi9k!1D^cz#gseDdL1D z+n}CdO{qEheQx>>+*j>IMq1FrW%EU;fh!-Xk`N;)B8xC0XX9tiGtXLtg1$T$zrK z6pn`;v}#9>z9iHh96vlSq_i=2q&XnOL;*fNe^Su02djlN<)~k(xA121;1K0Ny;-za&KJgAb`HQmFH(npW zldsgn`Vy6OXZ}y)<~mC=?sYhIz;Ssyv4Eub^?eiyXrF}1EC$a7$ObjFTgwwap@1IV z;V5uu|AJ7Es=~HeM~TY(b^z=H&I^)@rg-7f(0odxgyMEZ!77J!5KF&4vT#w(1{JQk zWy2-$ti>X?rK6dIIRrwJ+Qcw(CS`4-$^&8E8y}Jbe9?$IB&W^LQL~`iiO~jfLb^pHi#;cC}xRKbWNhLy)me>giI3jLzk)$qQk?GUFCdpl%q-f`(-CJWCP zv&EHeY|NNFjnueyi{NtSz;~0&eh%K6iWf<^@5kcOrszUKXrQOw7IyGE zSSx|Q$q(k1ILb^QazZ8ySvF08jZID|iP##|@|91mDBk61C6d!57(@>)G@Ub8Q)Z^b zDk$-XD&ZPJHIITb3cF7N*Bsw~RW6h=qqkSZGOCCS*c@)i#8T`NDhgORT{iLnwnfL; z6ddI=h2Q1MKIRd-24Et0@5AvElg4J{9qeLVu5G%?)HW8buLu8h&j&&@b@5Y|lL&Lg zi*{8nj(%5A-I$B+J-Xa3t4gXCt(YYeVokCANJyuLVtLyYT)4cje5b=8k+$UolQ{a? z;dne-GOYciS??pug^eT!c$Xn9&10rW=Yo_n<(?5i+&`~< z6jw*j&ot*yJ{wV|x;}PfL8#f}__HL>dmr_^Du|W3z9=K5E>*D*5OA;Yqm6+YlE0yS zwc8yu^ls4xLd*fPZOjO6(OUc?*|?=oqb8Q@LM&_c(8fB5%XePNTI4E*?4o{zFTZO0 z8{ua%g=De)jE|huQ|~?}O#aj^Q0*BxDgY+cfe^w8?pr6VW3ueg0CB>QJiPHbr14Nq z>ow_gG^+|Xs){g|gk+53UN|7nz#YTZL8}i8NvO)Fx`}ld zph2XbyTHiutLYfO*Vj6;G7tQf38Mlu1&f=z<>2c%l_)4&UVFf-?hq#vaA&kB5lc4f z(bYR*Xj`=TrdeYy5cd*=V^aAo(Wn}3Y?%8LIu&b)(biPrOG5t6B0MGIzX@UnN4BB_ zsJF*{qok{dBFacI1`WH@KWU8TB9MVR6C79Vft8v+_v0|r)E`U!7quVRY4B3sY|7-Y z)q5g@10U0o#|E_d=jUU`ubNg%La68?#{AON^a)iRhj&U1Bhk`Z6#%HVl?`#1{&F7` z%Wq{13CU_UaeolwG2+=;X}Atjn1|s=D&)u6+tw-&seG?~_xL=FaPjx!O(8t`lG2J0 zUQ+aUr>fk@ngM|oX3@abl~`(5I&!H2xXjWn?IlVEg^Rn~?8Qf#{(zCQDY)9>%I`Ik zS~$E$?HED4P|?k0=Ji%qy@3~58Hr%&e87IckW;vCQI}mvY9gE8eZK$D33YlbH2)+PP?i18}QcaQlYg=Qz0(eN;AbQfvu za%HdA&-aa2HmZV$Lcc7|c!^ZlA3b`2;na(L|MSna6~>$J(d(dvbTQ#5by%3ZREv_r z(1Yx(EtXB=1SW`NE?CTTxK9*q>^#5q@-WyHwOHxx2VdKaRwTK1412U7)<+V@;U@kF zV}~E6&q)%~)ir`c2S8_TE1u@}CTGpfRoL}q>uS618!Oy$t7^Y6(^VNgxcT@nn1x?a zIB#HrlD=9v7|?RkawXEsZLXzsVX!CS`tn3hfnZBhNc_;&LWP9Q6u%Z4snDmqIUxGl zOnd~mr}vO^-L2>?c;++p_!g0}p|hE83#Xa6yEzjBiR;*6iwR8F)bG;ABf?paiZcu= zD@<-q=YO#bo9WQLkw|w}(f#{$#54PlPriQ>2JN4$4-Pyy28C{-M3!bv<@tEZ`E{RN z4>|CZ!h2;ckK=$sm-C92y1P22mTv#bwEwbs-gD*c+h6qEdg2E`TXh|Z>n|fW zM|%Tr%&*LORKQp2VE$Iu(+UGL(AowDaS8cXe4UThaP9Nv2&lGb=YX%tIH3q7ewF1A5XXQ zO%C2Q{ldrMK6<_HVmYOWYJmRgF?VOb`%3h@k{YEcn|S}l;DRBe4cBXrEtM0&H5>0* z7Zf?4DO=X5ZQ=~GfXj{ho-MW9aIT(RKEltLT@zqqXnW@G#tF>94@H~9%6%DyVXX_y z9v{_<)9e^|pfXUxn}p6%^Zf5<&G<`g@n5LN6(Oh>jJ{kyXF^yi^<8 z!aa1*O$S!oa>=aP8jt$O^-G?aG z^+)nm^NbEy+Ytp$%5*Z~Eb2H&6)iy@hq0e?WP&6>Jhkk3+@r}W%fP~dSSqoa`K>cU z-G-#|01y;LTU&dws5$xFy3)qi#b7j#f|qN!AecY$4C^F*dn8}zb*i-(7hckC!1W{& zdri#~)FUrbZ+qwN@FMzJ0Q2tscopUQf+Nr3ACap973KI@$ZumMYRT7};Ly(!T6f zVLYfksd6<@(bpEe2Glth?0XD<9HibwWx%I_S(XrB_e5!U*=R%QIS^hGj$u=mWYcBt6-MXyEyR8 z{A)Ugz^=U*&ko^tY2((%WZzGYtA1Svm4Lq3qFyyjrL$h!x1VmeKUIu3bw{rsg)6#5 zR}r?K6>#B@1j;f`%Ny`j%=Xn8rCkj2UslO=^rrFX^{}2FMM6(00cqmk(gb7tP}<8X zH^6s;_g+vB zxR083Wwb4IONeE^z=Y0UeAR7qQxBpQ=w-!UXzB~ERy85QkNky;T3K4RPA)IGyxp7)xqTHly?i4P3?A_ncn)q5 zpL}U_F@3^C5d+C^DZ7D*DxvzY+`&j;F(mr#l*1jyKA1xb zoAQ!XP)lNI&M;-p96vd=I|{o<9G8-l$n+oPl*?P^4DLy%V}>6_Kn^$8#+RSYImJC-~fhpNF!f@$#bb zENNeT&InGvYI!5GiSJfR@9w@kITobavy`6ZJ}F~;U&Q1@P-wLF@95~b6RMMxeeJs; z=D&o)di%g-o8H`Syv~iQ*%_`G4UNsM{bfyeHkT%I<3LX#>_E0Lcktrn-)m~CDg}mD z^Na~iH(dsc2P z>5Pz=6kn6F^8{9dgEt-aG&|m7fal)5d)IlvP5InrxoBKMRyhABj*_CMM5R!OOear? z1USM>O^xX!=&j;t75`rHeR1wFXSAZbFmP-nu&WF~Sw-(>a7(IH_E9>2e!NcdT9fbF z$9n=D>o)-B1hfyGT;bWS=eLh9i(^jNLxGfzGh03ulaY$*L#^c z>yrbr2SBs4v+slN&7GoaOh2k<0Q@w2%=z)u(Ws%oJ-?@TfDX*dEhImF{gC5F;wbBt zwmtRfm$1)=9u?5=6cRJ_4Jv*-_t;)h@ARV=wZ6(9Y%C!k*RuY99rXTqoxtO`TYI1) zE5qIW2S6;$!HL9cA@nFeYmU9_W*5|!K+~20~wF@j0SJmPZ36c6!xD4bweHR#5~(mNH-qr2|B7>WTk`o|asID${@>;7Pbdi`G7`$$mz1=(A9&yO@~U|H^x4C~lP6=Z6q=U( z|AVzO%w!GUL82G`fJA2x#XSF(YE~ox2B7tg_&-4Fdm6OfZlpnL7V+`fhkFq_hMS*u zKG_GvgavH?F`xbeV#@9yX5cp{5ImG?C4=`20`GQ$0Ehgz4}gM4{s9FqFw#&^N3F@% zI*A)}`{mU=@$&3Z+9zEXUeos|0*HCzpAeIchL~?+UeiB^$k3@3@3ySmc~9Wtwb8o& zN5v_>^sSpo_T4+tW{tGgBPEGR0`Ib}+#7faf9 zU58z}uoEmKcY=lUfw>o$nloANA`+sO&#JIqJ7s!cQZ@R`^T~V1Uwn<`=G;xyGPIcr z81E>=zCN(I^Qp(!-77ppI{nvE91qB`y?@rIrB$RBSbw!)cvo@JU3*chypOf|s@WCr zciHEVSG@NhvA{sdl4pUaeX90Ak5I(BOP5GKhjxpNKJRHU>`hG~F=ZgL$@f*eYror! zpYj0Bf^Mhir9ZsF&ve*kmk8){`WWy<*2*1=dzC+1=;XlIB_zA@=))sAqeCm7RYS6y zA1v3M@VDFT%PBPDdNtTiGuL?;=*t_OEQoe1j{Ob?Dn?yzOg?nTlnL0)gkOx)%=fg^ zNl?b7RUR>=m``e6)}9OSp=)pGxcgoS&I#P5;4)})3ryAn@FPC!PB#|jnX#|2t!AhZ>e^=#~ZmvjL-R)S{AO(K`ILC$AyPL~tA zI@f+cH>}sx`Z53~l;y~~3f9BliBdZOH@m*iXOyv_q2W$2-2qUY?zHu8hG9VC9LWa( zx_2f=DKD10Kz(C|{W5@s742A~jZ~b)^ zz`x0W&kF!W7-X#Vd}(BkADAoyBt~`sU*#tgw%hoA0ALI1=*IsyAANZac>af-5c*x7zg8E}QO@msWi;$O ze-(UyK~TfgjK3-ak|-0oIA{hBBNIRu_2j0!!0-#@LNrzTvYEaDRqV88+JIX<-N; z&)Y_YA=ktKicY5;Z@Jr3aRI+^`*f|%4ovQkN|yy3NFSIOTFVHvizZm_0H62icC~H= z!mRSYDfcO0lQQ__xi**GeANi}@$%<%jsPazx6>LIcu{CJ(p?l0zC_VfwPJvEFRb4te5!TjmZ1^oZhSz` zM1YG%EQ}=njg|+r*A_ajU z_e~YE^=(ACd7}EFs)gy3PpkFH?N%3+H5^W8i7DCDJ@XtNJOnhD)SI+Twn!MN5}(LT zG--7MA`9}OgDU6WBOCv!u z{~;GFm}d$HK~pE9axR99B!9XowV-Ir$30Y?)q=E2%@Dn0A$sv$iRCCRkOwxn{q^hD zh=X@8ellwo*d!+B)&|OYPB$i|J5+i-i*`E(MD7cxq2OJ((#*38Wcp zT-Pw1UHS$bu8he=W-BDJZ0FGcQRRENFgp5fzU0pw~$*JvLRd?%0hW0Wfou6Ie zhhRjS^i~(Xmn{A4ws7ZEf~_0~6nQi>kX!<<%>CtFJ78~+8MFdP4@D%-1=J`R_eA|{ zeIXihi(Y&Mh+DcfWa(2M)(iNc*$Hau(UFF0twHJ}i-k2`ErSyk_I+sq2^kq)**c;c zrW~tBeNZ2%4EuIThp`9Jq|>kdZ)SM9qK`rce*FVf+?%xp63TnhEk`o@dNS{+W7+vB z*ZaMjMcr=nJy0wE#Ym>#{8`{VsL7q^!VYSX^2*O_(Y|fmIhE!r}TSYsm6V(aeaC7o|k^F9f8~&ezRQv zC+=Ol!$4!DT(oe%!%6|eY2%!$$q-(GpEHJUl>{zZEdDm`&5~ly`Nlk*aEbZ3-bz*X z+ifx(cq&U#ad}p_l7D!x%Wx674Z_Gl-?Jtb*KaQ07!`<9 zN%m0rGkOGR&`@CQ|5y-U_>UJ8E1#pPq%E@MRnW7U`1IG z)sJeBMGt(_hca#t0`g3c=FzI$|l5Bj5o-=t<+_~N7YF`j;BbL3d16_gr99fx&$ zyr6`juKDGk<=00AxK$E8cHvM#CNx2qKmIHC@v|BzLf3trok#s-qZ9?HqZQyOvh!aD zBnUq;jTK0;)|W;L@s6Kthr^$G|8mf%fs24n=h$f!{wb z_uM5jbm}P`EhEMLfAoIhJmIl=i6o+gEN+w7^YnpQ$;6gu(%{ugk#7YZexK28X@(^+ zLYsVTaL@Zt+a*tPUT=COxxK3OW$>Zz)1=?E@>X{oh~IBM|2sd1DgFhtI;^bR8}~Li z4+B{oa&|SdHhw%X+bA(^*6mh31l}BpIQPlU;T=NFl50kctPp+862b~4u&>ou(awZ05IS@B1q^`nt800i)cn@oa?ssrWoa0*8r_^ zko6b@ufZUK@Z6g|lF+mhd2s*_tHzctWHs9W)$aVLz?ZDZq@b4XeT>y(wpS#1>ul*E zipw86;Y&U6c|7@+u)k}QOBjIw^i{^GnXu(OUrK=60$*-QsSik2l%bF|fLf%uSjCc; z0k(Zi)j5Gru)ZNM&dwo{YZr0gGB*MWo4TI?iQgBy}BRrL?Hds$H211H2FvZcZryR)rK$7lN+Y(vbP0RX`#7{`!F09gIxGW%-x$=rKK z3Fou#M|V||u%|Xm#%ndFcQi$_s&e^WA%fH+^uec=2W3xdS$78&K=h2ymQUW1=~d2- z(iWD1K92PU<`B^;6kltOW}S6S2Jop1*WX; z0R~5T%Ok56%uil4&Yq&A%K~?!Dv5w;2Ihci>_ePwv~`P~YhP!)au*2w3mv4KtBP@( z&tcjf6&?77rV6X-5<^YyR)^wFtgJ9VAvunCSo|Gqr?&nizA;^Yve`GT^}IApcxaf# zIW{+Zq)C|9t`IOL8xT)687{TkJ!`^5FLT<5mDLf=F}9jo*SKo1$|J z@Z-n7SgbEzh1r_@WmHQ=6L&J_<=U$9Vj5>Q71AjKE8OG(17Py)w*ig+@z(I1+5y-d z1^`yB$O!7^;Is&Tcrw8PC^w}QovebDu+vVnew{}GV zoqXuWvTpQq?F42n_+Sz&X4f;rmm{ z{`YX?9s*o|55O*LCxqbt&eCBp0}I>lbCE*aPhw!c0qNAhhtY6OzR24o|Bgs_0m#SA z;7j12ya1+F%o4yF8UhOXOxA(=ck)Dc?%ApiWU>Rk(lr&pntpwD$^RVt=g0DzfC9rAnnhWtHd|g9}=Hn?jsPfr{S3y zLK)}O$BbO6yq-hubKY*4MfmTiOgeyI0kp!abI(9j$4Zz=Ad>Z*h$J{CBBlQzA{S+^ zu3G$-p}XX74GiHZ`Q^zHz{uzK>CMlYTE4X&aS~1~e+cx`1OH*sbTx`Z(WOq07C z3qs`&y6%;95)z;_Lrhum$$|GZ=@=QG-PVY>H{PKAQs+02pSblYzzT2(1U>@TLV3zQ zo%x0u-?`$4qX45iY6b*_ui*~nk+P9>e6r7R`8}6UX9o;{2PN4G9x(Bf)WF2+?Jz&w z$OGijp8{YkXA~@c$Ai(KfsXImEy1XN;?7My!962@Mb6T9G&dshe}cQR8f~e0|7n&) z8fn$7zdH%ybjs%g$FSNL{u5FX#Q`yURCtD}y`5DOY)9i?hjE-WGRmUeb+2%NL#6{xP_h#;-@=%6QkN{4re0vjl ztfNCSu7LZ^;@|k-bjk>f2fp1piE(K@(J8rSId$|RBKq9ig?4@n_wK1(-G^%;Y6%)? zfaq)97Qi|+Ue4(Fo$~+r3=3$VGF^F%9YAUgy0?ypu>GzVKcC%|^2?2(x-Iw9R{UQb zA^C5>>32N$oBzh|{(p$ynGGH5N3Qm}<};S*?T`FZz8nxy&xI%PoagW&)CJ zbG6gsuZaZzbM^%>4mF@vuZ1-qcX<`Q$5xw9vj|xG&))c9gDT;sQE!)cA0qm&K({N6 zsqY{2MlNBb-8&Cj7LSz7`{{NdN%AT;N`IHL{|BWePX9-MwPHhXL32J$u~7CuYf`sJ zuq`{RNTtsvh5An*_BWk=_m7Mdh?j4F9WM>HMp)3zT$QpK38gQ;Auav|K%Pkbq-u({ zX0BJnQ$GT*sUb~8;SY($5Hl*z8~+^krXvpV%M$9ZvcK2GHI3DHM4v;VJf3Rr1~i?mrJ8&YN$55AuPA zM(}sk@c&4O`#DMk?|iBF=MMe1n*WZ?MVemxzjE`NklFv0YYJ13j`yBKJI1oc>5FAOA2xP7r`uNbxG~2%^-C93^fG=&Z)l z7dL;RH(nWy$W>ul>2aO&$D~PA&Q!Q)F`sD7Y`2j(N}CA+`=R`JFrw9$Bmz~7yB``f z6)H|aRTyoxpEuRc?BGZi)i)y(+N)e{2cF{JaK}O2S-|>RUk&}_vC)N+#D(jm^R*xkqCFy|46lUMXLcw2trS~&Dg zv0loay2*of}qlNh``%E&0~&C7BCf+CLBM8Kms^>?oR!({obr-ed+3|IVvzEbfCUQD?bKf^3%p#6yG>^zxl z8p5Gde&s)xCv831zlb-fsKRG|P$Ndavk?4c9i!(N9V-@VOi1*DB-Go*Y7%#x4x{ve zixy=;>BU}g#>r$oP!}A(b7IxHYIATjc7({913-r+SH%_gEqq z(M~;ZfFx0PUq2Uy2Y?$}qu${IoKuka$W@y2Oh>hBS+g}~79g>zT5Y%a9?b6-+39GXYmIFPk|<+ z39uq?{kMs6#_Jn5C#!jQxVa17V<#bBm;pD@f+JvxITSSa#5w=Qv(*E6HrOc-6UFNt z&O1V~cM0>ZCP0@oU1R6GNMeZ}p63FgA1n}l2XZ_l4#TNMq*8N$Hj^T8w!JSdVdCxc z3_2!4CSv>Z%!~OZ;YHsviO)D`)=M5Bjvo+G^gc$-P zVM(Y&TFN-teb0UF}nZ;x@g1t=|`*m;HcofgoJ>q6gZ{V4i$)ZSN($KBAUjlst4*)bHyp=3<8lRuO{awWK_P$Tw^tNmZ zFo-$zV9zYo-*+J)uY{{CluGoFyWXgwI!Ik8y?Suz!RQ4x6sG`?#Ci|gsam-oXhcB4 zbg>BRneJdd=K*1rs%*>dbamB}rwuX~L|C*7o$m>>kJ>0o=F)LJ_#DU3o3WnR2i^OeL7LpY8}^NN~F!VWRN#{yYn zq!Kk@@<^w*&wVH841u#O-IQF&o5m%^WkUt~C>@Y*pUyNS;I;f}HkSb|9rK4PdREfI zem%kQWC6GCwzZzn<7avvWuJoCAcj<^Ar%hC^MtDgk60)wt>Em$s*ZByxVKid&d{(9 zOmu(`Q#?^5uS41vfmPB?yjJ(t=c^3n2Z0U-#)jq8OJp6t6_I$_fk+v{&A^I}XgP3l zYg>_lcNUe|=3?O0>S%n_bm?dd9wg8%W|t97DV9*o0uE}_VAfZKdgSCcMc;o(8@dmK zM*GfiXHNgR+~`JtMT~Lpto6{L#K?S~=mzSW4dvoxxJ1t()=oedz7vp>v*(pqy5D6|BHkr~@e}X}v|+64(BN64P~e)KE`K zjyx;o^qcws5lpNpKtsHMY*#)wl7uAgHCb2qeNPIY>{t{bajdD|iCX18IbAFqk9)CS2Dz1C$63?wvjy!DV;CAwvD|>OeDMAZx6b&SpgIF+a@oMl=8k5hd1H-vm#)tVpcrzHB03hIxh8r5Gs zo;fP5Wsbqv>SW7i&zlB(X)eqqBnQxl;lwXmaf=}h-4U(+ zzE0Mm@$#7_VMwKF@s|MlhPJ~X4GoGKgA%&;4t~@(Kp*#)4Z+C_QAY6xFV2T*Kt|-2V3a-)#bBQAZ{5f8jkjB!UV?) zA}ng95Et#2o)B-RSu$6~)>~lV=PTd4TU@t3f;u#{u%IOTwvqiqc`})dVHv7>S)$|n z{M+{SU4oA)JqxK+n;Ro+r;W^P)Rj#JUWkja=-0+C=P!>;SDVJIYk$=W-yC6SA)-lo&W zH+QhUFp44CTBlRc5O26I$n1cs%q-EzqVi@hV{2&}(H&nr+^yScq;g4(d!52-YB+y`dnPTu1v+!qx3dNgYPg+#D0SZ!X z&F-e}9e4VUWDS2v$v1(uj{UPa?cPMMe+a%8(gok!-JlVA9+Nt$aIEd;-A=9Z+jR78 z;0fY8J<0F%n$>_UIa#~i_6d3@m|X`tiA~u0&=i(Xcsj90Z++wf>GarVKtV5W)i9FX z=KFepj765xc>Ulgu}(R3OV>-nTtyC|Wk%oVBxmnVxba$gbrALgr-T>MVsUzH-K*w% z7Tmw%xcTNF({!}JH+Eq(XBlfv>IbFIp*DHVZr1WGue#aM)6B*Vez~0yE!5|!R<`XA zF_Fd!xMfDWO11~U`7`B0Q;*a`qVKPIj*N*y(SDsiyV|35!fcKATd>x|(;r{SoY$}L zB-|8u#5Z-U`oRQHjbF$a57t#Kzs66AGdbAbVbg7o%U+_k7*OM2ACE+e?H(@;BirTT zM&>kyf}+$Gzw|k2Jjipd);FXC@(G7d^(Qc>i~NHGS;y~G%mmsV3?(Q=D=M%;M2xH2 z?JJQR46fqM8yPL#BFnrV<*H$>LdT2KLZ+Pygtjd;8>G+s=65P8-0&d)T4ij0@C)9l zKi?V@SRvwhQaN!l_o_OL9J$u9L1Az=x+A(G;;8gv0rZvEiwR2C7jzX~&fBxaaI_WH zCDnle)0NPk(ZE8`PZ_HHB z`^fmD(k%Mj`xEQ=u5YZ$pEf@u%s^Md)}?Hc1r?S=#ePg3l%)k+F^8Ug`2>CrgE1IH zaNatA792T7f)vg93e=F)<)@DZM2Gj6;F(8e6r-r4$=*}g)<@Wv=~Kjm9@)13Q8Dpu z_U%--sby#WDRgW)#Y2%pMlgg8cLWs z*~^4_2_wXl6NA(IvsqTQ`uilb>vzirouvb{lg~U0Pq=(5CMCCqH5Mim%Q9>Nc1yGr z;t+iZo8iHyORvqr7B*zXe5fLSY>>Qfl`p*ht)*usUZk_I!W0^muN#Id;xd5EI{*E? zXGr!POIBu>Uo#!A%OGIMGCTvd;JXfocu8aZQ-kcVa7dCO{j=P{1Ajs|oiLxBm&Xj@p1j zm!fs~s(G{OQegumyy^p_WCtdYPdz?p4YJhkGu3SZjYNo7K3{*1s|~M6zv7YE6jin8 z8=v0R{Gw<+%Q1#pZ!VV*7X!OkPPJ!Ks%iorKDel6gvIXUwC}3ipf9+kef&U_jv>?> zq|Ltr7BihQ94K@;2A5X5MnN|OrK5Kj&6dwjcbgH@6L=L14m)1#)k4<=a%v6IazGWih?MW*vu!aDoU%F(g|q1~mf zN>qxGv|wnPt*)3Z+ObZygFLe6wVx0=jtSoo)G@(YR_*dJSxMM<3sstyf*wFhfL^Mt z$bal+jk@=&*6MML2tGwe3X$nSu61F2zovpoX112Bh^zdt;)#JXU$C}tm?OUMeP1+* z_EByJsRqbXHfj$$w=-hQ(S3kiJF|QBJ!Wa5<2)}ScJ9{^O{e$ zcUDEbM6taHO*ZrsT6ai8s{;O+H|%3FN1MxNtn-s@UqPXcx%MfSg?*=zGo`oCZl3M! zok{9U2ZaOYT)2Tgvy~f7Swa#oq@q^DW6IX!<(!Tey1bOK-S>E~>;U;=I{#YxDJ@4u zL>LrOwsI-hfF|jytdDLy5{^UdeE3rGIg6p7&|D6<&xLjqMThbcF&kt-mik~l0nSCa zaOP73K!p(Bgl8<6?4B&AWs{!lx>QG8Y#)`59eA{Uo8Okz_UvJzpnv1N4zLvP#>r*7*`5&70QNn}Rkr+f8Y zQ#Vb9-uJfXm6GoR=Xbe5_am#+izo%8kKNXcx8Py#I|)3N1|rsHBwAjwFHCim)Tz5v zf2OVjz}cZf^!#@PF?3dzv?oK014tbE4k8wLtTd#_-ed#$;JYPI;}KebTEZU9w!E}r zIP9eukin^YGF-iekJvh^m00M{ogOnBMDxy}O%F~2hpXa~1f{q7B1U1WVTE;Q2DEU} zX%D>0(EAlELXuhvjrs@r$b^jnw`n#_`r6?0I1DSDidH~F;{qG%qN2!4(IQjiH| z9nqfG-4thMibg3+r(U@?u<0$1ta#6DV~oYyKBVw<3~zWui->K(5HNkXH`^=3ge;Q0 z`Q2iNp6Zv*WJ^_J6;unFh_`UnkiCG~BdA8B+`oHjPV;FjuA;w{q`+^xuVms0z~AHa zEFPGl7G{-7m-!P;>IT+zt~dT*S9w}Uq+6lRs;kO~1}DH?w0BstW^SM&bYZK;eW&AQ zWH}Cn9y_gOT^iTnx053(_Voj3VYzol_z&z}P%~}MM280aqWJtw&fPSr{A{*k$sy@O z(CmpGrAURB(xW;lP8Mo7X!s4{JptTH)eh^6i;*SCgg~i@dDZNC!*Hqa75rsaxCL1p zAN6RBSL}Q51DjH|B7fY;X}4@s5U!3A*;k*XI?HY+PPJk8tNfy%!v~fkBVVw_0ndwz z-w6hIcm;x&vUFPW8FH4CgN0yEK;;fbQ$u% zWP!PFD~Cd#v^tJ8d}HeikKjuYQ9-G&DXeWbgk9s?@gPWqr}P?P z-F5?fyw28FcE6MRaNr=rIjmrdqw9eo9MDN%^W_5p|DcnQz&@ni**6){Bd3HR6Oqim z_t~XBX2h+}d&_7Lu{+h*GPMS1*(dC^6x^I!eIz4dq8E>>#z)Q#<*6C;Om*66^egJK zo(Ln{Q0I6eyHQA{aZTH)fY8&ioJug>a&qoA@wRp2I5hd?>O}Tgv66_h15d72Rz~d> zWXC^#*J5b@-f)^v9>))oJkhrXIKo;4C%>lfVJZM#)=X|hCRMDjX3>YL{O9f5(G4>; zeWN%;`W|6TUZi?1wVD)OQ%)~K=hPNBlN=ZfnKai#Q(Y_)zlq-^xUqLJJ9vgi@gJdT?Qj^D3#o0pvW+je=Pyj(N| z^z(}p&%I4lhVke+r_Kh6^&vaJU)tsAaSDI646}~g4_ZG&(LRFO)xoT)MNa&9C&OV; z$EnAG(BvnpBby?T1!DpbP`34%Sv-|ST|IwCs?t;xH*YDlUQsCdZd7+y@{|-s<#1g$ zOwQ7=#M^0#*eM~AZ`UW+?U|jGq0-{sWb^aUWr)abs#lgD=$ZPnAEsWisf-i^nor~H z93H{F_Ex&}*CC;d;qPWu(VYW@R~6}LVt5UGt!!d*wIyy7(X3R@`u4cLRMk7~ zaI?Jya7U>e+hp$cUEFO}A-O3;IN*YTP#*s(=O z?zDCS+FjO-31s*O{z?VXF#~!b(QLROU`V&3^>tbPVg=SHn!PB+({i4XdoCn@QqUeC zJmQM2i-DAJ$z4{&I&fyz;}EZ@)@0A6U`pGVA7!OkL{;Nv@tJa{n37u2y1E(@tr%H ze5Z&|h`E1K;7mT{Ic^NIa#+;S7m@>K)0Ei`VI`W2?G#LQK8>o2ys@KwOHokzCxzm4 zX6yb^;Sj5pK;#X1>npTS0X?!1{E)5|rHL!HH<^&~!CiLc<3a#kx zgAOF%HOVh6X1weUYldOChWV20=!LrR-+rhpIJsv>{`NM^ zH`zl)!3~)W1GW^(e1PQHO3v?f7iZV?QwWOi83?Jp3jmCPKgC)F$CR^{EoH)~TtJ1b z1)B|}XT;|t6bBnXmFQ0CSW}qq*C?55t~8U{T{E4zv!j)lxFaG-?(iv|sy796s9sdcuIq`r%c*QAQ)LUuTc07;2@R$g4t%+}FGhlw| zTli|-AO5lW=oD>Q_p14_n*+OT(zI8Vs2mVi2uQ(1F76GBy=)az60s9&LWWuc8$7TQ zk%OX8a(%AR=RX3VEv5ClSkvAw%{W(51Fng#JT-s3VvSR}^1Y9Twj0#}a;nv?Ca>UY zsVU??*)F|*Gm09gSNoD6CEcR(mvisL_1U|kP_7pfaLptx){AO>`3h6Y>S!B(#>|Edu$$2$&rw)7!_#u z9(hZ-|LPADa$e@uth%Tw;}qMti{>=w#6?j?k7usLr8_ZK&BfD9?k=4GYxA=Pf}kgfpyOmYj@WK?osgnF`+UKoo`k1LErXe6Y!<53 z;p$*58P;e{&Ur>(HeU{HQ~f#i?QPT-tliCsY29VEe7Irtp23mpTi~3oo&uK7@k517 z=|wJRtep-+5XatdLCNOo@G*l;z|Px2eZQYY!5y<{YfFY*^!&vpgB5Vj7k+OC z*S(^E4f9fDO*vPC0=hMOw^Bo`;7?&MUOAr8p=!Wk$mvsNe8UdM!2$9lG?EF*f%KSo zKGRUf_pGrLCAaLgwLSW_dyuO+UsoSg^{tA}3y;kys{7Jtonsl*;XzOLs8bhY+f>0P&0LeNQoDaXlT>0+ z5q>tjCCCV?DXE7JJ$G25G&D4YN#Ovy6k)G=%Wfm)@&(F7D>zr*P$|g35>!Q@Z!{9e zcueLB(^#)aV#)880@OeRIqcU%rvfL+nXoTix;-Hy`B)tYvMIYajvInh!m~}ySP0fV z&Y;D#Fqpjj4{ zO%^q#mDVO6eO(Ezn#P*4iFlKAl4NJz`u^hk3t~^rTJ?=BIT}3F0wAlwo&p|M0*a^NS%l! z6zdzH9MVr+uZ(HLqN|1BXlZ%vuTse;tZ=mO3jWKmO&ddVzHl0)sL~;4X+`<6jFg>` z<$SZXx!NU%UE~#gNpt;54#E1=E2LROu?GeB+^%&W$M%m#^u#o_)n3Vq|qDxhLunJ0g(7T5z9Jo2lCe+|T*)3!U6K)e10BQ-8#5< zulS*SU2^wc ziio3Q{QR$FQ?}C?arbpn^iv!sYKde=5BrZl)vnwfIi@KU7DKqo zsc_hzC!vyNbfs?;e@CMvTe`zxrw&_>=PCjrpIvui9nQIlM5y8$v?co}Ovm?@CLnI| z_CGJRZBe^M^J$B-dRTPHDul5owWnFk#|GQY8;i!ZGya~h*m1_BD>z$9Tbp^`-GPs5}No_UO=n1b_0aOk|_ zQRtrho@(urf*~RjZ)usX4^oT;&R!7}b~fe;WSMrymcxo3M=0d}DL*2g6Zp^6JXjsS zIB8hXdT62BSv0|&>aXYJDPjd|f9(2x^_MgTV$yRG)cnlsOz&uBnReqXf>ee-*{Ns{ ztTG@Pljn0J1fYA5Z^23WMWuL-NkHko0cMDp21H`~>jV_!x9 zjv0*zLxh1Iz64x8kS0QGeIKi~;z=W*-yrNT2&U)s{qu+#872S2>U|xhz>I83ZaLKW znH83ju^xs8oDsAYGn!U+6K42fxy*eE22g34$g=0M#W%Fk1uye_r;vL{R5eHTgnQVE z)v5kc-3i3{#32tV&f15`|Y zO(DVra-k(=lU$T%{EO{I4BHdPtu%6tK_1|2v9V&il%(7j-P4YnSpC^Hnks4_d8JWj zE|#{$7_{BinF&1anvfqYlR$%F{~N||6Cp81Eftw(%+$CF9hg@58SL+Ew9#7pHkm_X zn<-^un1L=D`DK>*ngfhBQO}-VHIvRUlYZJ;7`Ad#MRo+^p>lumNsiwP@p3lxauCV# zX!Ua0!O^G>EZphzYs&PpY=qmi2yh$X*0R=h&uO>r;KvPS)YP-iyHDZeDYXytP77wz z>g+kZ*X*F8Yo6Kz{LT2`RKeFHYORo9GFZ&JP_@{I_;+T$&I8!re;~I)s>`V`UI*bf zQdWsdSTp!MriO{Xk|(zkD@Kd2hAt!U9LACb3RMayDqv?$a_&oP)6$_5_wB0p<4x5Y z=1ku-C2x;K>B^d|Dr#w$ntJZ8I z+K4MIybyjw@pjU;W_g_E4A%e3UsZz4b_jg3tY=ir8J!TE=~DpzroIzr&DQoLAnCe_GNAydV)llyi+qM zv#Tr@FkYAmr}#b_>r*I@5D@)clnv z&eNjCru%8>_sIkfB7VbKXZ4|$a#|cikm)O&g;uT*Nlf&lI2Dz2f=HdJL+ToYblTgh>9hO(v7)LZR9@8UUpYRI(NFltGj zY;M$Ukhoui4nouL*`c@kR~4L=-ufQz2}#Uz`XcpMna6`eHK(KQ8;DHppBWlbh(dM( zj5Gr*Vt$kYw{dK9B`dogp+yn)hpV+jrq7w#f(>h?KiuD~dC|Pv-*={#{e8IS)WyPK zPWADqq8@lQn)WQmnV!vE0JQMR{l2y-#M`SSTa<aEWE3>%6+O?&k6L98PqQhOB7QR|ebF6+idFgh&^fB__k|lpa^> zgQ@KW!wHf5-Z{<&457uZgGQcZ+FO{8@A&Y0Z-&!z>F^gYhsTdN9#BZYoFoS3iSm{A zXCa&*XeFQ2Xqs{tl%-B_3e+HB&~RG_9r)byd#zHc&CBD`HeuTYD} zM2j2aOyYk3zAVhY?K-ire7K1D9;1 z?53?|6C!-U-)=esxewXf!Me8ix&{;1p#bgE+{j;8&F76+YF7iVdx8uP=T0T+>Y)#` z>yP(M@4$D;MUucl0xs%_=vcBS>(~tC{?WVj`j<@S*_;ub-X~ zJ=13@dQiNtWJ@GBOaO9=OE#ntwm!@kY7C+DxyR00+wzgH`fS6?Xj)BIu4PVuetVMB7?~sl)rP=r}Yk=Y*3Xix!KW>7o~y=sCSFCBCnj#?frQ4=*aq`D3Ec>!3ux zGSA~t)AqD0E!}U5lA&Ljaj7&J(n;rD1qNF?Twk7S8zVklz8Y%S3${FJ)*&XbFyUTv zrCG(dqk`j~2Kp0k-QmDYQY?IEfRgdKZlEw+B;b4^@6etbUcnbwZd$zdWAu!|Oju~~ zj~m1PkOp@i;O_Gw6&iUcLU3?^`Wk(maB@N?`&7v*l}gjI*L!GgFlSuy>h`QXM;zF@ zO_%&_W~`oS5@pvbq^aYn#N^~1MH1e+T$cOVl{tsWDwDJLq{PB{bb5gUa}>?BD8a_K zH?Y0%x6!|B$vs;6>OMJY{&<~&mk|BYHrEl*>U9)MQLAak zkuI8ZwGTOMa24dpV~5RJo!SIkdUFGULh9!1q@M}1ue>4}axWJM8wftNdjs7}=5m|; zZaUahVq|5z;PJM!wszJOme!jhe~&C%o%QMi!sUZWW5l|UXTeCt4o!lt&J!oA4v%ro zQoG&HO-@)u9#~0Ae_0*ps#9G-d|R1UhmhpvbMb91j*oblIHrKWa=)Ouc<+6d0Z;%5 znz^2!|1|gR4>+m0&3IPo2fp)59Ihka-z5aP`kn7<%_pGX^;>LtA}YeV*UU+ z@?I_j<1)rA!0Hp+47zYtmwzq=phrNol>x^<$w9kmFGmayp!Wao2Q+7NCM`eT>Z>yI zn}&vlIkrjKn>TTGhNguBH zbFzxcao@Akx!)X@V!4bl3Y4^_WVkTS^`t;mS(R7xphZCcTqaLxlEpcI(c=(hx;T16 zzzR@Tdp?f&18Bzkjr33FTh|*T%ENA4oRN_88JW1uVF&}h3EA`^Qlg6m=8hsI>SB*9 z@o;GJa`SC4On_$m*jJJD6E6o!jz7b_AY)w3KvgW8mtw(Iz&G{X>VlX)$N`cQ+S7KS zN8-G|*M|m&`235pEJfT8M+Ooa>t|+0h;o4j%TRnC>Lor~oa9&VthRd=K&Y>;9}xKD z4gn+Dz3DkbjEjqSF2B}fF~Nbh=<&s+qw-=pcS?D?*@!HVS0S~eetjXdk*o`!m14NH zug4kXp4mSe#l?NY}Io@hcU z0TA~D@?g1e}+g1w4v;=a>WoF8Sl% z`0S=)@+xlJ`SG%1Mbzdf(s;ymC2ZAIcQdH|J=sWaKe?#K(O5i4v_YcFHHq>UGk+QA z8P}STv4JH?D;pQdGog&D4ug$`XA3Px^>>jh!EP8DB%h=2%c7(6r`1Z+sqem@Nwf5& zxqYEc14^kCXlnt-a=YWn&q8;(8ZpUxss!%8O5{mTUdt_lHG;fcyK~HUxiGWR>o@8k zjC#`$Z^5ZCkLjqH*_vE+`oBVt%NRTo^-l(P(rHDS5oDin@ny|dbzTX|{cymDx~JTM zFB^+b8W7}f>YsafTmG#q8D8L=7i4;>xTFRO`gIn?UtGnxdBk-^u-#=D+h zS5;~^rtu|*H9cPe5oMgyw)_`6BZ4UW?MjNfTtY`Kj`IbhX)GSROlcCenAh$V8eb|t zm45DCwft&D*yS$ZZ+tAigp_7T!6m?L`bcOeGwi$iDw%c)x?N~AIX8TZOdvyv_3yp- z%UY=dmUI;^@2}(imlkFK%He`<@aOgFz>g2QfTl=LzVeqh{(Y_CC(rL%Wp6h9Kbl?5!AOHHbHATRPyXkNGU(mq+DkF|O$4jL{-2ZxT z!E)ya`5QGzKvJC(jafDmEOR%{XoR``p=>JyVEmhxO)rS`pXxMKFO^g{;~o`W;1i2) z62j#LHXa@z)ISZuC4YHf3>d>O{;9ebUx3*U4#~X;b^e@UQ@r_;6e>Da$*C(*qzJHj| zdQ4!=kYK7MU6{x}JJ(9yN5uUjzpKe$AiT-+22&(K7M$z^U_OP-fwV z+0e#~KkK>pqXbK~K_avF&RZe?ZwUWmwe|M?ZySS%h_VJ)GiN2dl_+A#g$c0tg8%*9 zUq_&ooEeK~l~m5+@Wb2d>~iBJJ(^Gcl&Fh8m;s>o$!LV(pH{;zE})A)rc<{|iQG5n zkKe-UzF->uEsSf=Qf~@3WrwM;g%QxrJ!p`aJYjbS4vzV)6n)T51uhz-4ye-Y`=@@; ziPHf->LJg?Vf(W_MupV0iVE1fAes3=;$O$$&v$a{fF%JssLQ@!7XNHj6rj;Qt1E{6 zgDm?W0}yV|4ejOm4;|sk1=fPh;vjGU@t<}6^~ZnEfNeCLJ(fo0(pl9d;GfJ>MaiNk HFJAvI literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/jira-connector.png b/docs/management/connectors/images/jira-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff5ebf83afc7699e1c1eb79b0614e336b9f14e8 GIT binary patch literal 158772 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 J@@#$1{sYafk2(MV literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/jira-params-test.png b/docs/management/connectors/images/jira-params-test.png new file mode 100644 index 0000000000000000000000000000000000000000..78d51e823fb61b9c629d932e058a708e8a4d73c9 GIT binary patch literal 186073 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 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/pagerduty-connector.png b/docs/management/connectors/images/pagerduty-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5d240f42c11016d9ff962e7e3dbbf099973549 GIT binary patch literal 136276 zcmbrmbzD?k*FQ{yzz`xJL$}h>9RdQ9(j8Jmcb5YS(ny1}Aky8bNXO6}(jX<>@H=>2 z_x(JN_s#YG@y_QnGiS~@`|Q0}?X|vZ?Fm*=kOHBD(c$3WKr+%2%5ZQfU^qA=el!%| zOgTyJ7dSZd9~R=`N;2Z&6iSYEW){|_aB$MWaS5oZDi#E9Zcp|3A23rQC_lIJcSewY zkcq4mg_ZR%TJ(7^B{DuSLjZaNGCnR7H9td^AyLRA4o0p~!&Ygzmu5e_;1Dq3a1-GZdt+oY zU%kSGi*vZvIJd_ZrM{@XmM-+Wy=@8MHlSFBhs()G=}6djRI(MDpircWLwrLbwqtg< z8jaf=z%Cy`@ZNC&%{**>0#||9G;HmQqBSS6sS_NU35!NDJlqs+6~}=)5ro9?QBTC{ zX6Z0T_?~7#%7jSvWJ0;_?j)XXh);Ar-8_VQ!Wo-n;TMv$pKxZ8f2M027}9wG#($n6 zP1n7~awQVE<|nIA{aP@Hw!Z7R1%xx-W$4f=ii=gZeW{Y@!!pxS%TgC#*)mfUa(h^XvwkImMty8Q*u2=8s)UMB!ITi4H~;MX z+vHn^0laqDV{S!%}^-znkoJOb33*1K*-OWuE)W+dzg%=cVZ7-hw& zpnKi(P_1eo87hV+?7-j`EGQZ$8%>&XKxh*5WxKrb@t8i}g}uUdxN@oy9S@UbiWm|a zJSGlmIg~^io)8HU7Y7llTPi9%jOmqTlBpU?8Ox!$5st^k`#P=dQDDWV3OqRKQ@8C8 z?o#AU2{_k3-`bdR!3opHzFh5opff2C7x5WEG(Wvm3x*0u}g$azlak7AlQ{5#37CiugP#KwX%e38hyI_X#|4D}fTcD^%zQ z94}@B^o2co3SvSlmp$Gra-Dq`wf9OW9GvzkMiHRijNJx+CXx~sz-1U#m;2;Lhgy-1I10m95EE1e3*vL zVMIWJ)%mSr5tEm2AP8g8#hy)8Sl_cYPR;jDs=zd4o$PhxI+TjN$^Hel;SHob2O-TCU!ac)16_1}?R9|o$ zuW#**wtNv`OX8mLVz+bLUonm$Cu&8hMj1j0#XNbe%k!9>lO6L}>|1V%gUq-m0DOfRv9fCh9+VFJ}wwPw?{U{-ssxz4LrcFt<lavzNN+GuU94JjVI8vT3B=N6x2KxWR|t zhp0KPS>)XHBI(TGI{zx|^5gm8_38O(xwU3ep?Kj0d<6XPn~OJ*)~qKFU1cdAK7Oc4 zGD((A`iM{!_lRkdlb5=d&YkT$v&k!I*(cnbg3iVpJ`t2boq21RfgW#}A2i@7U`0MC zLGvRsBBl(7q+uyye{8n6h#?~2_|5^Q7NeneR9P8$Qt)N=OALnt$0sxO0dL%$M@_u- z%zN8+nlICRu&3v(&5f3!Ld9~7>(6x-{*s$aV9c^lXNF7O@lyE&1!S4t|``ZUb- zEj?ai#bb$MSz|j^y5rV5hfRqF-c{ervI|$XwCAS_MEI{YZ$3HdUDTf(?{2x-w%Xv> z)z%EzEkl)yhOdTqN2cbFod*iD-?+q6}e;C~Bg zh=Y%FnE_RoOx-x3`gIni-UwK^5$!Te9k0?4DPp?@ZQFh+FJzbrn2D)bZ=XMFvJv6% zE1u77DKS~7xn8ZGb+Yr}WjC zwSJJtsIQ@*YpQS4xaM25SU+=oVKC=gWanmQSG(x&Y4h`X|5}6vsk!a>9KV~uuag{s z6oHA|f!Y}d*4_Dl%crLTi*=4p$2kgi2^i0#QS5GLIv7 zN{S3_4}xyVCs6TFz2>DCo-7pm`;DuRLvuq&s6oD2_?A1c@sZdR_7}bHfR^76_`Z8Z0q?sue|;lH2g0EOza9c__Y8!8-HigyK>XJ+5vlxcne&!4nV)pXXBm*Y3KvtcnZ zv3qUG;%;*{2RJxEcYff|#?;w}!rjK&)`{O;i0bzp{J`I)kJqYltQezH7^@VW1p$ci;9vywUAmmqL&1B`rtVq3wKw!-E&N=m=;O zZ{Y6vh(dz$B7kI+jPa0gMB(87`v)5`8s{&H`ycW~G#a>rCMg1hd+#$u--sf@?iAyVPU74%h`T2P!@&IiISdNh{tKH2Z2#~SI0PA7iovKyT-9Rt5d;{E3dQav zIX8+YC(ZZHj~I9~VvZ?(WD@^GX(;m2(vpAieDVaW^=OS*2QQ53LNOHIx-04MDkD7U zA3B3p7__2O@Rp1=3qBbvwYeM+&7j1wX7k6Yb6U0E4eH%m-cY3NuZShRj^hu| z*&(n%y@pd11W-L5(8=(wCy?Uo4TnI13 z3_AY9|5%X`4^rB7CUGw-eryxkqu``yY**_iw3G7MON(Px8^uU0Eicm=%nJ_qutolZ z)Dg+GGPW8%`@SP$xHn|a-<2Ume6Zfon%_o$kG|YVstFu?O@{w5QT=#`Xz8ss`Y9|$R{{EgB36-c)LwxZ$^7af{_&;@|+e&6w`otdr1U4)URA5l9 z%}@(c{0GVG5=F3uM=t5bMgkYY1)SIpZe~fMd)Tx&{!^P)gcDH-rHrrW+#BX)S?@U5 za1$c_VNkB{UiOrbx;4mPtG`fJ#{VaGer)6aLZ^D`)b4o6)Ldf`V;AHfl zv=fsd13p9oigKq@lmWu{y4?2*k1)c(JT_D`0N=1w_yOnHlXCQX^#NL;+e)PLt6mpo zGDsUjcsw2W586uc=FL+>6mTVBz*vkJp4b*A6eSJkA1H}N3*4=c%1;Y$%OCSXCWG=3 z>DE73@7BJdAKU#=8A9NfkHk^$9W!v@7ryi($lyHa#ROnznym}(*IYmscw;0wcSP*F z9zWgeE0vjUfQpKDc=Og;-Zye+7~>C2inokLClGrSu=7TCG;L^51NKkKdl$GjqA2)i zfQSi#_HSte=?0_3($QFm@0|b?4awh;Gx00RC!PRbeRrc^G*@x8`$hvirRzNcz|FBw zVnOm$gHgET$i+nWJ)43Vd3yFR1CsXk0c%8D3ZE0rrmFAlHMYl>UgKyEDXb(mU+d@- z+|3te>>Hv{U!~D)K&cXufznU&?zdo~!^oV2rKY{=PYs%_qy0hZQAUSr>DlW2KM#iA zI>?A5p;d=n8qMhUBQvW%-%z<-g?xFHsfyH)$#B1jqR~i+A|j{qizH_o1_*U270*f@ z44*m3?Be5Yav>puE6oGO?iiIFJ1TX*o%2ADdBB}*8YNZ|FDibp%cnzqFN<*0pwj*z z3sRFoj5}kHhB;0z1kSq9E#w?{9$fzW9wn zDP_liWN!*vejl1zn>0q$SGe@guFc;uy54WqJSShT*@(PXRlB5{|B>W!DNWdy^)t4 zl!i$VESs^I%@_6%iW2(%AI#~ndTUyY7%bcSyqtZpy)2r;Jfc$Q+46=M6or&q#*2f7 zhGy^+WxpMW{$4h`dGj8ykwQe3)>GwNb4bJpP!xFt8(M$5!PZZq_l{O{8iO|glQo>& zJWVxsAoBA^!vLZ?+BmZU>Thv7XpeILV)NyVPSjU0gUm!uf}!~Asm>`~%4UC*Ay#Vk zVHHE_uJ6~K`;7-2bQJ#=2D_$tw7x&U#6p2@|FC3lic+Ld1h^z`Qr@{e^~By(_fjFM z1K|S_QK5?bmLafKZYlfPcNcXr}I-d}t5 z;@|HWM=c=$(gb3oq4|ynk#=y!x|fD;TBj&+Y8G>a9{gTil5vvBK<1tOs|@#t7}6H- z2%x9TeK+^dmp2r-Pc(qeZ#)f?-}<2tcwniaKj(hKk7Ek0J=SskC{B+Hd0)=d@DDnQ zh=v2{g5yb&y|p#2cn6)P5*(I1i-ohSfNG- zZ+Wy-iX(`0sLt1C_fP)45d4H_TXzh7j_cS#nHyJ%Lp|QvVi39M*Kh5(sT!Z<9F!Z~ zpVfVlBYLV=Uzy@}!n9n%%hRq%*ORTQ1z2?cVPpJd3R#k8Oz zssC;=hxGx$5cA@OMBZt!pVL4fhx_W747>f{po!kg4^;0~%TbPVwr=aYBnjhW#+xU3 zSCMzUGMf56)=+4nT25uvRoeOljTWis05MN=6)X3D_lTjf_&}sp-c01XHv~A&xHHu@ z)N^EhatEuuRt9~}{14y10Ms=FLpDD4a?gswO!2xuv|lQniN+j9+jeF!tE^NoZ!*3}+tf9kKO=R-7fPC$rJ9XSD$C^YwZQYZm} z3RcbXu5&zCMBS4~6ZCjZxW*)W2tffeeP%a(*?V+4AOGzghF0isf9_h`miaC8y17sEjVC!5?-`2Mfh ziFOc_B7+r@nuscg!bm_wmznR^#&T6N#9(E{L8v)?E%QTydMEhE&{%ZNjl9(^hh}eH z<7Cx*)o1AD;8Z;v$omLtFEP=(@SfyPS;hGXNb&2#=Jr0VOJwlDI*k5w&P#EyibT*^ zv-+k|ty!l<|K@BNmf>Q{A!4n`Sm(6vs?%Q1`S2G8=Y|lgUcKs%K82Jso$-`C(K^ z1)NxCWRt_Uh_+Gdk;jwGkz?~~*?bXk-iX?st1 z``L@ena$6KDi{ioC8eDwLG};J!CQd5)I8JJ3!#^dIy(#Fb5?$d3T{kGJMdtQM?Ytj z`4k<#nuXEhsTO*^Dg)xwBosam=gCoAfFHNcf(3$D6Wl&4$W+cY|5)i(DR-V?pDHuX z-JWmKaowF|M#UzJ)va@q$$b7UTj?u;@~0Or7S5*P-DyG%J|m^Mw^xU?-nVVo+G~8&{ZDg?*Z>3;F zk_ylnFd0xXYWOmvh6j2!eOAd`>R*m$di8BKa+lS7AZ0*aZ@q>6q{4EHr+BNlsX8y| zt&Sff0gEnEx{t7w?{xjxwu|x?LothqUE#WX2WqDoX++T4i)xXXn!PA8A+O#9#^!Qn zP}*o3u7Th2JCpuoF86oOc&x^)r)+1fY8*$x`@Nk6ug;cVB()fRnE9;y+4*VRV&GQ4 zi>1hFe@(vy7ZIOj*cNwv>2Ye&$~O!cO+c}3U6w^vEAIey$Np@He!4ATK9g3xT=S)E z!1wlcBA7;DY=*euuQe} zl^_3~Mhuw@aF}pN0~!a{22wn80?0%u157BtxZlrW1OY zYi4QqoK~d0;bx*o1><*0gXvDUrx?A{q2P#bLf>J!x4R_!yAyuVf^5s78R`Eu7;p$>G(eF0&WrQyA)Btw zn&*(8xp6CH9TcUX(6LRvUnpo|2;{P99ff zQelCM(Ggtp71M^Z=ZnS7;zDX%U=Arva!a~0-=qCqcAt8$w)N7?fQKOZRl#!Zjd0S_ z6gi(uy>*5O51+#pn;CB90W{CEIA}m%$UJM!!NFU?FqF2ygH}XRT|_uU)T6i)>@-_A zIok}e$P!RMr0}@>eENRo%w}Tmi-^Z`ZZ#IE5TE6O;<$dDSwucNg``Jl?`ft7HGdFJ z*5A}yt&VBXC4OY)K@cq3wO+0cjp|Ka@T_S3b;V1>Z~a!z-6G5UT3)0Wd+Lp6TX;=R zy-Pa%CW8w#wPpGIYu_)*)qmNgC&ZS@Emg%z;cb-n9NB1 zA|l>qraDM4f}7V$@iVvE9FgM&Cn!W{@`iH4=ftx-NN_eM#`|*4(<4hqaY!`AV95An zcdQMP0b9~$=89Z(MYv!RRQLHVUD9~vmR=*7%h1i_GVYIn%107<)AKPd~Y?W!t_r( z0Xj(lEU{P!pmAzv@u`p5ddDZxd@)|s@oKE`!ZE~96%0VH?2jep`Se)KR z`*NEHzo<|20)>Qb+RazvKiVA>?oHUAEMdTUX7(D_r`{0lhz6vsH2YlUxX$$o!ZZTp z7&VwU=JTV!wpK?fi& z%j`zM{V^pqy$Lt3rB@!?L&e2g+Zd5#LJXw*t_~o>sVxtAt6x$9qWZL|%YMg}YO4bc z{!Z=gJF*D|Uj1Y2MpsV7O%}?BnkP=9`Z{fCU=}}42YisyOtJmmru^@t2M{Fiyth-n;8a8Ux{F_h<-12Lx=%{=gP7}! zR!L>B*fj-`&xS*xnT~~~Cot4$msmch^(n%4DdUvFKgWxxr!l@2ogG8m+aVGpyzXCS z%#2uxg)D1l$1boYE_^}e8U}L`YyF450>XE$M09eA(QE~*A*}=`zF-2|mnLXF;DnTf z_p;boV~rS#_*vD@A)a>s5W6m#l1R@4dnd4@k-sWIxP<5I8Y~-WTf@;hS^c13l_7?R zr7yV}nwI)^&CTh2ePM3VRp zRVG|MupIq_Um}FOKYDy}VJm);y;fG}G?eyY&g-b$Eate*dy49*+D|!Q+{*!O+i52G zWPNjk*cA)X1Iy8_T!a}Zfx##+Os&$F6%kGDKisxuz-=2I8k89@-yC>plkKva9ges+ ztD)U5MLjrJFRuez$?(+ka<$=#S@?MrhAkXj94S~FlO`Fo_e8ZeBWaLZH4=$5vPpJb zLF{r^bhc_@;gO@@X-4?B6bHbu`?y!M3&C@QB!%EJO0!V!SJ360c!^(ri>5Wrd*<50 zA!A<&9?1Ie>FYpF8=?mYdJIUPbm)wK5P3+BXuw+Z;NdZYe$&GvqC(Z2z;z!ocK0_B z+lcH~17ALdV^*t;x;^RBJouQBX5Hi`C0_{*yq~&NHVdrm9@%)ctWQltvEWzYDFk!C zw_IAMi9^(dZ6DL~JeY(su&`B2#5TNuctAdwCyl7Yn`~SXGJx0bv&6J`gThyH`0@7j z=5ru6iq)b`h6av$7H1uMSs?uS6Uu~Eh~7m$#HG#~G@hKv zj)B*A|D?CYJnxb;2b(XsGae_3^ z)J1h;GnXCfA`*vf{U*v#U{^>-?Yh^=HhxpYdK$UiLikptPR3$PQpHNswmYV=UV#u5)*V`HU&(IJQ(9fjsw|=+RHP*AW-6XGjdTwz5%W6Pv za%vmd{VDQ_wTqn#0d#_x@3tSk+YPBoThLjmZ{FnU7YtBW1Q9cxR?E*mCTD1AOCDp) zR?6gP3*L12#>_95gr%{jc65VHE-Z29OHNg!n*)VXm?YaD`zEFe#122|nl_TQ*nD(b zTKC$upiU+KNkJQ7k|U@-J~J0 z-ffP&b6v@;(_!Bmxj#WioL)dXzHJO;gkQ@%^-I6fIk{<;a=oqAslKh3uO^uz*|%ls ziq}Z9SFB-~&fj!nWgCgUAu%onbE{WaCG;z3w-wuh^P zp{w68WRqQX{H`7{St%{eR26KG^&>U=+M!rszt>lE#Xc%8<-R!@fn|%+->x(c{Ep>U zqo91X7 z39QFhwy|MV02ZP{Cb-ha#_lRBk5VL#z}M>pYk5K~MLU3-am>JI{w zNd=iCU#yvQC$QQL-c&+Q$Jc7SnxE}?tK5V?wUgNsoZ!sz5qbgq|2)@W*>K02DGp0cQ;r7#`oKm3zb3wQ7xhC1A4GuR$x_DCS^as%hSEMj$?| z#5D+NE(kyD!RiuO1T%{l)-o(6%$yun^pkUj0&V9*(Fybkc z4of5At!YJ{dAqPbUUaREz9NFxiausPe(aYji3rMkS&0a`^N?V|r~X?;#E(IFBjG4& zUcptOZM#BV+4|RkC$ebC^YyE!-SNyigX}G70=9O?s5aXi%M)-#AAPPCFC8~?s&r2Q zZ#Mr`Q?fVz)~8lio84wb0#+?>VvQoC?fAm3<%1JUXrh^yP3Z5?66&%3J&0T`hQEpx z#Dq0=woqcnx;Z-3G%;Gaxz}qPd5X5(%U5Q2v#z|jbO3G7^C(Qv_mvF9Bqigm_IV!E zKfGAc*wY=8o9z%|rRx<7DK$%aR++4JwOcU0d2E91Q7cPd;5nGP);E+1YYc3jK5MIq z9yznAP5_ic`S8y7%(pvK9_qHf~}w5VCqW^<=j;Dty-lP?9M-_b+Y>zADAFOYB8v1pS#xRi5?;)>f&$H>E~4 zhL4#q59~i*gDvL*aVz#zZWo5OJ9JiSj9aD%KaRvPsKsg+BpE8)9>PSFFQ`s4($(Do zcXW6sSgOC?*6%qjnwu}GIMtn>3&ueA7 z7ME|BbSru7tuMb{jx2n*IQ}_JNSnMnW0%n=?C~;dwchY_Ae~0#v)o$!KAwKOkz%-W zQ7*>ym2(rB`Qo>Bej?QYfm=b3z0{hA#}P7?8I)D&1(0ifluWjOKd@_2Obi@|bUPVn zVBKUbK5});g;jvCVPHXbSKUH`dNcfIv4H%$cTe#lgFM+HH;}-+nXB>DO`IoIVQKJp z5x$VuY4UQ=-c*y6>+ZCv+WvJVD%i}ATWZ?Py{n=bt0G&7>na3Gyxi{=eu4q8ad>l{ zJq>&EZbbzcJ8jjqY6qS%np^yboM&7qbzB<_q>2fW0)vAm&93E!U#TYAs;q}}(?|&g z-zqVofH~>?PlO#9fo0~2kLM|7VKRVZI(u&{wl?}KU2GMDI5%bzf&_LF+%LP+=2rc% zy+ke-$;1z{IBOd}n7h;%g{8z@gQrrV=q(+7HJL*xo%OY^)nGgaxqv77I6vRlFa`+B z7n+9gUJlp=2z7QED;`BzjLc)}e)7pOYU^E1&D;Ho?$spyIR*@o-uZ2!K1?bR{(+`L zkC<=(n26s+nKSRH5cuIjG2|3dN)AA$VYh1@msArL{bOwBpR>aocI(?zwG)9njtxo5 zvunMlI^zQHdzo!PrvCeMyQt*8+kDmTwMZv`Rp;3mzm|c?pKeblLv%gNSJmC-nR^rb zHg&BB1Q0>K;oHRm?+r7#^{uF@)vmw;{I2eUk2zXu)W%LZrlEn1#nwyw-$T>hIthB{ z5rjem@9>ZCWS65OJp6SfZeLIfo`L6(Twf}L-iYOidRCaZy!mr;SO}&1+m|LymaC3W zwJYE6>0bpRSvkxUiHVn=bKO`C1jEezmb?m461Wa9U%q$rfWV(#smxYRaI*^s+g}zk@-BoLj;`4`1UY4 z&%)dH>I2XS_&Xg=t$0U}CYroFBGv3ftT_=uxeBS#(K$U+ZseRhnDHAunwXp$9+yoy zEspK%PxTuUzewdUa0xDy-dY@q zxUL0uG$cM71+08|XCh5GcP0t{3>z(;0(cB5;FOR)-yA=v>AoH#m+M`pT{4zp9Lx}R z#@txod9t5B)BX0R!;fnDFQzA=ZC)KXRFTBu!L|6L`6eTgTXX8j%!gL*?~I|R2+|Jc z1CG;$3H3lMqQ{f$+8}e^iBsu`pd6{wPQ*@3F5LY6UjamWGIRV@0j_uj&_E(`ZyG&v zhZ-Ud&$pG$6>;9?D-Y|Mr~1Vvtokc0$CNvSg?f_1&kg|-=4fQGC&;Ek*Fq^4mG)37*#|Dc{K@r?na{6f3y)UU0uwvzR{0&$u`t zYI&hha)rvjqPrhG-{#J2P%Zs3u71$>@xZ1y*?(!e>hxXfWx(!Ar&CZ<3n&73ktek2rN-A4aBTF$V>F>yFvg}S&ls- z#Sqk9om$tAdi5!Ne>Rm4t9gBwTe-?|HKSvbTFRF|zVN5oHWVl|bCbPB(ePBmUr*c_ z2$6~;i(?pLabUsf1FRTpgr7_rc=sm$q7~jJ=Q;ozsak$l;x2Z?hy3ztGbpJViUXPc z)QQ2tx=6d`)~gF?XQ_e9uy45OIPD+kc(V0Ej(&C6peaV)-A zh%Xva9cxc&bQ!liJlRwms>|q`nk!7pt9n-1frW{F7ub5No{H*Pv5~ zIw2)1Pj@u@7fOV9D3iJ|mYXh@#6ITY1Tyok_{lh=SmU@o`Hb36LcT_Asn1|3!SH>&a9lV0p-W*zPt zwS$Y5r^7W1q7yFlgJh6FkCqN5Jv+th{6qDrT8oNVM=Okl4kz;ru^NlvBWGoGE0Gh} zJB+oi_SL2ZtaR>cpCsXHM5m2BK@Ue+AYmaP;f5X-!$&*OLFod$FJ(xG2tT*o}JzFO8f=M)9;Y0>A5S#VdmI3oQ~ zt>b{@ahUjF-6Z+L-uD9UGUv=#7QG&q<9~T%dbt>>;%Yf&%YK$*Tm3w_Juyv}b^H)R za{vWT3;ue%>JN_?^!}!K14oun*B-hu5I1tAH@JXC>iaUm;x1#Q>ndqHvAprTr8R27 z-t|JzufbI<>l$$3uOe~;UjD_KU^vY`YXn5Y&;b{K9va9q(L%XrcZ5x4((N442U#Q! zleU8yS)zbhiZ#b7aQ*s!;wyhq%9IcUfRZ>m4TJT%RNEhzoB;T%MkM&%4~U-b_!oV7{dCS(=mboVg>b&6*XSaS*PQb7b(5JGQX9-;c!UP{Z{By>gpNtSM_w&!2+=i;qg?G3$3Wo*A10 zAePtei-j(~-6`|zZng0K%s?y>ULe#K*_ruOByb31SL9|$}iJ<%7)%8@hO+(d_jgbPW zaaqK4L7&3o>jBfQEjtZxxW~9a%lc%oi0@KE{~vq0D_f}(I3{pj(y_M zQw=ofxIeDw&^Hyy^@|29MDg*b-M)eM$=01Je@IAZ&fcHOW8i#-TaxL>Bx|0rc(%W+ zd>CEd99}kF{lT{$8T_0!W4xnAU-1N|-{S+ToxaodMTtfccc7Zb$RSA;rQ2$VY4nuz zmF3^8Dm12DS0Uc1+Mh4@SHeNRARxXVRYTlHNz%B3br2^%Ar$3pzFG-Ga;aOn4?L*UVBmW$Nx-DdbhyThmcN{$#dhnIXYX*H(VjPTmY&=> z97-av%SUv0RGYC?1%trS>B;;gSc;YO%S{HTtR{RIFT4&08b-Fq{6BM1WJ4*v9^gw4 z*W)v)M_CoyGSJG#Fd83d}lk4u_Q>iLe|SJ*nP&jGdKu#dJDlz^Kfzq^Y#bGkR7 z0|Xpw01ghUDYD(7;%$Kmy&vrw$&S{X2PGeK@Lwr~YrA~IqTsDLO+LloJfmH6*=1EN zH||GNuCwefh56mgPMJ}c9P-Mf-X2dFx)h(H zi~ePwWJ?T!zy;cK0(FfePg2em&3&J6S*j|k9#<2%y`5WrGSm@)Jgs6{{OoNK3MfU= zZ~f?$B_-=C$meE9%3sLlfX# zsz1CXu!IHOW%ozB2#W$MfTD{#hgy)!x-`XWx6U`gy!epVx82T|)N@_dxa(;RkOD~D z|0-n!3eUOp`5QWz!@|`ZFS(^iI=Uc+dXzi>B{OUDc3QbaCj=d$c<~BMpseyanaK>0 z@aYy@uDaOIwHjxl;IwE~cOCQoC5h!v*7{P-v20BG>DLc$E~k42DG~MD95#L#SqvR0 zRMhxey+b4LT$LHpOA+*V3D%#I0D^h^ak3igX^Ok@45hhI_d9f)$a$&nKe7vLci9E8 zjKxEn3e#^qtZ%);Y@aUZl6{#MHfcIirQ|{cdCmcexOhc#KQde>cc2+}2f-;=c9wZC z19gxGb_sfX2V{UQ-B}gg#hTdyS%xHvZQFrR$Hi@LirQ_~!EF*`Z+kgG(Kcfz9}g7C z(rJ?dqy*}7j*8ZOeY|?-Y_#e5%}bE^8^`8OXUT_%C;3xin>|Xx^K9E$2Qy&Lm+2-v zg~d;rLyRqpiSTBSybn1GQF*7^$PUj^o$Ac5wizjCkv3C9U`ScO>US4UqKWLX$}CA&N~^PXFx zf;p3H8c+qgmuO|%UOxelSGlyK5Wx#~H&|vckf$1lcWykKpp)lzqSow9NuO?ASb#81 z%wsB^>?UN31^|hIizD6Zj%qiunPj`M{G22bZjEBy@vICOu*OLO)P+as7a2TBYrs2h zM&oygBm!|)S}i?#0Q-L1TP$3cs&4-UBsGWlaz?hxf^qA&J{>ynGEP3R~dN# zQ6S}E4sVU!aCTW3cgKaB?2+x5e1FF+fV#N&jOU`{lI@LC7aAs1h5PP? zFrs}lu|Od|ezho-KIw+%s2#*NJpb_c=lBCH4aU3NJtiqPm5ClGLeRd&OCcuK`?sJT zAmsh0pMge$&I$2Fv00&#YD*H}{VR<#orL@<<-)sQ=%bPR#ysX!g-L?j$4h$M@FfdL z8;ypiUd>ildbBCi6ne+ukGhYVQM&7R#`v$}ll@2dET_$QSXXYmq2$(ciT$3L% z3>w;0n#1%tTFV@k={OWcp$O+W62T9Zb6%R}=@;dz$=AF14Ra6`7(@oPVud{*eQEJ? zW)FNjzfUS_P;xk5efqw+sL*cvGA=hT@<8rKet3r-zuUo#U@1$AE)lfnR(_)npFwlb znypx)Bw_>S#Wb6RqWaD(U5dw!1)KSR;83ROY@o#OJd<9%bM#E|0@YN7d4kX7iR?~& zLfx)*kS&;Fx@Gb3bit2jFO)ml6ZyeWVtW70q+Is4XT~i-#A80~G(RJMb9|7t&(T+B z*zu5VX85G1JilC|!O-Q&+huuZ%N4d zSTPvi?`l7Hd#(mh>^VlMaEb37ZM2f11RvOQWM#ytl^&V*Nqzc~isIv3%Ouj-WBIWKo#EKe(2kz3YUP1y38Tyc{KJAUu8iJsZ$SC#W44#9WnH~$dpG_s)C zq;VOx{yK7BH^s|Vy*rLEcV8}+yVMwx8VD>QW{n%}8;kKtu;G;OtcJN!3IQ~4EjBo?~u=m`7 zmWY!#h^VVyT~Cuh*ZR2`GTFWHCEHcnpXGezop~R>>>wCSGj*$JT5y}pb+KxRM>sz; zw|-Jg_6L{mep2WG1-sG#q5)V5M>ic7M#mB7Fl%p+J{L{Y9fN=!z!IlCk9 z+cu*RH-qR+j#P7uFE-F zGoUE{eUIqxQq{-Mz{+|p%%oWLgUm>Qzw=F*jDcFlT|eLtTCYz7wLV&!$Fu_Y{OV^N z?YBNMhil#paba(}9{njQzll2>3e>VXgCVsW{^bV}b7aa)=KDtnh4y4vPzRVW>!;2z z7p8FUlfNAo>V+ug0dy#UwZ;ILD+ciA1L-#rqa_+Vh4re>|J$w$iYj22Xm*=uz=?_b zEE@YtZyIY=8e&9@1oZrn@Z~Lhfa!X%9`0V|i(|{-Dl0;Z=@o`|i;P*oXDA*tO?yuA5@st55ZILhAo@zd+Po4L4BsPftrp2{jqCa3HkqEY!;`#x>cX zTTgXrws{(}sr3WU(zth_1ig(O7$$3liawpwEu|(hdCED_vv!y<-#>0{o)>?fuj^0T z&n&z!3*Vlv(sA9HXHFIr1eS2+Vr#9tL@Z}r{)bT>1kgPsEx04;@TbgQ=kIc4@(OZH z+XZM;bUzdVbi}p_k_<#J2DD^wS zyi8mEud?y`K6?VdPVr*cQYHLPvp*#pB>&Aig9N|Qwzbk`AtxKWB)QsnSRPcjnq;Y${+MEae}By%C>oM&xZD-2V1Jj}A$*%Z^^q#2 zEtW;?Ie(=UHJ?)oxx#Tpb;PyrxtZD}$A z`xEwy-wCg$SMNqSur`{hH=cJCtR~Ze#O+qT><{(TvHLBu4+U-p3CuCB_QpAkO4n(5 z0i}#+NfjnoByz;1w>OvRKrH|yHLc^6O>tLOte0arOlUBQ9!3TUrKQ* z|9|X#XIN9))~h)9=SqaxBfgib_C zfB*pki6oRe+2`!Dzi%u1dG4=!f1H0yoKM!8Wz5mu@s74^is~2=H5#o7K6;X@4N}Ef zsnOHFp5^cCa+#nUbi#$I(lVphn5SIE&}>bs^&Q%#fz$Y%YkTG%>aOZ6hh~(i|6aF| z337mbph_boQ=&{zKJ$w1+5-zDU6G=RV`h){nz(bZz?P;R4K(x7XeQHZZ?ZjLyKYVe zg>Cj!L=fFNy&9I?=qzYg2I{R{>15{GS%S3lG~4%yg1bzvGIyu49_&K}OPlPG1Z}og z7mBQJJjwb6DhRHkd%!UTQuii8`-gFux7Bljxh@$O1(=C(E~q|u%}u9PalESc*}a86 zLH+V{Zmoz#qyc{;KU-hqH2Us94?mp2Oa2r+Ph5t-3>Q(5jCps*`e$kLDvx{LuSVaT zp|vSRZ&o7?BK1Od8Im&;La?LsL%65VxcBOVS{6N?mhTG z_uANv`7Mb0Nm^z{K^~{{m;Ri9z*3s!Z10bbD_)%fpxp}V)(?=TxNgPGY14>3D{>d@ z_i}!i%M3&HL&NiJQKoZ)y|l@B(?2`#_X}+v^#`>xhuTk8SQdO`cwOBY$IF`l|G+Lm z?C-3agZm!BuXk#b$Y`SCEdc-aVb;~+eXmKnuL+EZ)vs}Jepgoa8LjDI_M3D7iOQzH zAO&5Q_sN|ML!#)wiSTW&9jjGum*KQ;H}T&4$^3WFdsVCTVLl{dUC1oIDTC+{&-fL~ zDG%AU>Tj?Ne{s8^Da+!4pgF-@O;P-&Adb?*{dboV+4OhSrbdsPf4yqL1~ zeCpEVY66I-+&hNoHn*4E7M$uX$xG=7Z&KXsOm8I2+p{vi_KVmexa{wYX&gAy#>K1I z>4*deJ3Ev<16Aj9X2zx&}C|;J7QgH@%k}VgJ@92i)MkIFr0n{ z4|VMf8%g{e;D+$!M~OK^`|s~5F|Bz*zVDEV^<{G8^u`ja7F~&BYJgP^z1QV@QjA3- zFD4AD3>9>K_&KkKXp7INO7ZikcH(>b^y&FEq4x;fJhyI2{RiF3EE^`ul8?3+-JNAr zC5RoLG^xGsg{U(jnEkDE>hRt)1Fj3G2i=#t&by%-MqdS?{k$Fx1{u-$2>zogakQJloU*D7%_|T$J9ITCK^(GZ%aIE~2NacIY z5MCHiNB<&m|8pJyf4v~~UaLh_-3goYc91^J>zlE{HNLnHoSU?il!;3J%*qEM^bJK> zt%I}PaUmT>*CY1Ow@QX@bq4liBM$&XtKVBDkbEKWHCtb)O?!giY<6##bcNm1Y~h9m zCo_n|*8xMc&vkpa;~5?o&7arYMxeXX1R({6p{X~-PQ{Mix$45+XKXg`vZuQx2c{XUXlv1f=-tzbezu~nShU?n1?d4tlYU~i8M8cK)N>NAr}`iDn)zZvdAvOt3uYj6g+U>rHRR;(CTClI!L(TS*Xb9jW3sk z_JJxry*$n!DDoC7ke&CEMx-Nt)o837Cl}d&z*N^u`r)KI<+nTc(Vv+Wv-e|sgHx35 zmJ2i!>WEXD3=hmR18P<0LvjZLJx=%7feWqUO`QD+OdYc?$^I*Wp$KW4Ob7yH_!IjW z@_hta{Q0~Hk3mJ`E}^$Q(_&83a5ZdWc*K70=LWU&;yRT}HJ;SAgqYX6fuR`kSTh)J zE*sGV%IN2$GW=Sr#dzxHZAu~b6z-L^<+W5&1s5MWA|m*Ptcz@-ZZF_kmtSXfRw`+f ztQorsz7J(0+`s$S6JW!pKCMc|rdodnxiH_V1FJ=sw+O>MlMDR1U!{7=J=ck5k_JLu1x>nvuL(_0qJE?(b7ACjADpB zVanJYWQKqD)9=IDA>`acE92h+@S4c0-`4M>jU!lhHq)8TDF-JGV9Kj-c4x>}`Yf-C z6(RtnfMUMW`d29?Zncx%+D|e$>1Ssr zdYeHg7#S0b)UL*GV~^c>FBiC1gkOtr6Apei;9Fv_SJWV|z4z%+YBLez-gaWBxA$$9 zNF?dcF&HbJaX>EGEy68N;!Y$n`|9yyNRR8az0WV&l=9t%DM_Rz7_JL(1_W(TBZPyo z1A7#Vqf?|7%N2VBI$Mx5A35J6bQAJfaK{tA#B>iY360rc_`#zVUnJ~J+$~6pLYMl{ z{)SRW&iM~}UwKXFf-{tmvW)GJXb4^qeXpPWF_ueTY8_kB7_JEs{l+sAWX3x#S41}K z)G|GrX`gU9ry(jvE(9cl$x`v(8p=cIaLz2U&l&@CP}_{c<37|Td5!cPm2bC(M-cs7 zR!>Ev4LYY}DyzSA=-78ZN&=iO4y4D2uHLIegyobs;v<9;^aP(@PLrIZes2zG8&aIS zLR6OoNjc4RiJD`7-_U!T;Zaj{JJPoj?dpsUXpGW#vA9{H6{s-fO(ukn6Rntl zN{4!SHvqE*Atj6SEz>l>a7bY$xfdKZekjbfb4VB#bUjKbd>iAcoYJJV&);8eg_w4{ zne&9+3)I9Vo)PPdj71L4Mh3LZ5YvN<4QqC5)8$c3gnRV~L3-uB%g4r>XBD$)gURI= zc<5JBb{AY-$`;<%Y`*bcs3698GxQb@rzi)f+_$zaJH6$ahLMb&wEoOwvu^jQx`z{N z9YyGsJQ}{8fyoxuZ;;3Zh5p9}e(x-Rc4Tlbo)h+9m((feF=wA{^AbnZc z*z{ToRsJ%d+Bc11=?Q1`q-)qvk+IM{)>7a1v7h%clw(Ur#uFOLe&X%vPX$$!ou>b2 z-N~LEj4Km8i?4{#D3NC0>h|DGj;uw0>R)hupMDJc>_vIh(Bv(_eH-(lI3vU0I|Fa; z6+VWv6+U7M@Lg|`EYi7^F>9LsnC;c{V?G9%n!LHLBvzZo5p}Q+;oXR$k-I`|GonTz z>@dICqCrTf{cMHkefu&BOjf(&gqKkQyz=y$m1g)T!%xHNIt9K0|9oAo2TUk|HYwR^ z;_)F+EIz-Z?s|of1mK^%A>@qv`f$2N=fW31>OxSV=t$xVS2?kAFZX1YpU6lQM$mLO z_wAKwrq@?e9GD-FE6nNx1fwG9>NW8m*|yfG@{eB5_d7cn_feXwd? zX9yh-+m@tjKEK3((=GevHexx&v}(qyxs~5c5+)S%aNy9(TbSsRaHJ5n`Le*l^c2yG zM~iiImS_%ZbOkw~99OyxtJ+;=O~n!r?wxMVI@z6Fw$-xOuSHnJ`_*-C{(Q>?D6q z-)&191Gy}i(Vy-7{nI1;T5rcpWCXFRaA|hSzE4%nwzsX1C6P<*1hdASqFb`OSoB@t z^i$k@-`yk9kkPSn&0Si^&eR>XE@Rtb%I=xBEq;5Pj5eh>u6}eVQ!f|xZJd+HiF%C^ zz{J|}8`6sh!VtE(Nr-EaCxlr%d|)7d;JFz2oR)~28NnX8&5 z5c@$N_9%NJ)Q?xzapDp7SXq^eAAn6_r*9`Ca_r{M^(+T?5pdo6jBmb`M-Bu8>4iyM z9~Zh4B0U-hs;vCA(qlQi$pwfCkqpwJiuBTAg@Qlxt%+2+Mc(?5XLHb<`cKgCKe3}% zK_EJ3bNyq41&PnWtW}a3+x^Opntr0gc*nv@bHsKzP4J#Aq*T)>bH;`B-d15RO=7D% zJH2~)UxKNxIorGaHX{cJn;YCEB|`}Ex+_&0;TX3Q?+bz%3c%wp!Uj>WrVGO&2 zxTwj2--irlQb6TC|G8Sk_6Od#_(K`b*AxS^!Qw3utstyJ-{WiZRUE0fPB(L>ugt$j z&{=MS(?#|Cp7i`lR|l6>s>~Ldl~?RH;A|hqBX_>Ct~N^qfEr$<&H4IIg(;JAfztk; zj6Ei~$d-+Nc#+dz?|T+N17*!e5+4+eS_n_e$Ubt;Ocup28y>`Q#Zz~;0*Jq;i*avL zb9Xwqw__k)hUq;JDXaTXVKyAoLk>F#kCO+QQSs_J*R9%%sj~|uMwOb=KG2}r9pJpE zx@AnW!3DN3&q+2Y>_dzi0u~I__w+`)F2c0grdHZ&$G7+bS&Jj^`n$3I{)IIdd*%2sSlM9Fx85Q0Kh|sH09B&+c=c8u zwLR*_t>hbeftL&_X6isxrs%^$p7dvrm~ROxn3NI{1LhvmfS^UdWArw6sDWV47?#u1 zLcKA;FtHjyOmOZt%nZ0wBIvUf^3elv+@>+#`)M zBCMSl|($l=}a}Dr-=tXw=?bedS zcW{(1B!#R1Pi1# zS>CtLbFHrJ|7Lxu00#0EW$5w@2`J%y7!>ZwS9%MjTm4E@Mj}LX$XC>(tV=WqTiQ`> zPE1U{>^jPZD)Mk#MDKi+e@)LRQnp1o`%uC)1eDk}7!=zM^reO?%C8+d=%&7n-zGDf zUL(q;i~}%(FO#3?1WO+Vzx9<4Mj2FyNTk_Unp<2~H=l`L4r}~if_NoBed4u|HmE0_ zgqp$P;|k#P%~yQQOxe6mTf>)`E$nm>Ma|#w?ESEJ!44P<=QyU&SozvF`isVvM3G!Mys0p<6b}qO$R{8zT7#Ik+{b zLw#1#Mf|eNW(Xm3DYA_<_nQf3ea=J`h!kCh**m z?0W*-R!r(}3m0Q3BFIkXIrTRbWb%Ls4bh2$PE^E>C+Jdi*|R*}65>yi|Ef;{aQw;{ zx1gHD_8Iu4VTSq9GDO(3_S+b-EeX~{-FL1k1gl?aLqRyS31l;TydEYQ1&o9}9fJu3 z-TnB6J;m`Z`ab7fmXcIqdL+f=n>=a>B^Or7%;I!;onnI$PDji*^&&F2iyN}i$CUGH zNvbY2NBcD5C*)WgL~l$m+|KTgENHw&Oe(&o_>sxf<@%!da-OIl-@^(ca^@X zql8PpSl%v~89NBl?N=NHkv;*8P^z^NLeu++^UV*9_G3 z!b@=bhj#;=8zm~|*5GUM_xHS4#4wIe8Y6&>_1-?kgi|5Zgj@E&`GKEs5OP2+P$yNM z$4g}0aJxtgCKm|zDr{xh!69O-+{i>1@0tOE$*2!;+z;#5_qHS=Y@{-pPK)Xu*4DS@ zVJy~ma~IwMG{d!okrGF8k6dJl`0cG#FBFsQHGt~O@ZZ0<+Wir6X8fT-#FT#cbs6bTcYPf<>px;A(A~M- zrmi))H8nStc&&buR`389{2CumSoE`|_5yj&hw{uX$BRZvnd+EVb<7}l-6s-6hupl^ zoyw!84Va69CYeQ@qBi)o%G^YL8mpJd zym#j&iKeDa*c&&}3-zn7l(wOG?F*iVkCk{`O(m;`d!x!H6>@XR1@>XmuZ#7FV3lFp zbXsYUl|Y8T>|B4jOAzu*Q@Qd!$Rct$DufFOk5fxIw9fb{i6sdvPm3QZKS zm&tUc86}ol5)hQ#)!%i6J+-UdH9!$lMAvYSTp*u%PkCf4NI7^(BrLgk2z%QcMqFyS zZj?9$rqiQ#NKNmTf7r#KVITdP6YI9tf6YC)UP8oAO3 z{z{GBmuek51%I_V4#}J4KAf>3s%xSuYUZ?U{!nfcxXQ>2an`tDUs3?j9|og{H&t*{ zq+<0Yd3M{9v(PfJIo*7Rxi>dXP&u{8$n36GPnltppTH-Y%&TphP7o+n3^+WBQ=Jjg z)hWY8>1QdX5e9Y-3g#wXA{#{K?8#q(knT0R&>`Y2XxN^8)}-u#6yGV5xrF^j=Cdnm zi0l3vxnf;j)l64(6$mw}QFAt>RU^GQlSBlpM59-ysF%|&YT%8TV~cdD=I4lT?QMF~F_s$^(Ur1LB3N>MnjziBmM1_@!IF49R^A_X(y<7L@~~*y zSZE@@maD*EkpX;rdt>BnXnIJK^Z|!1QJMZOKH{ zlQ&K7W-4U7?PM_G;&pOlhcs;au^dCv*!20{*(6=wTb_m{I$6=cps>gD^hx-&U@K{| z#Oa~JC4a+>zgOphi1-VD@unPqMSqW`Pw~r?qP+PbuiSexzxE7%$ipyK>|meo<((Z` zaW^g#z{7TB2ZM}r&@Ue^$XToq6-JL&Dgg$jt2>(}X4o6A7H+UgOgA>wriq|x7btIe zIU`m3Q7RohgUd`dGNg|0_fbF3Hp`ZKq50clBz1zl#DP3-25*oqHulEzZl~AhOy}F^M7xa|kiDk799F9s3FMrLyzMyz zd+nS>0@`Dr3srr<#Sp6HYv|UqNOMKhQsiHe>zT7Q#m5-=RMbKYOT>a}ot<`C5(?&~ zmNF7Un(3z7YNavOCtW=YkR0lwv^EqkqvWAU(xp8^W`8I6IZUvp%T4~I(Bt5lc=E7m z%5P}Y{<)Qp$bLuyvk8pDTj`P3A6a%f12b@uTcy*G+@iidQm8w2Swfjw!~VPlbS+L2 z0vl^HzB}=u$NJKVgG=o{>bL2wNEH$|ulK5TE_CPIYsNoX3E=uOTmRRj&fQJ^3CdildgJOJn@e=pSDUP$53}o!f_gRV1n3>l}Hf)Bx_q zz6aE%P)X%Xr`2TVUgPRhyynEeaS5yBjOI@x)UK!Vr%1Wm>$hiMj9f-@W;yobxb5}A zv1Oyohf69)OxtGyr~-X0v1WZa%MuSvK?1rfXU$SIF4k&9^pL>M>Pc>n@%~|!uYcg8 z^MJBw(b+lve0`mcINr31w6foz6DR}Zj4H8%=hIgo8arF|I&9e~-(c{qn8|b6K1a0@ z^x9b$MQtPhHBpbXuE1Z*8|E2af2Is%`jgl4EH;?BO zpC;zh^%d~ZFV)^lW&bq^^C!M#>E0pDVFPz6_0eMl4y8`f z=|bM$IU4``7_h0{htO#z^f}~-Wh@4vAyp8Z-hQPcd2-{u+M?3AeEPyI~{^v`(xr)_|1c*R5FXFzC4ABU2NqQ7!!7?I`ZW6J z?aa|S+;U9Q6Wyc7e0?Ez7cj-jm;glY9a)ra2_-e{r+@giXL93*xF$(xc#u*x zbpfE*s~y9(Q%4`!NO$o413l@ie`j*}bG^^7P+|_JxKHDJ{OHfmNjt=Rl_T4Z9`dyT z3`vB&H2UiUe|fUy0GqqIA};t3XPO@jS%6%j{p$n&{`CK5Y1aL*YeMR89+P}pzhWI3 zs!Dk`>opGx=r6+7e)ZDp=u@ZKSy;}8TCk}`^U$5Vc;jvKsgnW$$8SW(;ivo0n&xV8|oH3#nh0 z`L9hnd$`~;E4BZy;ExU$d?h9F^uMpq-`uM#GXN9HmMX3HcY>1tL>=W=R)8$M@TJ~7 z_Seh*{=}9FPRNULWXIqCzDuj6!78@rv3zLbR<#yv4BzlOrXSS zv=ROF%YT20d;(7W`JQy{e-I2T81kj*tkbxenroW82SROs(iwPJqDt3k9 z@8|fheUtlgDC{?(#s47eqd?ft5ZLFAAAQyS|8{70iRlOOx)YyxwEV*{mSf=or|X4+ z(9@WII2Z4pA>`z1>)*UsV06(tdK?R-AlS3p?>K9y{$WG3z=r&+r1SWP)ougo<4n@K z?}|sS_8D0qe={RilLANIW>;8&a9JcjXE?h51MB>?`Ut|m z^UcKqi;?1~kG`#9n}B~(^^kMj?DL7uC);+L--#%cLBRV<$;DdpUw`C3#*;G3;}c}| zaKGz}l5SBk99lcMe0N!3>S?>-liv2XV3s#2bpUO(=3+-@nApN5-*QvSBL_tDY{dBn8|f>HEa~WgeeGw zo5E(Ocb4)pa`E!RyPAU+450*>RRkkqB^HhIKL*Si+Yu0hWMZRW^O9kkL)@g=*%V_2tbHez)YYOLRH`_+i+)!d|7-N%AXI^RD5+_DF z{4zJY=Uc*B&ha2DqXhJ%^~$Wofccl70=lPh-RuQUAnOGh5fGllA`pH%{bw^zqVhOK zIE%KD-RWfcCABJ`I_>y)wQWQ)x7Xk zMtkHjhNF(O)ETyAx#kKFYh|>|9^icN5^i=bqf=u=bT6IiyXhaTH;OOp1tvJ8c_346)@9CNlg)w;M=Z4yH1z25mj3%?r1pV>z#seitk(#&L zCD;0%NbhbH8~|Qf$!c1g%v;x=({sqs#boqe-;8<3yq_ zS}xFPc}qN3HI6b(6PX)1I>rBc8A{rxYs zJr`8QZyn5O_ewCfOMH=oDQm@X#Vw6i=V=a*$P&7=1wH$YA(ExSj*|AuSAw`0!O{`s z&|o%=#oJ>+_h}Ik{M|U3v{(4n|u)IJ0JCsTc-T7tD_lPJvG-+ ztT)A0$Jfb)!I{kK3-?dEtvV9$-V|0m*)zG5MPhCLVZSdB z{$oIoCN7*0NbjD59w9x80B$sx%QEHwkAhegy;wS+n6nw<7xTO7Rj82EIH8UZ@kOr8 zk+0jNOWw^U;Pi^t)C(+6UkJY}ezh9mwLL|!S>vyB)47bv>UyULz?PbHywaZQ3+)502VcLcLjWuMhQ+LI`5j zLgOQiJDfARL9!mVwxcMRqlJzg469d-eM;j17st94`=T{bbc1=XG@EBNdp%a!F-TJ{ zCTK-acyU|80RXC8s!nKt$$_eR&hB(iML6W=*I3Bp`?sJFZ~YQ#{8Sc+@Yl)=Uy5m1 zS!H!Erj^;hZPJUR@Kg;f8iHGSI^HJZbbu!j_T*n~a2<2DohXjUf5)oQG*Lb%^K!?H zFcAEJEZ{yPq!XF$yK~nh(%B8*t7^NfzLQvYRAcK(}Y3b0TX24rfTLR z#I!L}2*3SHxf5j5X>fxQHPENsfXqE}1`Rt906^@3cOH3~(WjXUmp2rA3v|0J9_wiV_3@8A5wzEm}q}NhzQH_5s^*1_fG};u1pwDNYO-BVRnwHm;Ir7c))4+40zHc zJls|q^2(o*KV+cixeo1Z>@gt4y52dY;!UnB(F`bGo2AIbKd)y>Qd+B zVwLnV(tKiURXXcRpIoy7w{kQtz5s{4J<|*oiPyNu9b5g}wtbHY`BzZze?L8GJayhJ^On-}N#l=&fOx2*1~A6(>D%&t zNM(g$uZK%$XpYd4PX3u68Gj_B+J<05qfFIEce)BZ}9wPFXd! zMuImUw^2hX?0LGBMn5Dnf!pxg>^+h7r)!h`S&oXor62(A!TH;Vdw9WhXz{6_>*$$Q zUD!0Uz^)Fbzm|A=^H*t2D*=qs)zr6R&0ZGPCKEt8Hdao|~*0 z7q^dae}d#sJV-x#XVfdhzv&*mn5`8$`PkRyVdm%@m6-MpodT(zGP7w1PSbrRZPBW< zsm~|r8}j!18TwDXbD8hpG%U*ZoJ^b3;X-hfTWJd6KKM_jjn|o0*iiNNtZu`v_5*Gf zI8V&-a1m>^lJQw98^wBTnq~Wdr5?F~f2HPOKfCRbprnSHEf>D!N-A*v-S}Kjeg+0j z)pM@=BF+6B%{-WIZ4J4wr)+R|Y`$qpagK7-ZP40`Wx~V99PwsrdCYjc8rm~veNMjqX_-&n;i9JLA5&#ugqyMdt0e zcfur)xc}N}DZHQ53p4lhjV%W>`i9%XZHQiq86Y zkcUt`4ZBXe=db9nT3JW@PUc}b9GNfj^CKWDLOwJCY+AR07Z`P%pTfO($v%5| zPiGDouBrFfn>r$oYA5~mrQDs9^cOVq4*K~qtzrHEyb1Lf(8SS4Nb&S~tXyM_q5l<+LQK%P*w87ndj z2s`s9gGZ0bHvLdI3>!Fg1CG$7p1r|5EnqJ1uz|LXYs~^quXRsF|H%cwEa|T9>KMeP z5~F&{K8+~t8~cM8nOXE{iVjZuTMlGAiw7X)Kr_2)XI&4Md|dP>O2}Fhbs%1tpB4S> zp%xJt2f*J?)Nn=z zr8o%&2;j1&M>g)K9+lZUqs(%Zi0pX#-826QTl^Uh`777(7-YC9S*cF_^_O3sK4pMv zO@G0;qtrR@+T=nHGrMeA|67y%?^xeYkT&?P736btl!o%vArv9>&V^qh$Nysj{@_i! z?U6^ZlN@H>1kSOEKlwh=sT&QVARW1#33sYNmqWIfBvUlzmgoMSpZgzQDQ9t*=U%}g zm;NCcstUgGuFr#`&I}+u`Uott0$duu3PdfppDv8Lp$(lyVGA^lJT{m-o>N z_WV59ybH|#kn?)w08&R$Q~OfVN8IvY_P5U7vB;eH(W2&zU-8;OPb%!7zbMqYE`2m= z@)5tT{14ywU5!O0nk`z`_Pk1xR8o$5och2!%`3p6-qsQ3!GQ2x=J6nNj-K`TnQGM&V+w|OzW4UykRURos0;4ec=CpeH z-}%J;b2?bqPVt#E@F0um+YXQ7QcaE482|Gl|64}R=p84MNUgvZtv-`~7n*-9a2Uc^%-Ii+&}_|7+1Ba= zi>^q6fp;oY#f~k$NA4!u)qp|kp3V(wJ(=iUANk}`#<4>axQ@Mf2Bw+36n#dJEz93m z>L|2Ir1HrXvp~)4SZ*l3)TsOluvqph6$KZ+^hy{U-R@Pvycb(&qjb-vKku0N z+2mMqKWWr@Z>056fTu5ppO}Uz!%5^h#^su257Og>kUgDbNdwBu589gvWV35WO4#|z zPh&2$bBkp{(d;_s+LNz2K9si40$n63R3v=Q53;`;CbV@Q^|@4>W?C7sJo@+hmtwwf zUIXt&2S;?ycP3oZOB7MQ*(f#1eUu=4+NQqg;47EGrgFYkT<;soW5DyKHhAx@`(ok@ zYab;Ageu|4i|LGk91&TvGa`|5(WM1>_Kfh?JkgP(Y)(qKPZ8ismA!E`uKQKci)dus zkrzc76_9X-%A19Nc7*(?_`eZ}zYhQ827m}prc?qYuLJ~r-+do;)J;qY1J}xr5y@`_ zpxJWNtD_d<*oiBL?I&N*%R^qu$-fdgQ~mc2CI5K=Wf4dj+j#vrU&N|j zXxSlF0$P7FUnTR3=0kDLquwod8DJD%v5tLNG;u5!Blb$!$^PZqp7vq=w?7qVX+Ut>~1G#Dp6WXVAAjqDncYYv3bX)K`;4=2_oN4w~9>`J2eOPui z8l*2W(-S(*vdT%ahf3=G#@#=0D2A`@OU0|al9S)x-C?uri0#p45_f)Z$Z2kEDpt|; zKB`2G234@9tg$91Kl7zpob+H1m$AExIc|-ZZcE)E_97HfIireBtrVj0_13)}16h`m zEc9U zO}_jo^>*Wh)l18~U-y2|IC5-f`+ZcNv%S%X5>NaNhax?uXdF{u`F>NEJka&LBBwO&oPi;Us{q;e= z**C^&TA_(kMfu5g@b`T5uO8N8&13RLnvm&&(|I0Px3rgTD48hWvwa7Q<*%v=b@8j! zh&0h8AzX*c;)8p`%-(&eLOLH}t-{VBPZWotn+VfVhnc;3TwpL8psaz5prcPS)yRHx zlOt!6a7bVJ6ks|RS(zqcPt$H*Swz1qIjadyjR3kwvlD__gLJ?Bpu?>ezM@AXHsanm z8~$UB>p18HX)T8E$-cnnnlkA&lIDldAbiD}I8-T~TOt&%x@^vIwp$iC-UDW4ExPGV zJPfVywc2TlFT=O0KUEPi2$FLh;Sl#E+};EPry4}Ml>2qc>Y@y%kR7o~b$>3ti&( z!pG=(r7$lloVE)axqJ1S5D$Cy2SWH=qw(9!+a9CV`yX`dE&9Gcl8Lajs&_BSU78Kk zkZY^&1Kgaf{1iSqLp^!}a^27N8-2&?5raDzt3=##f~kLqGrb$LsB0$h6u!(R5_}nC zd`k7tm>hKfRArQ`ifc^~-f~lZZYwW611e!GCu>w5pU!LG&%%|UizTnqq_|H4;@_<` z%txWs6r9@@Or?Z$jUQyDw{GSHWJ0-hguJwbq3V1_HH%L{IL$tSy7V{J(4F_d4x+UG zd6!g}r&6LW*nn|5xx%Gq|BESZigBo}#FQNYpa$Y@%N0KOC1kSY{aR6-Ta}99=wPGWXSyjIIFu3M$!dtL}!1hVkO7X2vl~8J8vb5oS0XWG@J~$LZ-f` zoI*sPxQPxR_HoS#c^5>sj9(e@&|IjT*-Kx-06r#(6Ro0fE)ga#W&D;`dv;a$F|UO& zq}20=<6}jpZ77>l9-9{zpThDaRF#x2*yQ1ib&oBjR$i(lTuz4l+!K$M*^5ICxzr=X z+(xj2t_dPGg*TMvf64Ea(yO$ zkO-Sn3VUP~@p)l4G+Y66u(o7&_DkT==W7mv*ovA0s<(_r!*xZw>0A|)22`^>YIV0-|$;9NZG-Z#q~&mZ|9|Gs!@N$cePxIoD* zR!OhZlde?j!&H|XHK z5E@!a<5#UD9?MNDa^sRZ!?MD(zkhyhkP{$M4}-Ub-0FFtE%DegH$0VI@HR!tv)Qbd z<YKjQT*0SD<#KkI)FGWSvl|ez#RGW z#L$C-v1;^bl>MftRd2m{|5QN1ps+16PkQ;2FZoosM&`_vhjshO0&4xiudlOnJ9&NmJNWL$&gE5lN1?3wOf`sn~%TT3T=uM*sfjK7l#csCEE;(CHc4 zb|xoqTs$fxjL#U_rf2FXsD$wJecw7H;~ocEut+k_kGGek?IpWb$kk(wyQ;$9_dQE3 zsl22Zei^AgI4fNgLy#VJ38mjLh{X-<{-}V8*$P{s?gtLueCYfNVXZ-b_?gJ6)pQTV zw>1a#GmJKgKf|{naQe#IzjN?k9fI(;WH$VSFMyUTPS5!&2)V;$b{@N2ck(nH6<|3{ z@pI%4Djaq~g{zwqM{+R3BVH9{V{r2QnP%b?M^pdF!Gjt}<|*y{MI*wvIEsI%jRg9J z8FxVuh%~O&H;n^`F%C~tLhhx{rPnl)I{wGj5H}`5y}8kH&owXVl*8j}<6XI!jq`pO zXsd&rA75;7YV5Xk+xJ~PiHmc!OABVsx0cABLch>#)>(Z!{_YJi7g*7bSWe%xFV-e3 zj6*Wq`?46&gzf&`Or4ch9zDGnmN%nC#Iwo^Bg*~CynrrxMI9B+9#HkeN6Urec2g29#J9JA7Ry>|=Xvyptd2clc(yI{} z(2s&cEWCI@M>{W6Z0EP=gTMCR$_X-jB>q%++N4Y6gjZeS`r^G3!tVJAzHHd|J`@(ajOTDe9YYFe{fO>PxR+hxs=NHSYxzBA zACkg-nXNG%`rx(1(w4HjvsTg2Y;N)W)?|t0KlaG@rydMGBD}du#gx`MJu*XFvGc8^vfEiBxj@0kKqK`M;uy8FDG#QW8cO@33_LS7NVAS*1X705H*UwrTl zUaU{Qx;JjQeR==H<7w^4+7fI2)IvpYqq>sUBC3mxC6l)~Qv-|1aJOek7J7xXFE7oQ zP4rC>uTh;WR%@+Ul4%9LW_R-0HC2fgcw<~K&jaQuVG{$T!2GzidcnF5#v$j^^gcyP zKbn{(e&@yOf#|nU<(bz-FU|?y!L2inR||xYZ~#&uRe{yXiI0{kg$9k^)OoW_wFzo# zKnbe(rx7b6LvabNcJC5SH`$Tb6Ol0+42o`}(Ee;MV3^vx8{mZv$YESDGgw%Acmpn^ zuy#qLmgw?YIAZYx?+9z(697iE$LHX!a-MmdZqmGB&VPOH^Kwg1-SKJAn%hr3Ac%@} zIvPjIAF_5qCc+oH6b!$-r_v=r#p_OfQTrl8P15B%-*`Yigm1OgFjShkHOf34i%En*_|c zsW#9X1OZAN-vfH)yJ|6-?Q`S~$z8|xzYc{Twv8AnIH(biA;3iTHK%gg2k$*M0PDba zqD1$1+8`hitmjvU3nkaiU+wFAf6q5U90QU`?7*>#nd?pf{6XE^z=pxtW@=9@{wSh9 zvmWRAd1S(gdy(fkYHinrpR_=`e=$~gKUy;LJGpQT=((gfqSqu@N@a7pI2~LjLE&j8 zt~BX;KQIxg6R&&a0!_A7qs%SWCb>;(CQQHDBdgt?+rL>Nd7|Ccdw9vOy^P#T{bG&9 zyA?>iQyy?T@h#N1b*U6voWpA1z3n5QTFUm0+zyTLMDrWf+%fSt&uM3}4pXf~9c15c z=-ip8_VwW{T`{))kz*_9woDqcO73$CpZ-lJ^UA2G>&U@Yj0lsxjVHs;iHLkg|DQ8T z_Mg|dwf_%$Ul|tVy0*QfLqbImloAw?QYmSWl2%ZV9O>?67!XlRx?||>?hujgZjc6t zVdxs-yJxSp-(&B0$^P^Gd4KHV@RtVz&pgll-1l{z*BK1%Tz*JIT%ML|*mO<99zh4W z+2$Q-y8jJl0gYh^sKTTC=gXv?;Lxb&zq(fF36$c-P7o9dvotPc3Yv)z$q@<)R$Wb8glAKsboKM4c_Y3%iIHO z+@6?L?}GJ-y*y7FCAr;h{+hTQcOisNlwc;j!;8&Civ-lRHD{n$xucOES5GH4Q5!X}wOVAT+C)>8 zlBM5NJy535YSwF7V4C#B5>aXw17=tXEfRn4biWmVMz?{7(2*eyi^L@(UH&N6b$WVy z1FWqb!x-W^g;6>at-E#L{uSEJl5KaDSo3JdL-XGY?-{9;z&O0Ikl%(K^(+$`MP|Js zIcdA9vG(hbGj+0BWgD+uCd({2K(Ey$y0~Sjf=Z6w2r!*?#V0cW2|?~?9l^Yw;xyt^ z>CSSK)63J4Y9qbe`bVQXEfi)^4L@P-JKgVH06}@nCNj;!IGZaByAX&VyYY5{QJ0wKnEQBKh?KXA7SoGD|BnV*=SxU#q;>j zV%Tl)mZJ(h^-B?-*;rS!<9Xe<+8s!J?em_wji6EA4do8tNGp$=@b8+y7E}u5B##Av z)V-CyuYqDSuhWOB0HV@khSyD2imlN((Hkq~EsD@m(5dRHPNm&CNQwnEUm;_rb{6uf0mdWyvPc8|*} z_<2y#5eHQ4eY{wBBy=W}G@RCX0t3m-gUh=cxQ!{X1Ez!Nc>_mBHt7Ket3l$kgOx-) zIFrC_rA9-m+`=|qiArkpO=v+X6WpXL&X81OCN+4<6(XJSiUGMwx}kJKOm%m*rhuoP zS2|qiscd3nB&GY`4=M33Ed85iW8OdC>|NS49?Z(1t*Op~ON~x^y21VYB!VDAylJP` zHL`%;`XO-*r>3w5fRPbC&WD@y+n~ONlWKtqp19hV{1|sXM^cXx`L1*jyxHAY-!fDZ z%1eZ?NPtaA=R|w%T2U*_M@}7No!QTg)%Rim&FanS{PcLSF)w1yVu~B{g zH?4LhpHCr}-qp^6ht=Rmxa}0hwLh{&QF%xd>#k<*G zYHk=P3~ik*%6G3;elJKTxci|ip`ndp&~m(Y8GI7Ug{8s9vQT2Q^+~EYf1v&VdH9jnqfvRIN4I-0n1sfv4PY+-7*N?>(uj>KySG~j z{d~vTkoNiO3=<{#(2%r^a?1O?hMKey?mM$oy0Q|X1+QCC4fJ6${s}y-!zCu&AC^oI z@a$(vaqcQzJ~z(HYDBk;h*#i4S?)C2Uoux}?i8$}H=vpoXKE~MiKBh*<4TO$*W-py z7NboN)rYkYcbFtCguTOR?J`P@OgQ3YDMvC_Uy0KqGB2PGpSY8$wT3TYqp` z?HjItxl@l23cBNHGG6Q)Ywj&nxNJEj$$-qfl)$O0=YRzha4@2xEm9jI5?*Tp-3 zOoP{seqii--MRUjEEb(uPytx(eBK$DqcH1h)+kd$3FV{=Lk37Sbrr-zq5gO^waN>XU8)PyT9}BDn890<^mGdd$KdpK>qL((VA5M^nw|jy>r$GrN0ZzZrq&%e@hA z;>|WoiJsWO-4nyvC^0e(@|+KY%5{K28NzER`dJks`(P+bZ7{bv5nsF9 zQzk|Xy42}_`aVK%U9-+3kC0~dm_#r;NoRaOb>#RQ)J--@NkhFawyvA?VSAq)MY8LZ zN>Os^%zyo(upr5jnWv0$E6*6#Zqtjlr5|KU>W8uBw}L}&mDi>Qsm`sd;Pdt< z?a7e?9eiDDR%76G6T7FCieYJP|rkG?YV5VrLYgJ{SR<(Q0w&Cl-I%gKo*=WFL)pTlC@8VmOVf|5wpw)d83Sjj za!L37Azs!pF1fGj`vl4tVs!^bV(R5X4>V4c87-UY0$Sf5fsm$7aQS{7oVu>YJ#o0( z{jG>P6>CcA(f%jYkBmM#C~{+2%jz~5j}L@DLf5(X2tL>+@0_s)Ubtbx(6L1ZqvzT6x(u!IM zR@=6PwWBnhrr*wb3Ei7uj1$!r#AN3gb*kn2dAArkfpHeW}RlvpI5*J-+Fr?KUtK2kNT`MeP2FaI64~Z zKJ0i`wDY}#$ph=m-n2{f@T*F*FxU#On?V8mYMUeeKmbkYP?=(Y7D6nwJUwgR{nWIj zC5{7a$L}a;KiJ93ef;RXCv0I1R$O>6-o9tGuY#iz1m7vVvrJ?xPp$r0;x$}=xOS+p z(NEPG(NmKCVoPUg7$UNrLR2Yhcljn?TW$t<8HK>#>z#iPFvNdiik`!{)&v+HjZFn* z6UhpNoR437=xlhqT6*mAuj!ha)m{D>bL2!|+W8v|#d6MFL_BFr4LiD@xDs%a-8WZy zW6k}KpVGnZ1YAVGc}VciI&rQBCKe;!bjQ--GQ51Hcu(xKZYN;=p|FD)eL$*s6Z%VJ zJAow(UubP=?EqA{{FLQpams~0NR^_;oYLe#{a{r}# zp!C;MTo(gTraOP*DE>v-Qu)V`e}+bh%JNXKzv|l|Y_j4C0kIi8APhRBVutRTA)9nX zkki+2rpj;WO4^t?n=nocFRV-Jaz&XeozO-1&I;3nt8)hYlGaL;pmr`A0S=sPrU@{8 z4pQhVWo_d1Urz?yx2M=$UopL);m@|Eob+efmV!;x%_2jWI@Q~ch=JKAC1#x1{N??@ zuED43Mz_a*@2$Ys`2GyE5g&QAnDJ^9x#abLG1XGim{Kp^7@^NDOwne^LvF)D=lcl zf4;t0CHn*1ws)_vuK;EM-ki%tPYoyeI+*NpsGQI<_mQ73>sWZ*F|Kmk zO4g}%YIo{E*fze!l{_prtS^&P_tmL&lPfk=;sOW5rz)%q*EkOOQwASEZ0&@c172cD zXotW4{v{ZOsJ4SL7jWFDoeE<0PgM>V_R%BZ{7rrI*Cm4<$h22CD5bUMY0L{&X3L1u zhZ+P)S3mIqL*O9+0hg29R5|#QN5+b@PZp;xA|?X%XgtXb=a}xyTbRtX{y(g`ies&&A zRT>wpYKHGP>;0F_2UEk?`BMpNGE|1ZY-`x=uprdL2l16!RbhgM^?SZgrTzt<|HJ18 zo857jyMWhxE};KNIT)+ZyQEN;8e^m{^qXP4$#WlhizTi#;x&Eyjkouo+l>!7d7t3X=0C#Weexl{0IAP}=_Oo27 zp0I~y?%`*-&Ftn*-hTly zc3hTkiGz2hgIJx%0*nfaZr|-oB+IqryCr1b!%l9E{ky{Xp9{m27!XUNAFZwn$t|D< zMo&Gifbft#o}YIAqzCtYW&p#Raq6|#k#oOky#A^XeGrU^OjJP2e47>UaaGgh@0#aP zyIz%i(^&qg4dj_@o?LW>fK6B&W194KCx!3t2;V>X+E+LLsV_M;;e+hIGj{)_KxM#q zTQwd%{|#F6&x`zsArn zc;m@nx0G_)+1b3{6avRM4u;A2Sj^%-Tx~zNbGNIH+}$o(`j>FtVn}vz^ko-c?ME|k z=dMhj2n%2Q02%>Jlb|PX;^M27Dg}4$qm38c@3MjadWU|3jTL7_*81YBy{!fAoD{zp z*~Ogy|1Ou`Kc@dKmw)aS|F%f~yIlUyESGpJ;Ds-jt{ltB5|9ui<4^N+TGkRu`I_v4 z8gTRK$4X3;bB6JB_1-ozzOLBvz-GK?;ijZ&r5z*dtHd{9To7do;q5|ZmH4SIpLKDr zR(#u9XiYQQsu7`c=vk*$%~F*P6uz(+tq_;OrKvypWx3Y3|2pN^-w1A z*&g`~kj;>MnQl8H0&P1GlVLr}aL* z76%Ffy`Rg%xWdW<$w%CeHkZ8U+}GWRO8@eaXlDneHlEdUOu%g9%12bA?}t=Hf!=;% zh|P)A_F@lG^!jfnw&2}(^8q6nysI2@8(WWVee0*shT;wWm|zkg1Kj7FK>?c#$_e*! z^ni=RZRDXzMi*QN0@%Cv{Au`t05pDAUWo1j5n6tNcrqE!Em6-`^5I$J((KyhxdX-0 zju^)79U#6dc3k147BPuCIXw`gGcKDlO~?4EPf`{I=s&vX+|%;tmX z;eapJCQDxc7>elb2^A*SY4;2sn<<7CRyz#!_-MPcpsQqks!XBh+*J>_7;yl9jxfP8 zOZgZcbK#A~(VlYaNsxj*9q>W9Mh$SWS=CEFhOud2sKLuG1`C!U)Q=Q7b?YgNwQ`DssQxMr{ zVz`g2fGXb1)*jA&xd_~nJfh4`T{C*a5)M$2OPv}Xx%?rbFhTc|t=7_y6s$U9G{Mi# zV?56f7s#mj^^>z~&)orRzjLcv%yR!$zcb_di)te|?uivZF*e$$#VvM4xjF#6ryY(q z$$Gw^@4o4i-Orhwk6MwX&kIG4yj}mL&T!5FnAPDJpC2P&C1l)Fd$ga{Wjo22$86dY zN9R7;G`sL_{jZAlf21mZ9tPidiGiJrZ-8=Tj#Tu$dqU;bS820;vLTBF+jGQJCl{U> z=9KJp^ZP*;X$2glJPxQC6e2ix+FVg)vOBruH6Cd^%{@ zm+#R5utOzAc%-e}(H3X^`QF+6M;41W9hyk^qq4y_3DzdQ?wZiDvj64`min@D8H~~L zuV>c9?>6zWEj4}+raGIcb~g-DwqC(IYe@15pwe5va_7MkXU4(9#c&_haz%63^6`-} z$(FCQEKRbtSC*pSNfK-%9#gObU6+WVyxFIG))VvV=!r~qn->2tge&1PJ>QS<*@p8s!deCTVdfEWSb8^6Trn&C{p(;nk|rwoA4z0mulH4Iaoaq8tvU&a128F=dEjlCH6pBJY*1c*gMi zy1HgZCr3L2t3~M#@h-1}gn%x48RvKMiAlh6D7Rm@Cgs#M(b%Lr&P2@bX!xfN5U`7E z*SZ37)%E5US~G%?S+vIm))?aJ80&?(I)R4nuzBx^XeUi2B!qRrC+;`1&4zR zxCT&_3oddIJmz7fZX$CaJ87|8+t#_~bcmayi{i0z%Q-*K<9W+>@07pn_J7D(Y&bs) zbyzA;3|y?^^NasZ=R8m%>uSm@?K$2`VYWI@R?`*R@NFTu?9|yK69~tp?RPfp5;l97 zsUNReY<7qSyA&cQ)WuGBOW?*{!v;H}kf)z1Sfv_vM_s=3)+4j7rE@R|5BI0pEjl2|etrj$` zb8(4eb#>0B&C8%YtS0rn3xR*1&=j%lVRxK5Q%f=kzen4k%?D!yWc;gezf6NPG%^{` zuc>MJ>@qO^X4h0i5j|IhUd?q%j>g_o&&^cR6G~*8g>;XPlAxTaun2h$t4H<)`GX8Wc6pr{YJlufTxxotGjrUagvO5&oy*SL6amUlplL*qt@_^XPYgFf=QRjt~6P;m8^l1JRw*l(jS)!0pN}|GXGqSbRtmsuE(GKJu}GRN6h?UTWx0F)K+|5~loIPIeq~dpU(n zBX;ebCoafm9lH(uFv@dcXa98I(vZDZDdYmfrAb$eXE=7Q7dkrrK1GN7!0WpdHP7Ko z*R3}d&cRC|cjTqE`m$ny4H3`JoiSWPBAy>-SQ>B)}&K;$~*#uLlboFnlTQ1;jt)HULL7*DA}aP%b)A}d1=gby|h_xJaa zLLg<8+n_tmFnv(Y7&Zq<{xR+F{kXW{X}=KCV7UTR6(%$cfr^%HLt@M~%VOx$b>@g zQkiXDXD{|8pILcT>GuXp4366N|qP>I1tQX8=$V)K=gw^bp|4{DBQEa)4grgrZ z+0AG7rxp^+92eWJRGs#y(v5GFkr7eVH5nq`Yn55Fy|a&3yJo%=oYK-(I9C9TTZu)+ z-mx5E7tK(X|0v$%WLYYuVmb6qsP56>(wmXOOaqRHT*MVO=;}uzT21>r)^u^-_+GS@ zy*d5rspTI=a9)m~YG+V5b7(Ju?R#I_d9NeQBpAtOE!4KX#0GZ|R84a&pzEn`@CRxJ zxhA~5t|v2Ecc(x)ZSRZ(fw!8qQru%{yvw(8U&bx|;|p)ODj$mNZwQHg&bIt{m~=>R z|MaDVI5~y1_?0VCQsUyNSv=A)1aFg_)}9961^?>!pRd*V?gkL3O84WZK8?IRFeAX< zt7yU>Yjo`iU+l@o3X_my#`KZ$iD}Q2?L9lwSW2SVDp(2R65R@e zCF2cj5?+gu;9;>``&mD?^KSFcX{u?R?n6)dvB7ICtZbBbxPXFPM*P0~v@^xp674Ir z>%W?1n^v)96H}Zf7plTMX*k}s?#CqS6?sX$-v~9|?=iLPZ+S;8{p&JC{bx4IOH0e$ zF^?l(Ra;fnLMnVp@`(#5x$cJE4d8{@-vMT|Yl9&NRakTjxjJhc)Q=Mr1|D z+}=f{3r;#Wj+Sji)V02^Q!lrgHnGswIYx)XiMXnR29kblJS8?0KE1zwq$wYn^|~Mi zqLeU{HfUPxc_i-#gkS&N|x=qJwFr7>?wQZ}&-(Q9JI@i8>XQ1g29CP)KgL z*qzf=0bkQ8U6XNo2*g=zYOV6u2>KZ?99)hQ%FYVi6^HabBhC(_=KbEaU*(L5*j<|x zQ{1u_86oAF%4&%J;`jUV>>&#|3eah&&blk^e~2Fb$)%5Jqnq%OxZbM(UD?q#6_I0Q zda3)_k!SLyFISjkKaAJEKC@~^TRnw+s02xL5?&)kU%uWH>o=^Wp#aubF=pBE$Vu1F zl*2ASc}N$^n-dxPTFQ-1>*TQcEw0f*OLsCiOYP*0h!6%_P_A&5r=5P5^h99iZJqSa z-R(YKGI_Vr>YHG-d9v$NIY`Gt>l0;(IN(JCS%&yI;x2k%8uacfHMeM2BsxWgG_=@Q z{!6_gmsahIC>{kZR0^2eC13h#%%<)~=&_bd1J^a=M;Xjb6mTIOS32&*sLP)smji9B zfX4`k&J&I-NEBfYgq+q4XmSClXn(arV_m!nemuFdaKX^TK!#xkpC)V#RqrMCLr|ey&D|K?zN!Er-VoOwXhoSwo(E3U9_fVIQ(AB5pVAB!wKC9(9 zsr;0yS<}PyK&gFjGX*b%UGq@_8jVg?Ly)gVZfrR5*|YW~^1B{x7N}-*2 zsOk1a&pgaLk}g5^NYnyfpZoZ3E0@uTwkDcq?YfV3&st7@s)OZidhxmqXE|y_iyErC z)jU2GoYbE?5eNaeU4{x3C70&?J<-Fq6t3EE;GXE-^{nr-bYHr;19f;gajna5oV&qQ zc?CRFTpFimf`|;uiuj(xDdHHuoHKmXmvjpUeo&FzJ(*rHxgaDYnJefu771T}px8!; zK9fxQ$q_M<$$Ijw|i0 z2|UiOpAI6os<(hY<|E`JN|7dQp;g6gy?`yIWt9oRc2w)0KvL4ZF;;H<0hG4inF1T? zH~?HakZ;Y#dMtmXhOG+)sFJC=9|H8_m4>s!jm5otshRuB4qkE@oX_Y27w69p7Pc}Z z2cMWvUxJhv@4EA5LR2ho<~;Di$asDdD;z(ib)QxiH(=rj#rdVkvkU+H~Xoc z+WFwc{#x#i9U0xpkXFOLqY|$}2W7XcETLLA{Ei;x>f94v>4lKP8e>6rG=Ku-+-h3a zyqu4A4(*Q+Ly)`1F9Z=@bnQWn_oLuLD0@h~XR}~yg2UX2v|PAgnsAIjN!Gzn6rq(0 z?9sss5YQJH~ybpfY?3)@q=}P|11`@4jTG+zCrGa}R zP&h<_uJo5GGbp%=CA(ef>SHWnA4<&!qp$|%Xf0!p77(M&sMi^mqxnZClbhGSPS!j7 zrm7^&tPF1q&92C;U0}x3fOFL(&&|HC;CIrX5@BV!` zL5>-h`gmdK&|fgN0DK(=%%u4TSzywCnBD&O*Zdp6^RGAizqk0m>*im2mVdlw|2N+$ zt{WfDKqug^{X>p>*J*7)4mg)A>{?q*)Jm6Ijo$@%!hjjvL!Ht33-$Bt^Z+8@d8knW z1^%hbt=Cizq4&^#GuQd6zShUNs*|X{oGb9i`|Jt+ZR-i1feIBa(`o1&5M2z^OPZo= zO5z{e8?=WBq!@LFNPnhcyRTU+Ok>hu!lBjPOiZQZ4J^u2t)d6?_w8K);v)mFO@r!q zk6&`;)7kH#C9T_I_ScN2t4Y$iOnWjg^9B=v;)i0}Px0Dgc)!%1Y%7RD9?2SCro;Yh zwAA7syX`SfRBSuzRbmPTFRAt^e!;h{S9a4FW$L8GaKFim9sM$as}?J27{RVnId)k< zHlS6y`>)d9!DgYxTrJgZuFu&NoA_T}^ncj_-q2$aa`rtt86I%h>|-R0x!y_nseb5S zc()U!@i~0Aj8$R+MsHJP%qy##f`L$|Z+xBS!S3}TZd#F(4r;ZzOz9+A4@LJ?LtxZg? zXK_=HA?EO)L_P0=@9sBce87R@801yL#pxC9d#bir(<|rG?KoVsNRFvtHPX zIhTCDXCg-TwE6O`DZO8u24Wf!s8cu=*CKxnT)$}e(W})^T71%UIjt3Lv`9z+{@s??;UArX7EV@T-o?XA!9%! zbZ(-|(xH!Lvi=mkG?X=%{%W_RcQLq?zIS7$o87Ye!ySc4fz#$Mbq1>9VBRn;c=iT# zs4wGtBQ^Bg=5Pa@)U|@Nh=tELn`ojRImZa-VUqy8>ch^e+~i)Zrg@;KC?57GpExtb zrIC;D9A5e2miMV>G+QWXVT3|4n%nr%9+zj@ZLJ2cl(+`F#yD=*jST5?(q6a_OKgQz zILNSwr6JdH6HI340*)QVDb9hQJJBgEEJ;80_|<-E8(=DrYcQg8pd zHn<3y?x_zY7iHT?-N$r3GmUSu)b4&9d0dEK8G@aQtc~zm^_zNQkz}uX1?y$MAjE`3 zGzNlTa$23LZQJNl@oJsiRW>l0cGC@u0yfT6^c&MTABJ+b@~a}y2`_WJgG{=$1$%$g zDJhAe2KsBGD$rbz`r88WM0wGPd+dImB8nrqx~3@bG*RaR?Teol;*NAYwY$cnVzv)Lh3A0D{=A4OPW@9-KO5^y>9l^4X3sD+=DO zaBrxuTLQAGM{aEo&<|Ez$ND6;W!`W1RC7+%x~l=}qI=l*N2CK`UU^}cZ}n+lWW~3r zo+nC}S{QZjrq=l@qMxgU!^)vb9hgW8;_&OAOawbyJ8Jz$FT^4-ezM3%C^A~tM^d^ zJZ41qNjS&3jf4v*sz;LD)s9M~)iRoB&DtVS0^>!7871A&M!JIO+2WVlM%orHD+8LODKhUVvt4>? z!8^T5$a7<>y_H@LGfSB{!7a8LCt9i9SG=b5a(8e;1OuK?3)#E{AFncl3PWAmqqc$x zOnHFAR#j`!@J!bIrH=6664TyjYW$5it+fK&QockJQ^0C}^p8;%dVU_(pu0-(^ABU2 zbYFR*W?-t>P68r7O0TMW+~Ifz2hl#!4-F&C>IiE%qWBfImtiBhGL&YkAX9vMuWxQY zX}dL867-!{P2so~P$C%~`QThJ+f?@1IjvAzOp7Fne!+9J-LP6am8Vr!e0h~VBxBa^ z3wvMU(V2Fc&C1pjXy3Op)v5vQWeR)7zC;PK(-26k*QbI#9GO6B1ddE8WRUbar_NI< zLt*C-w1Q`zT%rD{g(EFG0pQqfwfAN#=kQHO-fpDe)|LfTOs{jD0+rnHfF3c;WEoK@ z=ZEyx7=S9lGRHAos1iEOhi0gTn?lY5-hp)CRK#`jaf7Yk@ zc{0ERl&n(+*;!v5#6o)oI6=K(bTsgOSrAQjD-1ZjbO1ZThh;3s2MFt5600((g^5xd zRwWv5s{ruL9`xVGo9?+!WL;7DEOnBO_#%$MEi6LdnNTZj$r4x(=VLV=2r4MAaYAlv zHJ>D5Ll^7OPj)uJ0DX7K7T8F34GxzIY;cX1af4P5bfD}k&Pw2flG@K$)r}KKH|6ns z){q2x+aH&iP$j)>Z;whu{9gQ3nha{xsFNHeoAL)D1q~P1rWm=goP0+t4ijh4^Wbf( zCeng5PJ10K6;g2Mb*#~FdsNoy9rKpZO^f?dCgy9SBv<0J`3v|XwQ z#YkhH41j^*d!i+y!@j;~y6S@Z-OhZ}rnA)O<>R}y-jxXCG1hCd8Of_k_SG1 z!AySgRmBC9A09VQbARZ1-A4+aPBKp}mFDkD%<|(|3gT1RDYaZtFIhh`ZT|dHwMJPa zL*bwwHVwuGK36!{^L!p!W1NkWil$x!&S8O^p6X519Bdf? zvyT!5Cv1`p%?BI1G8>5hDLw|ml#efi%|^*K)jVK|qZW*8x`z5WA8&}ZKn1{;&eMOM zVFO#C$kE^kXQA_+(lotv0VMHJ5rZ~QaV;=46;_~*%xhSSa}YCJNZ!2w-7$W-dFJIi zuwyk|;)ewgY^V6(wA+h;H*~s3!7s@G;U+B*d4j|0-^FQ=^a%j1(b1vhMOuhH5 zYZZ2EsZcExZ|gh>&rw&%n_z_OA_QoL3RvJm&VAAu&0z5Ne8EH+{_d8FFk_CoU+VJ# z;$Ira(IxNd$NqWLb5lZ-p7vi=j>%Th<_V|lj`btt0Vk_U_KSQodIPUIQ$;g*M%a}C zj%tjvi>$(^jYzjZttoAkG9m$&m@3vuX8)KA-#Y@7^|C^k$SitlVdm5x-*`2(XXd}s zrm7s;uc;VCk|sFY52#54g(Ioes=KSrEHjzNZV>0d1$vcB4LI{a9zsmN(h=J0(-%1< z5Pw-|(9pKh;pp=!v0F_QL`HUZU}i=vc{US|rbQ*nsE%i2J#IjRGGkC{^XzJ!>_Kl@ z545a{GuXeXV{#Z|wkh?jl|C*>hZSps)gtI}tkV(@`&t==Xs#9dn8ePft-y8- zMfqp8N$b^7?4@r0`|k*OD!*_}qCGMm6chU(_E+&R88o-|Zt|3J=?^bPvG$5Yj%tqL zy6Td1?YLx$onr-y|!4K*zXu%W29*Tq@H1qViY_YfG?i6X`mb)|`>l z>|?5!aF>gcoxDZ5A=`W7=CW|fuPf&ufv00#z)>190|A1Oaa*v%C!2egO7krPxLf``Kbugix+j8!`jOk45;|~{ zgIS{jniL+l1NG)DfPh>Iw98FihbZ9BI+3df62(NV#@cYy*O4w;#;75=>S^8eBT)JR z)L)CP?DAB}%i4xz$Y0~f`mb)IT#qZg1E;*tVcQ333L)q3p9Gu}a|zqx%C^XT#;1GG zYBN^&JiA`4NkFBp+Bp@m!gzopC6Kz~93pfhh4*gh$h+y<1k)E-BuX*mLDbxmpB+ux zg7nI*$6qHzKrT3(zj67v(VDr{Xpv}wV%w+hN$q5X4e0Gd58tizmsDWT_VIG#K|xGW z@f0#4g#WIDd>9l@CWjxN59Fb#^m{T75_w5#V{10v*kBHEv|C1)R;gXSa41WK%~jxK zFzQVC#0}XwBhtP8cC*~_Tt)rL$|LoMrZwgd%{Yjx`Qh%Wh0m_6G}rB0=6&5=qmL*< zj0mxYmNqP9bf>zP+^xQ0BICPOde$#UjxjVH&hg%SoKZ0dF#FWQ9L7r|BI+n`0tyd| zWXA@HdDq(kn|hQ6HlEz9S5hN2yzE)(Q~fHtt>muQ3USwmO1)L)O*AamH86WsHMxfY z2QwUGTO2J#Hkq(9Y7igsgH?Bes}}<14^h}T>Ur$g#~<)Kr&f$En3s?fs4&dnfg?Gq zUaCy{lq|R4o6rX@T$_W*1|iq8drPyKMg=j|xLOV05+e6|Bt$8bubK4?x_Mip7KYLl z)Cfpu#(IeonVns>OuIgK9Z7$_?%gfWqMJGn?0nW24U_&FV~du*bJ1<^(k(WD4y>6? zqy~e`lJDT1K^1I^@SWL8tKs?I+A7O(PSl;@rs;^}V%u5a+I7y1Mm`*j=??)m9j0jH zWW`dr!5tAS>gpoh$&qDgFE?%)C;Gh8zTBe>Wh5bTXSgMh_70%*+VOz{jXYYV+$vDu zV9qwN5xV~s&)?!j!SdJei;BE&^geDk&7yeRvrDb1XkOV-N$umNtc4QQ9v1I7S5SJ! z^PBp)jpFx-*4!v9*l|0k!X~kvEDdS#f8vOSq7ZfYB@dlkd~3Yk)di-zS{T>ma_t&O z)N~&0xprAkxIAzsTF1`tKKB<$sHuNb$59Ib9hrv}$ksIO7&2exIo>-5_D(-)K9=J> z1pg`BZFA6cf>yPMya~AZrI2PzUK^k^NVd zS+Rg^@VQ=9$_cNzKc!WXVWD4^8*QA{ikZrS=%L#kT$8*{osW0T!EiYh%>IEHddK1@ zFYVWRoMzcsVrS5y`#<5D0N=RYoFeJ!+MA!LT9pjWIxZ(Bg^RZ51R(J`d1p`|M3uSi z;*97-D=kay=lTc}!5pd~^Pe^l$Ch9?Q{x#jnE%_H=7QEZ7w%gP4{P!0Y)CUGb%)1S5 zUe%v}QrCUsj2MZ{sXuYh&(h72DU}7vH4i76&9!MEW+l}DXox(04nb-9*W`=f&VG#P zIxTO&r)yYRotSbU{jM*m*e^Ou=_%Kpu zzel6LXT)GirvLt$|L=Qq739hQQGvr!0%99g7Q2n|k99zdSXaT&E>>>;L9vc=HweIY za&eD?Pgu;a9`)AAE!GkjUQLvsmK!5_K(I7I39 zD;)C*O+|m}j;&a#4%c6qD7)z}+)fjTpQ?Q_+5O;O|?EIzb>x7%%;yc~>tB>kw0>qvxd@&dlaKbAB(mPWo_ zPv=W+>OW52cTx2=;LlD#|AJw4Js33_g|gyHJH@2yz5KpHR2>ExcBY? zst~x_;yTy*hR$PTJQL`T@y6-lWUZ6;2VwM8@+S z_cT~d1Yniyk8RhmjS4vKf7YpU(N)cm=WO3l^3cd{l)Laol7A%h@y?$P+M&vq--e=s zoy<{RKB=`#2q-4%kE|bogz?AM%@M%VKB z-%f^q!3@Y9u~>4+R9Q`8m8D}Q_eQuh!$6F6C(m*pb65@bP&XRg} zeOP5AZ_XY+BX+k_|EWJ382k2^ z5u{}NYHj^_!DIHpVIc=MJeJ?K12~Ww^-R4_76=2!Wo3iD&5eI9uK&H`GQ7dsy4{!9 z=m$bMI^W_d0N%xB;3tKPE{%X$*vAdX2LVTK)mv<1f+PHXJ@t@E@Q|Fu>EVrwq})M2 zapsjkTPtZ<$OzqEmpCOSCJ^t(;U85*e!`T z{qe^i=jS49;q(6t>RX>Cj8h)I`E9H9s(k4{`n!Q--TTi!$-8_CD;*EvP$+MUSJfgM zKY(ROg?%3IQ-49Ad2D&5qvu@MG!9XVszr50QP*3Vzajx>DTLd%&cktN0vZHle?PsT2Z`9j<;?G0s5cpkLOa9hWLD;khz==YL-m!}LGC zoB|a1D1tQ5kPQ)!_WC+>>X?#rnnT+5!*p_Vv-v=2IJ<7OPJY$$ed@k*|BtvcAi*Jw z^O`A0>o8QU=t;S*Qj)#lhBj<>@FEfF*o@4AKA^(CcEx z!Lrg8oZrh|moT+CmjYro^!ItFx)L~m_n3o+m~qelRwDa2ae+#!2Q+zDZ~XYw;H z6(T!COP%r`NUcNC3Y`)3#m1ee5CKP%s_l+WKps}Sau7P?d4)fq@jb?0aLU>Bj&?E2 z&7t5{I_P5q)`nw?EFNfeneJ%AEW!a+G+@9hQafEO$gbC*EC-Jq2-_?fbhc_58XH zU|f++QRHQt{;R#^TMv!sUa2P&Q}-v2B3!%T0UuuWwD3+AzM%Q5V)X zp8J-B)hgIWjyN#Ml$nU1ta8klQY-%~@(CjiM}DwOM_x<*d#)mek@jQE{~yog>AU&b zy%BM0ZkM;ZJ6p1jfZv~c#o?3i@hcdBC3sbfjqKgCGy*@mU)6e=$jAsEg2*N^?kTBR z2IA1DDs2BinQqPB8K_pm*A7aOJZ@i#gt*KTOB4RB!eD3yn~|zwRJ9PeRn_sW2DW6Q z`5=8aKU8Sr9xK=GI?Wcj_vv26i`*B}`Ih6wSuYwIEPi+raxnJ=1u6e3VCoAxPR}Zn z#UjbN<34||(-M1X^!*)cxpAnAZ}=UBh-;90^1pd7fJGK$@O@~y@e>hGu6Bi9{X>`u z7vwC@YNAw=C|dMaLBp9AMqa(}5=SZektCnZ6!R?XJO!j81yUwDtqC#P#tXY>Ra71S zx*am)S=}EA;SBE;MNiqxe)|dy0`WfXsJeshhh9N@2ygDwrIj!P{uu_>>6h|7ppA~@ znh?V$y%iKFs>M7TyPY??8M{7Pp~6}D(^EVBk?{tP?hR=hpTge7L3u7($J<)R3xQ&3 z4&nIgAWkB-6ZUeU#e$&syb+&Xu63n)yg5adgc7+Urm9u-i{;4V$hFvD>HZP0Q&c=q zI|9jE$qw4>+Q^?3a?~jjts;lN5NX90ODe?vH&8Nd*Ql7>-nql^_!N!3$b9Iu5!ItVJW^w0mQyi{pdt-9Ujb{8*NM- zAft#q$l^R5NTKz2x*k*U$DrF(Af8*{X0ETaz0MQZbqhc`!}3y~XlnsbZF|eIGfwH09VEOx#^oceH#ntt~vbX5C?F2r0(DQa<2B zxYrcOhMa%9d^Ui3BUrsNa{Ubm-e-LwBf{rLZ}_nu)*Zr#?fio&L=2r69>P!Le6(gFg~K`DYj zzy<^nklqs!L6P32gEWyQC6t6BHaY=9hY)&^5_$^>-(o*!zt8(U9?tLg$N3j7Lb$W; zb^r(MTxBCPYh)oJ*1yRAa1)Dh`s}$pk3>zpZ(a1D6t*bW^-bMh zA<;avp+ksa=43rP;_};S&5A~F_ZyLa)mytS4e?6XwZ+dIK-$-J8t-=!Ld>b+%d`7{ z>N$UF9D--Kg2ZE#xE3qmisr~~oDSN0SbNuwD3+r&uh(5mbnYrGVgKXs?EU}_xeMq= z{Fi~W-cGw>w#Tiv43GAG!aJO160A?=k0_)zy#5koZ6Xow2=O# z!*1yO=+bTdNH1tsySC--iTNR9E>sFW^0IpFBQ4L&LhpiM!eapi%&ke61UXwLHOqSY z^w?y7?SQOQ_pGc!-et+y0%7Abb~j*!_g?hZmF*J{raVi(QX6UI&?jR8 zovnu&5_s%nftdO{sU^v+H(IwZ)Fg<_##8ULxX`UwPndQsN} z^2hqC&rB$owG(A8-n=S~Xt?9K`qN06$~`Q`zOMR%UC@L;AE1U`Qwj`u7thn<}ZFyuD3;oTi&9xcI$sZf7=ask>HH zLpys$ z#J8>b?L|I(?e#$uq|6b6Cn=Qt4VTkRju%67Y)~_a`Og#%q((j~Ly#)kMC(jMJfS)_ zq#T~(`9rZ~(`+xvHe2Y_$7~oz`yiD=#_EH(efMP#`5of#4KtbQ?NPK{rQ?vVSys94bd$KwoK;=}eDxF6w@W&*^`^ zzPTVZP~^uR`asx*H(JvqBirG0G0_!zFQb@wedxDBv>Q_vv!i-@?(j}5bZ@KZ0m=r| zR8w2%FluW{TR&kesKMpE_&BMNlsUVqoDz5`c3CQ+@A%$>;<}Utfk}yh8}N~LWAyfg zS%Mbha}jozPqDHHk+p`(=jYrW3%)Fth)o)9PwFqq4k|MEeo1MMiaCaYik{X) z!ex2CAVz}uL!=&wQrn-Tl`4C;140;48$4@PfjEFOiT}1*hgp6>2Ug-9d=qX>z8ziu zqN~T8r!o^xqH3P&n#2`+3a!(wh2sLp;Mmyl?QCHzaVjr2wNE{%T#p!M`hL(+oJDBw z`mH)HS&st}qq0BK&=UoGcV8Ahz-M=DaGp)8H8oL!P>Bs9MYC>~u=aXY>Ad8cySYhp zO|@xHFBIyx9=4A!WA!GV(6gT1$j4$<_s?o{U{GO`)u#0fBgv@+U>i>qWJ7W^@)+F zOS7zb1!VZQ*2EEo?_DEFLwlK?!4(y4h5|+r6?UdW^DBsQiSIYCdy3dDgDgbpoPHUm zvy!+u==!x>W3{*v9{-k+>w+wL;}+}b=Q{>vV+nb!9gqXrW{1>ibx-@f?E*CahK&25 zWq@{YxWyT9}71vkLd^V%~B>c`cT6f%Dn4lwdj`7FyS1uq2-n|OOstBup9L30(` zkmx8(@nW|f@}s68k@j5GKwHpK;4}_QS7``9B^|#tMZ{4L35-vVIy#)T4KV&5=sG>c zep@`>GvBLz;|8oQ>ZE_X$UL0c3JD-yI3*a0eWAT!i+u?51nUlh>>_j)7o(gSR zhowk$`W~1{aZV9bx(Sz)&jqnD;?S3h5Yw+D`t%-+m(3SPd=gk!+x4j40*ob8r zS-YW{pNoXYXk)?Z?`RY?CM{;y+Qj{fL*c@03Y1w}PW+Il5r7jJBDJ#<1DUD(}It?vy^T<=K>{93V5vEw~QX`g}NOSp!tUl-`} z9Jz?NlQsdX3&oo>)fj|0j=L9VUZiH4ba=X(sBOzqP|`(4W=@#2z_NV_@!ms(X!~^N z*-#0J1lt>py5q6i*j!9pyg9txs*7g2BV{Nc=JD3z?e6t}QMcN-$GKxn3 zO$)*$!8N(%@b378%RpUy-TiUe{cS_*VO)d#95 z98JCTX7xkjIF+64B{{-MoROEDh3E9C>XDO|#g_)lRL#YOs?35J?S6KDx=-O=6`|WN zs+>l^=5kQ;1wMQ7r*LU^*53j41vt{vnG>XNE>C5tms->WGsHK2>dKbPZgXD1Xej5PesR&Q~vldw(N zR5YJ%ysUK^Z#cw!xF(Mc!TwIdwlA@=cv7GNDahd~D6f|&=^F=F(F<<9Z5Np)mo!bG zu=?#pN=7fiC-pOAww^>0+0Glk3|P?1n&rgg&xVuXY3aU&wum{_3tcT;56k#Y`Ng9) zSx+&?o7i~m&1XD#+Ncv#=TKYtHg4s;Hu}cJgDVdb^3gAPKl^s#bhCtG#WA`N(&cc- zYL?DWi*4bCOEdCHmsEXYIM+A}RT`@n=ocoAyjXT$%7+*g@jRtt4+d5G@>BYXIS&?1 ztx8qQ_T1Ukr4`_;+f?P~2xZ-M2(*2br_r0Z<+DldclBEO9&OQ3ys)p~XlHqEvyRGc zOk40xV<;Qvh!h#lr<)*LTsPDx+`SyiS;XuzF(N&Cap};Fmc14%p#LAg>#Vi^r9+89sRiI zMPVuk4-;FHaJd&I)v)fHY=QI~k8(E?+$@kLTPE|asgIU-)h1JRC|Zeyo-X|4GAW;w zqW(wUNqlp2CT~=ppUQr!c~~i0#Ygc5w`$gU4cHuT)ryFRS9}U$Y1>>E`_mHJMibyp zA<*JUK+$U1YL33EYS3BPnD*j=Q6$0W3aU+=nj1EnHMK5?KKnaS8BLw%Wzn9#Hi8fv zEta+GFN!rNG8ko+Fq9{~?^W}ob3ffL6y>G_;^n={0XP}>0aO^i=@{{G-Vjc7spX3J zi&4DF)g(jSZE+=?*WZ4Yzt8}&gsgMx>dYYdS4NN?sa+9VvNk6s^>2`C9$sSp%39UQ zefN&KU>I<}nu@p{bc%JqrDcU%uPLleYuGJiib+hZH0NjV4As*|JCmI!u z1}?-UJ?;!$E~fq4vZ*TNV})^2vekrAN}3#P4z{!VYwN!iFvIO0EPJ)xkMh8U#;Ywz zax88zS&ankS?vd@shdj5Zh82R$&f~q=O-xFw$f@NPh3SowzaVHY7P3(WlGPmjS=i7 z{ME|O^Qh*f%J|Noe>xJSOAWp_0y?+N&bcT6@{(*1VL;Wl%yXdnDopyg8 zT)#J;NIClMENqRd3w9t+K%*@lZ+&N+37w#HbU3#ly~Ofq$TxNhwNMna^PqC(cH)#k z3)5%W-j@Dh!c|*$wmjN1^&#WF!*AnN&@o+OL41(TbZARV&5|(MOwfZZ(JwJG+p@Ke z9%Z;{n!Ur^J`UyCby)^o@ zQklGVju}uJn?wm`y%m;9e790R&IlQmcTdC?e*%*zkuUr{@xSh>-f<)`8Q;D`w|6jv ztZy;EYJXTbk1y`os#hI{1_uy~8Xp;>#O=S>)UN@#^yZH^DI2f#(0C=v*NphLlr((~ zJMCc<6DAQmet~L}uqxjW&ZnrCzoj}m_{6`UtUNy7Uw^buS6_fy_Bh45VGKWJ->^TZ zc%z+QqVE5~5aRt|o@Y~=kx}pa5}QQw4@Ma9jO%}N+9D+XMsr+c zMuD%qKeJ#fNL_7ElAd2_R6gI@5)9LG4xwCPQ5Ia!!F)@ZKS>;}_q_K#IyG^3kO68r{w;jTZK$!1A+fNT@ujlBWC>_N zs^mO?aoVwpH*MTTSem7+o9q@5Uq02}A$EV&zs6K^)ww_A4Elt|5(vPAr$XyRIJ62H zonXBjzjEA{Fmr@E#^K}w(|Y<>aQ~^mA>OYM{{HfZ@WcWcoyT}Ho@_k+QIS( z4yJwJUcE^bA+JJ=SL~aPHI6sB`F~k(sxOd6$WqY5X)o0y8@ny>YSDa-6w3S?KAmfO z>J+NdMgBRNgB?qm{hGziAs5S*3b=M&E|7HVPpM;4p>6KtlIS5uab;Sa?7Qh1Dy?p7 zK#;D5*~pAfiE?{A_?P$}#Y`3j0F!UJouL+gr@WAahYHjWr;$nK@xWMosIW9m`or2n z@ix-I#P9>O6?>ik|A+(^! zW9*E~Bd2nyGFP7X6yNcGtm?f!vV>v0x)Zw%m%1(NpeGM~#FGb#fm^}yo_Gd%_N8037M}V!Iw_Bh zz`1v-QLJ-}%3|~4$HE8VyK&T~pmtV-Gz<7cI}`OE^vU~KHVGR8naCPskZvIBuTx$h z?WP&;;4_riy0{~94$sWv#hUR!3oSZnihI{D|Iq>OFL&NFRWX5ydH zo58|UumC37VL54*#NQ1eJMOo5FG;GSb-S}1QfFISpJ%mC3ZchduP+&2RHql;dCIE1 zu#M;Vfs>IwJfxz}!i?+T{<1rrlZnvZ3HH^$KdjR2Pi=7(nii{hx+cV__{&eXd7PJS zDj{<2?lL8Ap>Jryw8CM;mEzul1SakCPpnm11>m%KaEDqebPTqwk*9N|*GMya5L;+B zxc^jD=(^yaxNtkrMSfSJc{g1#YZn_j?MD?xXTSyz+NbIMG5W@B7>t@Aax~K;KjMUK zKI>(FEVpCoztb?SK8M|eq;?+bAV2yQn)+D;Y1pwhq=z5dH;ne6p!# zOi2>Xpx~2D?W$fm^a^UE_*0L)zEy{p(cN%Phe|dvD_Bh>nF;s!#Kp7uZJVag#a|fr zyYWVUT@Lf=jT5SG4Hl_8YcS!y)UCK&hj#gr*25rvWmbL*zuy;ken`lm$gKLcC@N?k zYu&0TQg3BVQt+>r&A6#hu2}(AL$*bAGIW9Z0g6`IOo7jts8#{%jQk9dh z=UnuniNgHiTbkv*yM?dLiuNp7_!fo(BmuYF!nnu|m=FKeSJ)ch67td2k)FRI)Bfjd zR|Nc!)H8t80@Fl@mt8OQ4%+vDR$ogIu+Gxu3*kCb^6h1NB2teS>9uuwoY}daRME9% zjR?Ewe@Uxl??9q_I6W zXAdyW6@QT@{Ufx%L3hEl>9ASkAt@&R%fiYhgtcL9MZtf8U?vvAA*Lley`{)3nl6m%veqy(%W$nVt`nB*AFq zcG>T$ld%H5Ut;lIzU8!uU?iRR@U>0hVlT~3ezEY`a;whco)Qu3xNXQlpTJ(Aug4m( zyV%Xb(sL#u*Z(>^eSF?3G|Q^J>H&{p;1#W`4f!pK`$Kx!iX{HaoSW6NsMgnvEJLpF z^vB-=L-p1hs+LP!uAimnv}}zN8kPS>)xIT2AUWQ>Oi#J&mP3(-Nt9D9s;c<{Y`knb zH}C5K#s1A`hP8rg8LtxXG-~U6mc5?!rT|9+=%9CtEcUay{v9wG!!sFL_$U&;ygQwy!!E1Ix*^^mwWg&0=U@y$;{+;4u%g@19 z&=at~llF7{RPMKI^wxG`p(x)hc#Zqwz@@_W4=3<&Vy&EVWf8};u-KPkK8}-BcYapA ze_W`Br4jSR4(P&p?VF>1PG_5|QgZgWg6c3fId>{X75I^tx3b3X3;XUjk?&?^ksZWV5GJ*j{{P zZHI~8zp_s?l>K@D4f9{uf;(h)#-6VJDudYxj1k0`SMw6~Sy(53F+}h0PEx5-GIH8e zW%f-zSE*-sv@|^Dbg<-tA7b2?tKx9j^lfL*DHyKGBJJD$EYGoOPmQ9o<)miK>!*;I z6qtAIToF!5b4?2H;d3cI+!9nA{Y5}pX8EGQU+6o)ukeQty7q zZ`Q%91~V0PhBH{f|KNrF->o=^Fl-?V z^XHIS7USPp4hL2*U6JZ!pP#>kO@KoH&34PF8SM>IhuVj0(`fDpZ4LSQ(pI}qif_>E z2cB(7gF}TKC$SFuL&$~2-(rrb_t6h?$Or|?ygi;LF0M6!q#UxLX14^q(l#@XuRvYdkfbg$hC4%oi|+e6*O5Y zpYR2m*P=fS0@07&x1QsKb&A?fPw9zmz2c(}=_%fRV`fqnu{eyzFq|uJNLskXoOssj zsTn%@H`e`C`z+aW8<%&+RH16Kc{f?iI@N{H)oTA)h@~ZAl~?Cx;qA{x#jGybYyB38 z;TE`iO8G}K(}+1zmc8`V%DPZO6#i#a;@mK9NK`TUK~o%RQc}O#)VSO<{}in}&7h>- zn2Nul$<5E|{`4yE%`TmyHDjlfOc|(+0&pyz`Cgu0Wh;k!Ow6}DlPg)ZXZlp>mOHHIB>+w9nH)<~_i)i91+<^H_(s*>;R z+d}yrLsNKQ7S%cCE+KJP8o_?CUixnmxI+hqr~TrfyBR6QvY}rt4Z%Ow@-D5tHR^dj?S`3^LHFiuGj`PVwSudLNY?FG|VV`^2hQa@>3pQX}{B)9{rkec-+Vk#gwj6AlNV<9F@6 zTY-?$XWYTP8}@HFCu?tGuh{nSFz*N#zLmLl8eRk$Nn31gMol*fv zA9z16Dq7x`a^Ss|+%HX$%?P%l`o3l09C~J6`mZH zkJWCtqI~dozrzy6=!~RZ;bG)zvl7INULP9U>JwR1{^-F7}+ERu0&+_o7S#P-5#ccr>vA+&)d$C znTg2Yv22PsCp8nHHnfm>XTWSZ28OeFI{PPYe)jYn5y=G zl!bYdqn#S{(iRdNaK z%jThK*t_Ah#UYz?oUTk^*B3JJ<2T|slw+x&y0M=()Z8vuxQQQ3{ z2t($xa~v}i43%;q;}*rj=jHh=dhCNo>TtPro^@Rt)dzsR&~)v#ZrnOX22*z*$Vu<@ z(AX7z?LB~YYs{Y43MkIW1FX|!wGruqGTX}YFN{Q`j}bO(CP{`tItvPg^&ggDI-(9r z`6&trxu49 zW#H780CA~S__s6Ywe!u(cUJZQ#qP^P-71y02{q2`3aH#GyX8Rdp3lo}!|M&>0LQ#} z7f0@vZ$WGiAop8m~H1My`H_b#^69`Sr<*da-|-Y7S* z;T_U66->WZABHbXAYS{PGS!zp>#to51qG+NSfp8Bwk2)9V0$4m^o@6Ov}gHO`S49` z9#uN=DH`>Ca|OG(?(r}G(_G+I8KD0#`XK)UsG=0)|$#%eM2x{3yIYe{O7vZq`q@GPp5 z$F8-sswhmrD9@&TecWMX(pg!-G=Bc;V4_vW2N*@VYM*GppLsB_=mbzVa5=l&g(BQK z6W`)Wyk9m$T5~D8dnWh`5M9gL9m{mX0cOEagEx=Wv&X3Ox4QfSfx+{TqrSWp(14HE z1#(`J{*T{MvTcO=axgt!o0{M9>dbEM!o>}lOtj0Bp7j;ncKeyCS;W z(Am(tp%*zk=|VT0E0U@I6IHrs`uBB#>7x>6*Z|VDa(;pQYQBXRJ&)oiD- z=LHa?73vwPseSFDibA7kXG59mbynBDEGSbbn~ZFOwNebu^4(8BECbi%cCex!){57I2}o4 zPBsRKIDa2xvD}Mv}N`~lflNnB&*T9oe^fYD~=o)xOE1!D0JR< zooEEqzheyfe?Uh6{Oc!&9$_KSs8G|2)(oY$QzJFiPYRwL&F?+tw*y%8O)=M^&0g9s z?+8BiP|pE)XyV?ElGE7NEVeBL|`>mI1736AckF|B&diMbB#=Kyisu8R zuDKjz((Xm6(S*Szk7# z%H=1=NYE-$o%*wG`R80=7duWbyf}Q3@s;EJF!@SMc@p>Hb86lOTv|l-b zfm8Nexywt>|KW4EB~F%4-BOs|XPN%s0{(le z=<$Ka-4g!d&-U;?Yo`!+$hplBf$;wi26Qa|ddzAIFFbM|oNnp_Q9yKKdUopQ_oyX+ zgC=ITMB=DuckIN)LpQv@y8Yy%#yLQwy#}hw2vJDI|KK&K1fphBXM9@pkwXaz+?Iy~ z=b6U7e-`4OyZ`U{=h>lP<;A@<=e48XlcfbNxMhEU^~jsxM|WuDsAK`x`5$}&V*skI zmcV6t=C34|4MV;K3P~JWA=p%U+zB=Nvw+XZ4EN`O}u$FJW?=Zfo918wv6xVB!G}Yp7l1nt|Ff zD&NJ)J(jP6xKLbgIg!<@_|R7V9<<}uWXL1 zBZTGLbZ#tOvm-h8^2!IU2h4R8Fx-8=~R=-FwIT(pH9sry>ABoMpJEK;U_QO5lv0M2=ds!QjbWI6i@&< ziU`px@C&>sW<4lGD1IQJ1cuzMLnR~jJjVCIK)=#kWiTip$e-d8^$bXsHL(dYfkI?j z;~v9*zkF&ACoYP1enA`@Pmm#y#!N;XiFQuE^KM&`0_j28H(LsbkxmcCzd1E>R1Us( zj(42?oTf}A$GNh_{Sf7n05vNxzMp4NT$EB*I8_)W<8B|1gOfoEt@N9V(BBgWX!qi& z)_C2K)jOhIVu#}(hBLM~mcBikTw_J#vh4c!Gm1x*0Z_Oj?fu0uQg}E&{Pp;)ToD21jh2+RQdwYSG^2jeVf+i zh}1gI8XWcOI%opeW5@K-PfdKQyg#pN?-ohTmV0m8Kdg9BechBCT5X;?v=DvpG5EFJ z*+eyqJ$lL@!7p_2svg(C^a&G%h%^hSwi=tuRsbh>xZ2? zWou&yr@cQ5D*Z|J=hFQo!XipIMJDn6;?L4Y4R77ZJ^H$lv5;Sd*jK8WV)g+HVeHrF zxumaNaDLKX1a+FXG#Y$CzKve5B~?Tn%4AV*Z?tB!Ej;Q8z7dW&2WMqh$=;a?o;Ubn3rs}mZYcQeQ~qiF0R4Kf?EzEuJK^# z>bCKW?pzW9Law@OoE5u2Bz;Fe;5{qsUH)JFmHYjL7F<&Rg3W*6V~rmu_Ofu*U#%B2 zJ};j!{d>EQO|M!{#WYou=51XGVYXl4dsPXKU3vppP^8^3C@WtCe45Q7VxLyPMzu_k zKGFlVl&qtRSWL(Hx(&VEU0?%e^7*kx`sIPH@gSHV@O?1IGl9aPl^rt%`8N7|?@esG z;{;>dy&#=Wj64peT3kQ3CErvjPnL08j%h8f;xiu3an=TKfL8QYxr9_Nuc)#mxWM#??4r?9_M7>jt`Q)R(pS`HQ~nND6LdcA>-|i z#rcoK&K|^9h56O};09?SY-YIZ3$z$368`04Zufeb+PDe(W_d?-qI#n z4_8L+(WlbPd*wOjGUT+Ws8D&stG8`SJ=a;#HVLBcEluM}FY@W^E|xt0?r^BqTWLDq zRhxhAYJ|nwO!HI0DWr;0xq?z|2h_5u^GrhpV_(4~U}YtEIJ!rDrH0p*!96_dqE$l6 z9-DpD=*%Vsz5V1~&gQp^xoN^>R`s^%k4~-YA6WisjsFQ{th~N21{#O!Jw7Xshnb^W zAvP1n)yN$ow+Cnd*kw4K9_fl>`0X)h8J|#8_&^**GUi z`sSqc#nB9XZpa3Lq#`ihkF73?F^dKjRJHD@w^blB{o+Z%x6m}x|4R#hT{IxfO+A2dh?6%m8 zd6p{5&2Nm9HTXR7SB$^vX}uD-&lC<3z@c3kP-@*IDf@2O3tA|RX^o0ge#`r7g2j@B z^b;sTSLNiUkf*PyITnmPWz8rdm0r_RpJFZlR$nRfpdzoriH>&S*%_JjE)xzm+tix4-o$ZJgy`7-eXWu660O zyua&YY1#R;YB>t@ktp^yBQ;_L27L1}Y;R7uk-xiZPP;I@c^3zM2Z7gXB}zE(uFoP) zzgTlSsM9NXvir!KYQN8Rse3|&tL5izc*t;ip=LQUP?HOOqrc+0@s}|r&yCe8M;RAf ze3}Tr$RQXj?4;b5vRq}5&(^$Z2<9~G#u0J`HuqmC_*Xv{*;*71{}4w3M<~w(`}bZxNF z?TZyOVgwLis|s-^tEY^r(3a!4`=kmuQYeWF_7V!Iw%c%?0ro!znN|%SPp#u=e|7)G z;>9%X7YL$q^P>CA$=fLRg(sA4aPbfQK}ERKct8KZ0m~ujscdsOrM?BNP^#yrpbx4Q ze%ARC+vHv3up5#WeEKV_68rN#Gc!lO|4}eRmgRAjj;N7CPg928 zUWeYL{u0mDK2e+Qb7(ERQ@_Tu!=-|ykz+rP02VRxUc>9}OeTYbsEYEPtzieH3TKB# zwCrBBWh=`ylf}MA_rX&e{fi#RZb&N1BPIY&91rB7e z1IrjKu`P+p5(E_-$eRtg9z?QRp0oX0sUR!$7qB|t|o$G=(xyD_^G)Gx; z+>a8HW}iF!HutS9gj4itC2hyfu8&kbTUHpxH4RRJt_#yq!yn$*17o`GVK!Pn2!r*NN0!^IYeitRYu1;&*Pea<<geF^ zK6Z6&U5OXm95Ur)gWoZ>)9)RoXVc&e)O@^sIDNfvP5J*m$y69q1|af{J$OJZ`a(0k zIB<406L=s=0pZf2z%N@nZSl-G=_GKBA1B4eu2W?#I1l{Y(0hDx1Wmo9PY)zzCR z;+YiKnbrY0m%oUGGcMGPjs_R+rfN`f$FrKW6$LaTk9RG@_v0=c-bC-QNArDhMd%DQ z9GA^)@tv-*=DX51SP=+`8*s1IZUSzcr})yyMJc|(uz;Hm%QBZHd0}I-{*32`e5RL$ z1Oc7S74hu6@(w@#)cK~vl+qR;OIM|EdZHH|d9S3Cb9!6ct&T0i8^|sfsgI~`)fNCE z(#E_YxQIKY{XAWfxJ($Hb*)U8JJ#5bf9ZS!;@WbudN=1uLyZnBn+zhMon^gg$ize&BL%Y0e}#B7gm8@Kf?*!RQIB=C^E&WqCR*_~?i}K+bmG3G&HhtRnSf&5tDRp~ zzI!^&^TwZ436{LDfp(rrR7?slU;ZHH{8`TGOGd&<3eJNWMK*R%$%5V_?arpH%{_JX zpExJv<*$_@+rV(4h&FAZ$1sqA?Qwtn)%#|AVGz;4fMGS$gk&d;jz?^jW)RXUKj)|W z(7L@nTba|9MOejR*A?5dM`ccZ09^SXI0rT^Q0sj4);(n^9G^Z(eVw@H+?;&7Y}nv4 z&O%@QU_w&{L2~T}<0YBA{du`Vp1#=H`_Z|UTZ`^?>Ek(1emx?r8KHnMgZQr1T5+ z7Z>9=(#Ya$;Vt)TCh3a){8B7}oaL-l^Eqto)eQ940w1Gs}}qRaeqlshYXe{D2pmCCx+npXZy1>N}c0-m6qXO{O7ntO2Ff~?)?HC?mb zf%I3wKl~l`h$MhD)SDMw^`{<6ywms*2!X3c#8V&fTyPg2J{LwE#b4adi-P2K?&f5c z9hyNn-z*tYpX|MS+wCh}U+1>UH&d!)AhPac(JSE8t{ zzDdw|tM#so5wzfac0KS~bYt)yta~|Y0|o0|FSq{t>aIn zS-&T1F7?nIr*HnCz}RNJ3h^AWAF<)J>M7Ow-*meE?*2sN9B!f3S+Irj6Yixy2IZ*U zJ}@0ELfh>-GE*j2PN5Skr<%?DQoe>ZRIP2LirS!WH?RYIm1|q2`S+@uf?sn7i zC>yNxFS~Qo_{U0=Eppo<%ms4hAQ+ClkIkPFcJK)~oI(%aYKsQdJrop@PfVdeutf4| z5-Nbox7<)8q1&C(bL7WYMWrm;%Fgs}Q|gmhJ3^|cekae}qcHC7j|u>RUK~OKPMF!1 zD)Y(4uu_LXD%v*XqzX*Shmy&qk1IvdE*T7MBUv`<5iPqb!T~Pa;^5%3C*%gvVQGjf2T3fgB)NEJjf%9UTf$Ni(9;GU{CEvb2_L=J8k_6n4KI%{?WS zjlqc@JFm|lP;jtR8S3P`I{eyleYV!tpZ9Q*URVC%b;drgE5^T3I!?5K^jy3gX$y;1 zfD!$<)wa0i+3dmIf{56I?`qhe-4W@AZ(BcY-;KUYKm9wu*eUpqyp-M0^`G{_XRhm) zWm^bEUVm76vh~AJ4Xf@_1r(5W4_L*^x;w1!mybZT5HipihlSZLd;g6>_oYk-aHO?2 zT*)Ku5()L%sd&o+GRX<5*ix=Y4A<<0uQi*4ai>d{e#HjAjBWP(xv5(RO9gm=!4+7VPmYkRh}{!)14YYQr2 zPU#oQFE#QJ>ic2PQ zyQ#IW&(0ek&t9&=)oiAzjHZb3U+^#%n^R~5$vE|z=oy(4L*J%5_s-MAW0DjTD%R|yGCFa_b0xJxa?ht$Yl5({Zu2wsxB;J$kOX2og zW#UuMw+^ElD*V}LyS2PH55T1gCIbP6;6FPOf2UdOY=@oMUlN1fy;5VdwGazn;4GZq z_6iGvsr8rQLoDGiK<4RXpJndz(^%BjN){iagUe}GkO_>pw?~|_JXVvYOH^%JZE{ms zyaTe8k7#cw(14JZb$Z3vZW%Q)SiNomTCT6AI#Px?1$b$r z@Id&nF`e=9h~)*}?SB{Ne;4P^{rtZ>=l_|A zCyk?n%&`;vhddza`jhAWO$YeTSAOM!5jFr}KVvF>IBqf|C#VsoAbqBjq9LdI<|A`NaX zWW-#32S|6MhRA*S|FO}osBq(`Sow4k1@J!WQ03t356hYotdp;KuFpgc+oNOOkG#{! zD_aQ`sgJuTW;L85hbxGb&`ptRTsAL%l4V+X-jYyP>x9*o(ui$g4nutrso8mdNDjvp z;Z2J*y4boM;;rh8x;{#&A&CMUNTUL~6%wQ1vyrNx3S;YJ$3P&8BCgJyP`_V#7i3D7 zmB4N6t!#fu=(85(Q?LT4MN9P7snH}E3u*Ux8{I5;ZDY1MP8Ca5&z`sloZNIC6z-{a z$P-`Kbk#TtEbq>_#YVzeI8*4VQxp!4`%g#{lk;Yq>jq%*KCD_ug*8=>bRM%0u-%PoTaxxc}wqlhJp) zbI~`v^ispA3FAA3fL`pLuuZ1gdUf9HWvW(^sN~d`ZQs6t%mK+rr#(TRhNb4#Gw9t9 zHa%I{KAXLwpgh7_E+^YGPQ^s8ky_LswBgiFlmj;HZ#mmZ~2eGwkX;?)qn#IH9UAfYZ|n9K(GR!^kQH(s^l?fAfp+Ix#QQ zxiT3pI30uvy?$?4Qs{D>ZyGD}Z06n2czK6fq1ji>Uy2PfOpx#pU zT0!ZYEX&)!M$Br;Q$+Ol!aTNZ)$abEE`;BOb4~aB0=H+hV#RbIa#Ny<_spb z&%$tDCJm!FA=A4k_oWL_;R!L+S&a(cCtXuZuMX|Y=}AHI3?0cB$gsAGvt%!`u%4=q=v%-%_!)D1u=t^L_r6b72b^SQDU!n4D$6$ye@cVsT#6FRg`-(~jU40+`22(a@m^T<6#sH}(3u;-Q;tHN9?n_*>+){OnSvX@Q5;zpb&> z?pDq51fS|*0~&KX6f&sCeH%5wvHtv$P4-#bY1AQz&s7^a3sJ5wpn#k1p$w*5}M4r2_%QhSc0t+rH}w)1YrZcsvv% zCsiyLQ^&DI+J>}CU!sesJOJZ32$7`H1K)|ss;%AO&h#`b@{ij3qwP(i~)GRygU&@OOzqm<4B38y5 zC4=3pUD|t97Rw)SqUCpZ43iH~_O%?zKGilVWnClZPth`;mUFP}`{maoz>ddt?Fv@h;3T0uytszB;@$Mwoe(GiYi$Y;&`} z708Rc`3>HS+cp}Ku9-Zv1TB&K1DDH`>86nc6lNQ<~xH<{Q(_%}e zCW0DfGz8TlA^eLvtc3{FK2;IYnkZq*8^5aqrkLt~$eDJy58jb?9eGR<}J*SH8dRzLm0zn{z_yx0*ZNjiFrb3YN?aTMaW2)n(VX5Kp!RYlAy879u zb=iK=9pW{kW&7&39nM=X74|lKhglrMcI9F5f{Eo4QJQaUe)3H5*U#&kNTO+KAUCDS2F@;^5+-VjLp8V&r@3+twggVFYJbT_K;;y^+cA5nP zVh@(a44O>fNz|+(ZFv(zNLy&a65-pP*mQ?pe|EWsiRy{_Y9G-=X8O)^STq)CxZ z=q(g!p$8QK>AePs)X*cH5R%+KvpchMcklT5`bB>Tep1Sd zi0j~u*B5&evQ+k5vt+NzhsMoR9u*Th<=zeJ!j}*)+B_Q8E54l2OxlSz^r?gpcWpxC zd1+t{gXL}jtD^?U#P;aiE4IsTp{VtGW8rzLeMi6rwv**^;2ywK43$;6tv4hL*Re_W zU!=pg08{ZtP?b`qM?yM8Ek_Z&$J8pZA(Ip~RFao+cBt=lLRCz4L18z3&uYvE-tV9i z5XhS{F(uMGteltfYDIyxz7q{y-j5fIkEQKHq2Mf%P7IREWpI`r591`+oRpPOe!bjX zAP)z0nM|^$*o!ajXxLM@#4+CZ(E&972II7Ledih02W2WdJXTTcXu8TK^xKm7*1lv# z6zIsOd}5RZ_v2Ofi=n0m+P)j{>F#NS)1P%<0Fo{Rbo7gL?PfR5#N~sZ$JBeVU1t47 z(o{WS?Z@ktZ13Iix2U=9_)I`!v%0RTGrt-9-Jog#f2(oMj3VlfvaX5t7$q%x8H&iG zA}`P7{{X3zI#q-Yz@&2>1p`Otj^D3+M~#sbwtSo&4xh8u@D20{n_EVE) ztdO6T)=1l18d$~4UAKnpGa;QuJNrXNSqL+ctk$M=iRzXKyZ+o)Jte-bA$stl=&(U?7;V-o!*f z_dY+hnY%avDVaY@H7%wAAB8OUo3cUI)xfv0CQSC9a%u=Ew((|Yd7-vjf?(5AMC8VJu9&`~%o9xcKRG+ee|QK)JbcR32TmwYW;?L1_* zS@xj{>pCS7@K;DD0F2#fpgVbSHd($U&TCPg3O}jv`M3{I$U4PJWY57bEsF$k_!av%T5JpI~|#Vd&tno2H5x(cuDPrg>f#tmCOG%qqLsnAT3=wicVz1vPg zf4Z1BdUh>v>z24>g7!vFiuXaS)_Oil)PA@&SN;Py6Mo))?U(6h|6BT$`~6Qt&fPm+ zfZZAE3<6|s!ct-{VOP#~dt5TP%1SYI6AvKrafBVFNkWQi{o{({n$;>g$Aqfj_8_-g zN;9Y(pxFP@1~3oY8Ipz`Z;aSTcx?P&tzDtIG|*@n0L-zdOTImT%)@8DBs`K8`{<$M zu-SNaX$lkvN8vxZnmAZAaGy9c&Ap7Kba*y1qc~m;)|8jL9G>`7A_nbT2H zg0k$f)|zgv1n^!a>Nj@9?g0q&-1P+JMV;OQ6+wKJ%7p1ovk}U1@b`+fuI7gk#2C4d z5dXGSFN}?;Xf6JY1)kE~Xymh8sjH8zIXC%BR#!IG89D@;KH5{17PmY*^rFxMw=Z)& zMz5lYV%{*f{iWhdBlpJUJ?Eqx*V_6xVCtG!Eg|UBJP^CoN5uv3k`TxaXu9L|V^Zz? zK(d?{wp~PPF$(a^p}t@XeV(gRz|8k2F%8C=D}A^)IpgZa_mO4Imi8KaP*^RZ{fMaO zvzXW5>IFKgBmupuClCpKAQvoJo{K)enSHshFvm#g-&O<>Os-Vya|m=uDii@N9~gk& zz{st}rk*KPh6U(Cr0b)#z6E5M8NaONMFl8$GFLrsWW|FOQ$O)tj2m0{l=m`E%#K)1 zHksC2O1F%$mqzpZLMXe@8UHaXa@*4LeN)YJlcR8n?@C4~l)&-Lp6BK?h3qGp7IR-& z9gXul#`n~Xl#EIF*sk8CLD>&78Huk{elv_&74uqn^9oW&p2yxI0=VJ}YlnIOtgDpd~L+Z#2YGkrJYhrd$anyc1~*o7)2V-H%iIcJI$=vGHvS&k!% zuU9RWqBsVOlvFnhHM2fnkw+o)*1Q=H8iF>#WrYfs$GCW5*Qo-u+`hd~+NBtO+ZAs! zgah!%gYk+-mkIeyb+OgIBGU{3ea8cxryr=}C!#;ra+9QIzv!6O@r-#qzsdB1k&Y@s3C+fDUyGyXHgq(Ff4g9__cHO zZD)*^Ocj(E`IH!?V8Kvfv6Co?qb&n@eru$Le)DW%SnypKIN~IZB>`yAxiv%qW;xoz z*jRy-dS_?)DT&ql1L%43>Cp8SkheTJs}*q;L)q!uSJpzfusW5kt$`-i`+;sDXMAB4 z?5MIWJ%*z%O9c_U4&RPj`7AR{PWMN$-G%=~g>k%&MKp_YML96DS40h?Y4=torK@Z= z$`r3F(SG<8&R-2kCbXwju7s`r*b=9FR=x8Adcwhzj8jvzwX(bmy+;Q*4(vT>H$;Nj%5*;vO<&a1oH#S zOudMw6bktO(UWa+w}j>Oq8}n9Z=7@St~ukGHH5=7=W{GN!8ca+xw&{~w5Dxayarwe zl)F2#br3)3Fa*_m`n29odKU|Cpp6$gfbaL7QYf{0*OI@fqyY|V@MqW7$gFKpNS)hc zuzz=LOzG7eEuDAG+@?yH{^vsfoh4AmRIdv}GG$sTnFo6e>xds9_Lxn0*!E6vO6L=A z$}d~IX$OV@`V@-n9smZIhm_}8gLTtUzg#!oMm^m*EY)b^ zJq?9_0s4o*UUmy&@rLE<@U|ImN}$b9zK+h3=z{l>eN6psY5+0qAVz%Ek@q*vwz{K9 z>PaP|W+4f9Kw052Kq+mD8W0@?0*U7nZ2qj#Ra+ z-@N(IxM^lr%&)# zBrSIf@Qk6BCY!oapY(8*K`J6BaSt}XH|~h2btcI;oBDZ<&RgL<%-?~1qlc&ApM3fI zvH{}RhcwU5B(=sP5z-CmG2$)kR>IyX^PtXtONG8L9~NW@lbKH)kqr^Oo0JkA6PN8% z(^;iA(kiDT!1!VI!EwV%qO}gce#)1`!Gq3>iy|66`EX?XHdtk>4EKJsZ~Lh0xKb6b z-MXUFXA@B_l>@3w57?dv!*lNq72k!13R?2rBC(pTCmNCuQ+oNU^k(*snyT>RP@X*` zlryNDVRDIKrnF~qUNDCmV}&Q}mKXTT1ysJf`s*qB-+wv7@yoC08Pq@ZL_Zkdcvh66 z5)-hy(w+=E4(7--KU^N7g5_nf%U-z52qJ!7BDFR28lr{}CkNMf}IYm>(K zx5_h=3EZjQ7%T!-s&g(upSEYlkuuPOR9=~!=FuMtQxDrqN(mb^*si$Z^+`_USVxE$ zMt|@t=#15DSS2WB;e9`sezd!qo8Hmad1?L0!&DeUFdF7Oe#0#e>kUbcJv>y+Ys)Ep zjEj_8{i+TkD=8{IDpYu*+$|_<>`>wMX2;QT-qKmeSe!u?GPuUSWTKRHs9Gwf{NYF3 zm7Drf>p!ex#d}NPd0aLCys9?%#<`fQvsFU4m?11A*{6*WL$<;vcq-a=-^P*-ulwW7 z4{UmPK5N%f&;;8DZJsU7M>1;JyKa0Z`oZcqUTz_JHKB}TlE{^5;P(wjFj<$s-faBN zH@$uF`IVUVFD<)k-MHHE1CR1PL#-EY5R$-4)40u6_NqchVi@m*uk(;^UXnK5NF409 z%841(>taT!-8gbsyUnq1ID+Pd^3j>IhM6#$jo6z?7tp&Lxvr1qHS=;FF!}4`GJKfj zC~YY6-n>rgQ&WF~~?MO?s}Y>?>wce zb^Jc-P7X3MOK~ir@9-jvyYr5((bsts=Uz{Fmvb<8A?7kSzJ1>-3Goh=N(Y}FZ*+N< zJ&I-%WSS0J$tlo-Aq!Y1c;xJ})a`LKSXjbvS=wRJVmBf8YjB{+llSD5{P8=2i~ja0 z=zOuWHAMnyu?iOP3JW?ER)$W2)+Y8Sm1*!6zEhVDeE$9~{}NT*^RLe3+Sk7L;bmj$ zOi$j;CUpOb%juRIXio#bKzz|-e|9tpyyaR-E321a&p(HB7&`y6kb=E{1Ow9G)YhSI7F8!^)JCR$~p7!%6gm9 zq7TSzF{9oe18S>Vy|-nhe~RPFZlsAI7XejkJ#|fz zG;v*RV5^o@Y^i1;pz)RpsG^+X20w;XJX{7>gMtoaE|O;G zY-}c1pD?fX>_hVdnvd@ef&{DPgah&uj=>mP*ZTetk>=x0F-^M9wE1p8&yxs*Js=uM~FT&qn3Ml%vfCw98J{q2`B6TnQ` z4vBSrm~(?PCY_fBZg7Q(Xn!8^G4@*(t2Fq7{^PUKw*Uy8kQOmLxZeWQD42EVsF;em zv(>Yoe_KM**O6AR=?)6l=38jfW`~bAc%iRX9^vyKiIZWo##c?t9pz1r=lk<60bo=Og8BW;aKBqTHV3 z{ut1`+E;64eG7XMy?pH(_s64K3B6CmOC`!kKf*_#JL^N0_*YVusXF!Xj^trZD!glx z>J8ln8;88{91!VK=kYJxQqo!6G)$ zn)Q!E=`&-2sfu0Y_FhU;ZB7Tqa>Dc8&yJnOohlU|y-(~6icDeU5R5elZgDX3ifUb- zzbD1DX&ze`R@>i%l=Q?q1?x@eqca4^(v^WramNaV#}=A!oWkDM({Cy1i5PkBX(x@_ z;8B9*_lF5g}QSH>3SPII~7{P885uk#uG{vft@lmVY(HR2O#30aES&T45O1+a*d}lqo2w|(-!6Q%MHiF0;o-pj{nG4) zq@}yk+(WWxK%(6h=HT6t$KvbtU6GJE>Lf;*F`5v zvdJ6myk4DL4poonaKE`oWq3|8xuW${wAmMPyUs5c@$vaGVdtptPpw9Oz5KGyCG$N+ z5#2lKIQj6#Ud7%Rm>2o<(Vopk7k=L?@gX{H(o?*R{IHiGTH4~&vm~UHr7O8bg zWGm`O>Fi^Iob~jDQ?m2j9svnKMCnb04+xELfmqwMGJdGE+Cd%%;P1&(?aF=I?JZa( zn1uP?MI5~77R0~|7a4B(=%?lSfRL$52xRi741XQYYbHlmeUH2Briv2Nyr(fbR*A7; zAx`*-RRQL?w>NWZ^S3{(GyI^N;7+jEh_&^{<-yr=cAdpJIrO0-&3C(}ikR3L1@%tM zf3Xq+O>S*pi>!I?8&~vJa(`+#*p3OS^EwgCKvRddnNp8@uJvx0LVltq+o(T9VZw!REjfDYGOo1%I+3*kB zPC&2iIEXl$1h#*e_xqX|iu}xM&_j#0@p5H%5-{o86BK!{Rk`cs{$nIzJlS#g(OmV; zo+Ng1hRBlYE{q67Q*GEm=_bc`dvKv3hS^pg)mNx2EBcBX22U=sbL?g&aiF?kyYj2tu=$dE~GvbYh@v-g%m4W|@6s3!KM z_a)LEXd%m_jjQ&`tJ4HcGD<90r<(^nuFH@mzfW;E7w4hmtjg+9(U8w0lWX+CF!_BA zKx^@7{niJftln}|2DH08){i?^+I>mTDYgf-6Rh?gsICPU@7B33KLz{dGFC`D?TjlN zMIJ0Ez>q?cmA{g7_K1YY)}vy3`Zr4Wgh@Sd`|7AOnjX$`8PWP zW{`xJ#YL%Bj5L5OFzuK{tijhJm|`Y=5I#Om4nWhym7)ch)!lU7>KJm8X}|6FY8kt? zL2u}=bQp{^;Gs`@y<-3w{cIRP(KX^cxeuJ;_xjOfN;$HuUP_#IUZS|DurDm6wogpy zoBLhzOkd1b1a0HJ>yPm9t3i{;Muq$;%H`IhNs5(C`wHKzW!L)yohYRJBHAxp&dZ@r zg3NPny30)ne1n1mgY2IVnEM<$r)bm%eyoepVdPk4^D^oVfGe!%q9S@|2-nq4`x5&Z z^hGJhYiCMR5-yr?*J9ulO5Q>rq`zF5$`Ok;t4-;ntFvODxtqeJnE2XOr3P6b3C4UO z1Ya}bNK#CT63sLS3sJ<;dGf#{&i52l#j8alOVPaux;(ZQNOpmHJY8?=v+U3Jq{#V( zL8XrcWAArPnBKG7x%Xh=f=gayn~In6vGP(Yj=l1l5O^{##Tn1&k!0JT_O0o22$&0L zdkyS#8B^OAf?7(JcghUD_Gq(7L!?0_sqkR6O9zZJ5`qr7Q@8Ap6d7#AOY2uVAuV3U zNA4PTAVpomh+TpJb1LbX?8<_>2Z!ObZ1b_qAY`)c_`26JC)N0`M7%jSrnV$Xem^b^ zsE-uoE#?WEuiO~h6%!sCe}jp0B_jQshd*S^ju=}WAmco>coCk(&E9isT_|j|1`{y8 zFqkpLauMfW#+Yr-*D9aXm)O-Ns9IwdyepXtV=t+5kw=N_(9`^wmpTd1u@9JG}Dp(7+u|<5f~_yu^c(1vyrl! zT?#lnY#9rcx9dr{ck%I)8o+1-suiBSw(LR&^6?(6ulnLx;?>!cI%=n)JcSE};q8K# zZ$7uu6#Ts&vSFno2Z5L7#LvCh0q5p1(6mNQz$vVbz3}&Tl_Url+&rXR@Rc8N)sX)` zQiRx#IrrB?IEVgl1!#p2J6^$6;L(&!r>}4DooEu|!35A7bsjyjrYcp9{q(hP6iYeQ zU&&f{VBG5&IA4;V4lC75rpMU^8isY@9w_wgv-urv<gX1b9JS?}$quc3*paYekt(R>C@Fe0H@p!7M(82XYSD(ht^~8>Cw}zAcIXS`}Ym z?Hzdz;)*vckBzF-uMwB6i`1k&ugnO4pk0;59{F<8)!NRv{B(ER0|zQ?KJY$3$VoVB zS28Ez=V{BE?(jsPc3L1QhveRP(3axL+s<6JGTTB2QkzTD&2nlBpP;=oU*$&8P8OGb z+u5q2U7<{|^El5>mB*=tRgTo|9MP7tTpm~BFMdF^N#!soET3NyJpR5g{nxrL7e&x9 zaRj9W0}Jb$qEf4gu@%=Y%g%H!p1<4ldorwT!36nd(THJKQ)jcF5OGG2&Oi zywwFpLinyP$U&^qEG*Zjyj|SRrLCn1Z;I3$$<$3*A$ZjkpFmQjd!NfK%%$=B2b3`! zmBjRsitFcbSv!VtgQ+KR(P^SbZ<8oDyxdx1L5Dq*KigH z{1^BF_^1)ir!?jR9430gK~XaNtU#N~m@m4o>*y)KP33)Ur8@eY#~#+Zt{G6Tt{8HK zDck;KywV7DK6RHljX^c+y>bB3Lhyw#xj`n&9AV~u8Kh304JVQmu`4}+wb1-X28WrW5f zjzz`g6iv|m=?VhZjI?XF3F-_(`6(_VuEjaVi%%=IV2AG~I_o`8tTpd^D}(P{OO?PQ zncYBCc|T_pHId!NXOIdDJy2HP-Iv{*oi_;S)TGlp3KCz%)#upjf|W5B9N^^#8n@4T zq1grp7QIsY#EhWyN2X&b8`6arymWx-Mj}7-i4!ay@J^hTD#|Eg^|*h9z}Z)&+z4Gm zX~lsIe0!*aMh%E zXR{?g*C0o}hky(97pTfEay~BBf#X)8@7d+v>zHkIn+bxy^pC$cduo7 zt3Aqg_5!TQ3{Dd3uBvxXQZpT24wdmGFphDp44!Q?jCijnhaCwCNN1dAE8lMCOaZ_Y zoSK#Q!(T30rJC==bVVobm-) zFTD9wF#(J;9I*|lfWQ@4~>qyGjE3&Qb3lo%EBtj3VrQXfXM+Oom~yX zMf-cE%S3kAF+bv_U@rf^aOjA)Yt6VBDuHU9zMFOs;W}+QJ2|yje67&Kf#|+J#AqiS z_%{cA>x@2iw;bf0xzCe9x@S{1{S3w}-Pg1k2ED zstIbBXS-K&atb3)0Jq~Z``oM<(v^>Sp-~FSP04y=y1)ZRVP2%ESF@cUCs+|Nzq<{@ zzH!2vJ4)z-p|!B6_K1{{xGNg+>_dS@+GTYRR}jxI?-ntC+%-O6)2=$7=j31~4rYj= zb(WB6D7FIN-`-+^oR0@j#Iakx_Rh(R zrzSVSVlYo9#f2TdU0BC1uw=V;c<7n$MHv4i)TSCJaAK$%haPTpQUCY=c3NGZKR~%m z*C*@yjmzR2?R4bLT`Y|qLS|l8msD(rP402B%Xa5(574i!k9f#q+`F`#$%F>X`LQ;N zv}yqWuePanDHN}7NjQ#*bJYM3xtt0)$ZOCq+|vO&3aGgYU6{FdLbmQ%`QOj1q4w*c z$K+A4vy1zuMEE12N!>1>zo7FMY9j@spegGDb;ESKtmN8`va zym9QP zx&U!LEyF)`EwiK!Wf;FRtlu~BsgjCt^P1U97{+QxYZ^M(37N17ZCoD~w7!GKSs{=` zmRR9ck+bs6sPTZS82jv*(T=7YGnDVQVz2t}hI^MUHDBC?(kr3oQNOX%5T-0A+H4f? zPbN|mHhhDXX=kvsa!=Wt*(v@zCEndyo2 zhq@*fm)UDLrV1#y&Y}_Hwy)9i8|^DL4Qgy}MUci8euK>^%E?ygyqV!ws5WL~0=vO+0*H}d__)8uv~O?Bt#8fu*flSV zO9e|bj8JiV8Fq!Zl5ZIh4|c6iBC_g}!!J2Mz4#YYdiV1E0s6<(udk-XeBUp)MW<%9 z_ZT{-X2;cePG$LYqg)&}d${}WvWG<)#Tp5|f^*&cHx()a>7*ywHO5ob?msEcQVecB z-WHWzteSZJbz(!1@{*QDWYQECjBTdPk(r6LtS#%QJJ{+IZdjoLF|vU_NF8GOPEL zqp_t&69jtxwio?Qw7=gQj=D387dzCv#Olm$>8ko~5^K}U#b^RKg_zL46>@p8(!-<$WA)>8Fnwbkka+MRuL z-gJ~m(y49Z8uUm0^ms-C8IF8Q>75C$2GtT9Huf6`2Z@nLKb(LT3LSx9yeQI`VJ@}o z1h#tH8pq9DYj~O`zw64CQ2OQ@kZBv$6ba|#tD>OUY$Onegjj8QEGASqfBLl3P2d>J zH2zRWfq}xYJrZly^|aKpNTj{4qG3dHSf{(ozZK;yPEVZA85rxaTR#|e&!x2S#T)5L zZ#4rSs#a_DtJ=bK%Vv&)IchQ5vaJEg1rHE1GTA`9;Ml5t{p;J<)VXbj*g4(LQKMlA zs@*@{v=ArJ#PyY-uM`EZPQ@B4PHDsR>i12AqaFUncXbCy=65c+Nav5U*VJzKl{S}} z`*rws-1!^caO0I$#2ZrH{&%I4xi}u;veKn^;C^fl^B`jgl0#{Po$bdyLiO)jzpCW7tLf3 zD|T->{ek;<6K>-@RU%*+>7W9$-w6v>>BfQS>1#o|#@t_0bQ90m={*3Fb4ptK$|#x2 zH28XX{(7nZrX=-U260+(B9PPlT(yA$PhKZ!Z{vn2tzqX%;-r^9L1VajSt6zL{m6%( zsWz*2Cx(tLdkpo|5YZZU4c8xKR%2oQ6JH#}FhfIzUMv^wb2DP1<&C37_g6oU8P=h{-2(VRRdF($daZ<6{r^qTQ(?e{4 z8&}S>R<$M;Wb5pLm~%CU5AjpJC{bYt&3lm49Z!t?dW8I6j-DuZ z0RevXUbrCY1WUaFF_(Q_0KUF&b~8Hm`u{`G2Hsdi>keNn$^4r!=iOZ&jWr(Eeb_AD>BOU2eh zo>#U2+SIb54u*y8UPVBN8o15ihY&1#EmmmljU|En zm*2MwKqX(Oj48Spkve!0D+o0~U{us}!2G?%>(i8gwnv8ZBK*Z+X+`Ob1O-cLl@`Y` zIcp*C2RLu*2-A+-+pdl(k!Od%c(PTrB%5Z?B4=7#>wqfjDi*X=G*4gVoQV~1vs^rK z8I}D0D;4W3l11vfIECiwY9B5sUawCAJPxG0SSoliR_(=NG%up+N7(ho?N4d4h|fMe z@XEtlbEct9bAulP=nu)A;w^?XOC?GKbyvBv)ih1-98XXz<CO8e{~s8 zbe#ToQGc%PZyjg3a}1N6R`y;AsI*wZDI0blx-oT?VvmPgg;ZTXR4?ngpzg+(8#n-C z@G4)NBq@_rlB|I78|9ljJvhdz6RUJyg0B37&joG`U!L1-8IXqW=UFbL)l@R2-*XtO zvO*=B#>fsEfEG%t-HS`t5O7Mhn{_)lp>)Ue#(^T6($T%pofVAPihFAzOKX?eAiK8i z_w_sAno{!;KyjYDTk07?@*ma~N#rmU@Af9VjX2!&_t^Ju`lzQK(|<70*#%J$wsdHV zVs`}!;S+j>3bT#b@)D4{vu3H1>r65baqGuCBNf!%$^?Q-%iaq#xb=BWW5p`f`Xf8w zl^jGpTBpxz$K&uTHqUH~g=u}=9rNw+V&2Si3n4baOfA9(#?BsI%fdm1Ay{>0B2k54 zQ`+g9=+-yl^2GSyjPSD?rRMD;&(_v6F*+{6feiXrRy{quiuzK-JBpv4-wSr;Bq)PD zs>N~&SN-CIF*|pv9%BGlsAx56?Hh`{l>1;$eO$UFu^K~mL*$T}`Q*TJf{aNLT&Jk~Ws32hj* zcy-&jRX7J3=2~uT)a)gGT@72JHI09uMILxiUbJdR9C@haIUxBiE@Xn|nL{^8|5Fo! z?sUnfZo@qOtEj@b(!bdfzr4~s!yJ^wITY+c`xn9qpiN%EzXw!0)$Iwx7Q=1ju~56Z zlH>Y8g~?z4it+wPop3Py3Z!P1>8bwqK8_2}WhYAKtzC3kEv@I9Bfg zpSoA?UnljK9{%#GUOfZG z|9(gR{Uf@}0OX_I@?P)1*84|->#vWbi2+uBZeqhs{IC4#zZqVC|Go@y;FRJ*Zsq>{ zi~qAUW-eg$G!>XS`=1_#!}$z*J{nc^|N9pIYn9@UfYmcUukjf8?|uDwq$gW=HAsJd zK$kf(?$pmt)jk?nz4$j5T-M)j`R~8ykDty3gfLT_h5zi&PPLzdI>X*Rdb(Fd`G5BR zw=JkE16SlArFY?{r>c16{y;xRL)yELzwYDzvD^QT1&l^-K-6RDc8a)7y;h3MP+m`> zL#1u}6X1`-o1gEU<7R)s<6DkXweRn_PJT_Uv9~G#OH}e`F{|<~ZB7G}t?1X!)(;CM z9JZ_K8piD9e{zo9BWFx&UbwJMRu?c`2tAi=pST=%krJ5}Q*36xDE?5$RJ__&J8(Eh zExXR|{-DoKWU~Ns#r$ ztp~9Tmz*(=G=kipxv9#Ev=C%oh<(=0ezmcVEAGTxavKj~5m9?^AW zr1|`-IPyC47w2#H{&GS8qsfU4)Io+c9@*B*en|VnHN2XH@2cn8cxHUH(}3qD+p{XR ze?0sX=WxM>G13RVg1=IIEyVjH_uwDrjPC#!yR>T`fzEKh{i zQtVRR$%=2ahgViq+)V+BX`<^Ke)JptM4tFqU)^yz1qH~UPOk`)38np}e1*Wl!C2)- z=Yf>`#q2i%f3q3?{m%^hQ@~s1_IQ)>fX#^QuYAleVkLmKkw4jN1z-)M&vvKE^n`^- ztEBt=^S@K|glQX!$3#{NJ z|D&(!Y^Y}07eJSW&;O6;|Hl;vpWJ~|19QjQtjvcW z_4s~rSi>g=d+!XY-|DeAgL-7Z|HGyHsq3P=fG_AkkNZN(UFk` z58pLRx+nqkOA$=D*Hs1TavlTQjmS{d$g=uJ9XUBe?b?SVfn;q$`_9VUyf9RTPa zj{$^Qd4PWCDf>Sj-2IIcIU#m?jGCl`g?Npv&0_}bvS+-EfZW@Na=;CI{SFTUjkGH5 z`+t^-rAvVPc!c+UX5^QzYE0>mYtS>;Zjgzc{D=)~d)OVxR&N3vYy+7l_R9SjwFz%VdX!Uj=Sk3O8! zfV*TzNPH|c?<75Ps(mH`cF1KsCIo2mY9-wracQ1+NxADA)(4cPxPqSrFCN1Vc`fPL zp}TKsD65V@Phv!|)|v!r_pSy&vvGQUQMmU0qoo=kD_R3g@EyX7d@p^LpN7(S8%0Mx zT61k!DDn!1KtAi5=)A0 z3}u6aLyuN)9d1XxZ+ThL&aWfL1oMzq%?Kh401@|N94Yh~8BG}%u;Cxs6T#BQ-Z zj5N+7u^QU2Q6J0dyTCcaUwyYHReA_D?P5&CA>h#Kee%RapocsUzsQX5a;EA=j7HgZ zKJ7T%RdzXpG-tp6&zjP`ccNYg$fP%*PWdB{euEM99eb6==w zH)elFrK1x{!>XG)_PoLZM5LD_UnR8JKK#te~3@QZXXZ&5N zgPAP&CA(RBOZmfd;^Djw1`xZ6WXJuF)oFL{qc17(4PUP^dX_pt zVe#J^8G}A{EU6BmaaRukTK)L%7|32uuF5IFs zOhbe?H!8d_f7ayH#Chl^lpZ>{)U;VM+cV21( z977Lz(>?2XJvXIETC_=GXQ}rku~t-N(b054?}X*XcvGa@Vw@{hBw&_dVMKhxbdu1E z^ujmcxC@WPA7y}EekbhDX_Ot_9W%=grD66&RlkTYdY&ly>^0c=@n+%^+T_IpPO#MC zFu9}ijid$qbJ;iD$#IGjkIEMX;=Y%993EQUr?B&;+A#t141zk6ru)YLBSZMaZ?ya6 z3-dEC921I=AwEjR=Dy`#tKvFFrrW_B@Cz43sxqei@y=@XJ|n+xcQwCexOTD5vz$7I zOSwwlT&2Y}#d*C)322o24jp$wl~#}Px57xO47CG5$b|G}IXc z@ZWk><;mleVh@})%#zHHn)Kss7Gb{e5+CN^ZEW+b-kji2%kz= zMGD_3i94?d>jwi4h7De^x) zn!^ZBb(VojnaNJUGLyTe$$KKfE&TcE4%=QCKYl15nAEtK$I28T?W6Hj(j`Vx_{MkZ z9r@{dL?BsEK;sn_VE!$OC;WAqEx$E)2{%u&`Fy{OFr+O5 z%1!wjc6$9uTWQ`?_P`IDaJI($b3FgaO!1Gi&6CcwHvzhuHx4a$G9aM)!L07f1LR$R z!14m<+^6n$1ukdZcFF(vZN77zO#%v_z;qJq?AQBrfLH}+WL4|YcpL#(*M0t_I3>k$ zkwCy(3`uMP6%)C|_O*m1&J)Ye>-NlUwD<|?B;K4g0=wAeBVZL+gp5}aP&jx8=JiV3 zsc|a=GWuyKHvU>{zGk^IYNEC5K_Z;I2^mY1eDdyErLn-Fk^s4BcMv&KJftpI5?ztZ zne+Zj4gi}TwJ6gneA=X7l`VWLy6KJwq2!T1!0Q|r_T~>YJqU7vG4V1y76{e zxtG|uV$+eAwiFM|*8#ym_lVIC=8z<=2qP|go7Z0o^V6SVTqUH>G68 z+7SGFHn{Q1cQQrZswJdpbH`Q>63!ysDQjqSikeU}`N9MIsYJoVd%F4x;$j^GO(&o$ z?BjRZKa{!mZ+%CKR0G^=!-l;5je3m2+nZLcjK&|Q)4nK@S;&A_Jn@VhoBla`TOC3P zZ*zeHX-sLuX5MxXBL(5N$_bz+%AL}*|Gn4$JWqxt|1hmlqj_1J5)lm6zX48|zjEKw z*Cugqr}C&vUu`zyIyt$6J#?4xbQqu{#Hr4Z8!^v0%e21|T-}k^KfE&%3%Zn_I*H}K zHFF-|XpHFt6w~XQo=AbxCR8Jh^JLW>g4TI72kdCYPWJfC{1wpUN{sObzTXTUA|m|2 z6mq_4rEQO=34gddk{2@LTec8@pJ`e@-Z{tB{xe%q_J^%VFVRv71ct%C2N*Hg(CrR8 z>bL%z=+~pkx9Wo8HKlck9TGo=>us%(-yR${$V;R`c-{Fo#EIkx`m z4p2b+D5BWNA{oUd)|R53oNwJ;Y|s{Q!>*Yu)48BoR{~}g#Rg0lLy3^Lv5QXE4MPKX zj)CE7=u&_zXL7K)W8+DmR(NS~tmxHU+;LqBvhvA-j*{Djh|Yvt&pR#3WuEO{2-kGT z*GjQ9ofQRQvSxQhB%6%aszL5+PJ`M$G}IX&wKpZ@=Og^a;~!7pR33F*`{(B%^aMwb z+*?QmUIus0c-VMYi5d8>qu+VRL6^;ZS;hZ3YjNM}#Eb}+Giyg>WrqAZcK@V#SZJD$ z9;i84u@ws)6GAO#73Sr?$S@5H`bV5W_XN}^xH>J`a2a^HRu-)J^QQYGLk~z%JSxhf zST4j>z*xGQyUJ|*hfe)}*n7*cDA%rkc#EKd5({DNDSRD0s=~^ zbPh;&cS%bQ-CaZ107K2p|MGsH=ef5&d++1@@E*ti{cwM~;JW6Fb*^*8Z>@8kzgzJt z&j9|H3oPToNdsaPT?rhfK$=L^A;V0@oAMqOR^Ub^{kMfWRSJTzYyY5Y75=3U^#6r# zmGQsJ`E_(|B?iNVA!kye-FUE7sm%OxKyOx-e$iq zEtR(VgosQs6NSTfTD-sI69Ai~0!H9m0AwnRmJ*~1{=-;5M*@u| zxxEv+CoQ$ho&ECft#2ZxB;eE5sWDk400i@kmi&9Fil+wtWE9$xfcqie(o`H)|DGNG z@D&7fds|X!N;=T2;35&u@6-O%;GM(&Iyg`alVYNlrBoeGt)tz0UlBeyn5y#+ zgnchQhMlF5YzRbFc2=kQt>={r^9NLdR7Z8CfvY#wYANT^*hJDt1-6?X%a7>O4QJzxFXQzZK05kC06Gdp1kGMtsXG@`Jcp zq=~4dE#3)`Wu|lnU+CtuKjP8g?Ng-tTJ`trZ1EPm^<5xeVFGaOOSj)y6I4u!&pn$L zxPXpZq}Ho;?NtQANqiH|MEL)NbYIB79bVn!8>qczF`Dzmd3$&~VZbz>e3bh{XDIdd z8%7jr|H&>z&y5IQ$e(!Q_eYhRx3KB`6NYn*w`*O>yc#uma{T>_Ep~eaoq$@sNn!af zg`WK5+P;f^@AXU}PGC$JqS4`)etqMCmcI(mh99FK2p=&m+<)C?Y;|rA9Z`gyssix&HM@8jd=NlZ2vwqe{rdYRr(?jSR?8qFCy+zj9ZT; zsJs>{^p8s%e@nJ@u*t^JYKx%_wwneVr<62*we-}o$0?D|IZM%%ARRa+&s{xA`=b2s z?MgsgMTNiDtsShfr?Xn865$6Awd)9n2%ku_5dFa`D=k&yR`okc|0LpoN0Of)tNqoF ze+;`@3<5?2&&D2n`5&akA6Okfr684w=u^ zF65q0)~D}`&~#42n?uXHN6d7P1nf5PI5Sfzlx!xf!n8j6xKNb9_=Uk`nj%myFUg>V zqPCfOJbqzd)<#hHcsgQd4veWHut}J@ZH}y92qTqe`tbcaIJ}~3fn1&03JCrcl&kHr z@qs9340q3Md zT`ucf9_d4HH%<+8dSninU_A8qxyvLuLZ`tC~-h!=^<8KT}BXM z40wSjG27PpY~w9Ll{U6?oeC8}^AwgNS+JwjSnbrpIq&5J$2X~06E&7q_87w^ks#Zq z8tR5~BOkGkH47J8;QEy{Xu(9VzBMu>lk{SI!y?~5;3g153ZSYTyZ7pL<@8$D0^<}b z6!RrCY32J1#AbuMx!4cYZ5 z$;a+ItVKjacZX$~Dy!HNr%P`0<#1|kqn!J4eP*@__^pq{)SewR9)FLvk;=Ay^uI;y zPZErB{LB(OJFNax)s|WzU#7@*MQW}L$ zI?Il4t=BsXFTQAs952gEKB5!Bc9h$M3l=@}O|=-DbX#jMV2q5)b%Pv1tYSzlJJD|0B{A!&Lj2$Uhc_|$zB*Lpa^Zt4lHDOun=T}Zm8 zMK-e+n9}?P#Wz1^94mSi*0>YpF|AC9fQ<~N*dg_A`6vYXZYmMfz=7+#=Y~Wth_a)i z9b*2>p#QdVRO+#}8o#COFB0yc?qWQ|ZomY%r4T~(m+^iIEW7rH^{0izN4+galw_wx zQPwet*5^i}FBqL3T8W{!y6XfYrA6kpK1$bD=0<5S8lbL}FI|^;bUV&{R1$_D%B9uK z=QB;N`Aji8^PS@$TZ8Rc9~V#b1L3jxt1V8>KI)@mWK&;ywLz;;EuU28!1)@_g{)@$``A57AkQN{-2`2+kO+`f)YJ7#VIoj7~P% z_d-=yT93E$={D+GyzJ31-c*YPpB1kZD)us@K(b0x?NRNXYu?pEJ^F=~kuRHeT$@l` ztO}=ljU{WUJnhj+&a6}}wTnO%9SP$_)9g6Q`HE6y)gKRrSw0aqUv>q0pT{1^?bfl2}TY7f$vuFV)jMwRkz~!jOO&!5VGgkKD`4~`+w*$x|kNY8pILXKnC)OuZ zdgjvenVLs({s4ku4}SJAte1ezlZ{K+A)8F#m?G;ly; z)j8r75KWg>5xQ|oaf?&~obg^}o+IyyU@3b)%DFR&)u%V-9@QtywZRn!F&b$?^uxVGOb5D@u%+bM2 z`cBeiVD^z6y2mKB&fblC@SBb?6D7Z}bZQ^u919M>fBwFtBAcE+;B0T)%#;e^d0m129}%BQmJi!iIn_Q0fiQypKAEY;ovg2DO~A&HQ@(QM`b%lR0oqF)XT!aSSrAK-MIEFhmi3aq_&E(O`fllC{mm6v6Q5*^{Ek#G0p zKWdp?F)!N2IccsVpVxdY+S*x5K5|cqrC#XB_f@j^0uF8pJylezbou8*Aqi{aY`f1T7wtSi52UPKQPM*tKEO}1fWN0{HI}n> zmu=Tx%ENii`sQNFGuOdZFt4*jvV@SlWlcL)f(*7H1)pL!JNQTd@|{f8L5|w9Bxjgi zv7So8Ih8AJ--2T>m40k%UHBBQ($fUxADTlYDa7OXjhD6+AF1nizcy`1&OCvD5j9%2&Pyt(0Lwv_cJo^!gMX#HOOhSi)aJ6c1VLN137#vdzxV$*A-D z-_`qFfQ+?PR90N=tMk^K7*$}d(*B(7sF~AQew5p^Q>CrTQWNXNh$_z;*E^P>3-Bm> zy4fwtLZacb!2%Z?WjDgk|ks?8@b=^DKN=%c=T(p7nm>xdqV1Rx`@TA)$EQ14|icZ(U``nOswDUZ5 zt0i-yy*E={t12)#*|Qd>kk>SUUPmi82UvBR>wffmq~D$Dfyc}UJ^k|UVibS2H&WkW z0j{Xst{M=Phx;&1cUxQgSRSP1PwTXN2#FM!2U7U!57NNTH}#VvXGd5Rnm1mk@K`_y z`4N{NsAJ@)HhMx|5%ujg%wriW<~!Xp@*xAtohiTHBNe^&BvFT*_^UxLRi==4gyUNK;PQzh`7CIRBz3AU&&Twc2UJO~d+=>y>c|v&lg7hj3RB`>U;H)>XlWSG zkA_L{T^p{-^|PjqIgS_R&Q-NMt2l9RA%rwXUpO@xss?5}aiARc#kbpQ_pV~{VQ^kO z!{_RnLw0fqXr$*M+^s9({8{vLa5~eVUAQNgRE)X+O_Yl zM{5nNa!!Nk!FzIyCP&scv;Vkf#mv5EKd?%=e8`zOI7sLDgdrs3!H}bLlUT-EcbmZ* zpB`6yhAYm(0$32#}C|l(6oge zm{3|wM1p@$M|As2ibtuu!(maKW-@32W5p^=Lr_h92~|nz7)a$7q!|E$i;E70kp`!x zKjMp%F0yXo=F%5vFjanA>TvXAz(T0(7jmLaH0wwymX8XEudK3ss2GH$+q0B5IB3iI z1acMCahTatFlYSm!Fq3c&pjyS`M_yYK|`^L=u02EJUpNpi;t_MNj%>!~XSP+=kBU7_lXESTaxBMbcq{=7aX&K)3a#E6@*eM~_h3Z!#;orRr4iDV~ASCUNqpOoAg zFa!?ksH57(X9>c=y~F4S@W@s7>Tia^**TUAd0v$&vUD98BvE)YdR1SbEyXCQqVvId z=N_ucLwb1Pw|HH0lAFv&99{=j5II)4=^Cdk^ONdU|LnqD&C4_YV92uwr|;_fmrbIc zFjDJeQ{h^5>;Mr!N^raxB4W*v6z1itNO%Q{ZL8Lry|As)`j}U?@b!cG&Kntt&x+lt zEG86NDifX7XsSGm8-J5GFHHpG{ocU+XsXuK^_6<}C4XYg=SL$PM^=y0_P3RCrVC!x zB4%pX;_1H%k_TvgrzXLV$99vW#Lh|BWh;L|3+#l?2)I6{M;F;)3Gq8K2bIG3i9`ao zxoqalZxZ=<4~32A2Cqy!cfz1<=JiuWAYA3>r|Jg zt^)Oa*WN zNHV^w+{!8scX8g?-|8Xhk?GzUd(d?U)oyUPtlZoqna}<#;P`of=zlGb#&$-vrn2(l~YIkHfv)E=k4TXk))hn1-0U27`Vla8R<`bbJK{4j*mE! z83PH2bl-k%I&2n%7s)3v^eCuH#-{N_rnSV|#Q7#53STM~OvvHNT{@zn{GmrmSU%U{ zGj779=8GKG$)gGT`il4!+Wxa{?yDj%_U9sR8|{SP8ty4xkkCfN3F!3X2kvQCO>Ro# zlQ0Q8-H+dBbu$xQK`OSJF?G?{n|k>(G5yJe__!6u!snYOJwa`6tKU7kzuG%GZcpmN zV_=5MK!3`5_y`o;1#Y9ntn+jx72&@cnK8H*lHDjWd6&N?C5qGurcN8?e;R;&a z=AV*Yu(l7((6|N{;m|Qoib{k-9EQ;w_366+_Hse`qGcku4<`VSFQr77X(>$vE1_h9 z-i#f_T-Wz2GdK;FSQ9pNQOiPuU;35Db_T841f~&I(k&jE8f5HOwk-rC@?3Ni) ziT+9}bNDw2x}#V>DP7Yx<gpMvEcEgq+=h2icnlG5RCp5C48GWC+B8Ed;`OSOe z@?}W;zR?=Irp4SoYWu7#dm+@t^6?lrMLNGa0t2LK88g#*#kXtpQWs215B@52Gb-}a zs(6&RRaRK^Ibu?f)434vn zM>v2~TDK8gy$Cx$O&r0P{t7?wEVFT;LsMv$5D<)*3%(}!RHJ6|r{_Z4!1`foLLD%W z5v%@>XZA!Lr^VtkbW&S4ops(gFhOsLD7$yu{zy*}qqc&txw(ABTT$*lBiM{PVB53R z6@!!#MHTw_Z$1I9EX4PGlH%ZI3#g*+>szo-KHu$|W4RnsLAB(%7Fc}L1QO#U%Cn*s z-8yXcm#GYUHD!MinTf*3sfoqq!JEAYmj~?0{bl#JfV(Ftb7~D zyykY_z4=*_G28j1FG@cS&j-G&I6|3vnja3^OU4MbfLkEzGyi1&pQ)W7LCq_C}MdNx8JTTL#y<4312{9%u-DYe% z_K5_4reJDrVBYccU2t4x=X~aX&^`xA2cI zx%rC^>IbjMrdY2PTtab2Q1)F_{a($1htU3@Pxs^xKzzLg&bLYWDP0DBvKTa!DD;Y6TYV zhhXi86TC|SC}EdPtWe6H+f@9eN5$-{W`V_^z|2|S5&335+jNVqNLAVLOM;9bQDi#* zHTvd9327kUQ1lD)`__vhZMy-=K1dre>yVD!MT=;;G-KI-In)-XOKIX4gXpPZx3PAk zx#>wlTj!2IR_D^*q{wYADLc^=8`1&VBJjMkcLotF1<&3n{M|~qlElzd*pz_Y`Pr@d z{xC5dW**XF^k-vmfI@f;?|lNt9^wEAPht4l0Es#mEb(oVO<3l7sS|vJLXAQfFH@Cg zbq3rtOocf*9QsTr92}@;_wg@-!j&&l=UFMt>f$@^tvAB^n3$b52WJVUtnGEDaIN6> z+!4HLS1ye2BR6Rodn=V}5@-Hp;)$Q#*<1Kj?PbQPaZ8K-`&=>XvB5`H$ER?iwf20_ z)n;T*Mz4!iKTX*=>5Y5e#{(m7s8hgLz+2eggzKj!LY!@E5=gJUCpJ&FGjm5)0VNjt zJNMkD^9`8ThZ>{s9iCjxG^_34G1g#ar&b8leij$0|3VyYl__z%T5gq%f5d}Wvxo${ z%o9?Ika|RUiI=@oQ?Wa5m8PQDxeHQyRR)+*qPEDC+tU&Q))Clsc{1yTCJwURIVwQz zy3ur5qS_fY=pHNQ@Vtkx+VidA>gJ1H*d*ZuKz%30(qU_V()CJi7v1r7XNIplx+uk1 zWJaPGVuDk8L>_*^6Q7<}^ewGe?VnB|~7tz+fVN;Hw|Yhb;kfjg;)915nQmoVnt} zqVay#hnccNXYQ-XL!wF;BWeFDz8@rC{WRG0ybtnx)IS}G?5E(H3(|*57JUEM)qLTa zN{LCVy;#jg0m$?jnqvP*-kod55C0yHMH-BfI+#gG<4+I=M`X zAJq$9{tj1CL!Yk`y#A}e-CGV?m3>nDt)R_;f**!bq7{TMueR$uVE#zVY+B^jjg}(p z3Rgk%Vh1d$n^P+bz5QFUc6t(ilDNL~2crs(0V%yOE6r2=j;?5EsSXedp6{9~*hZ6< zqn!(S?@TZTba^X1;>;c^{U)*b(2iBi4-)+TWxTWZy)F6A#VXX&{=<+J>@iOeI>mgg z*BLWBRk+yq$K1NvhWw(A`mHR_C?!;?`jdNE+mC02TPmU`@OTR?RHy;p`3hOT?0q@F zTuaibo)2{r!8o&;+q#|Jgl#5=@E=S-rf@2n_13KDPsV!uK@!Se>Rveb(#BbzRWM+D-#Gh% zlo;64Z?YF!D@~`rS^Rhr;P{uzw)c4O5efd*z3%Iviyc?WE$kXYKKBh4TsEYAIRrUn zcUKG{niNsJ!T>9wRfd2uo~Q|jB_rvKqlcwq_o@Pc1H&?ae6P{l zup`htt9cO|ILJ43*gO`$`6WJCK-MtbCz{Zo2*_Cf&@dg``|Nf_xha4RCZ24Vv9d+Y z@V{{GQpvFb!eToBI?pR;qB+>}jSRL+{w=alV?x%h_)%sTu4Pu=*AId&XeYDw@TMhW zO0>MYKJ8}RfKzOrHqMB~X7G(n%F{Iv-&yzF=oDI!n4Jyp^dA{&9%u9MZgs z*3>@kkCz7MMwcZOLR(CTL4Wh_`k~O_Pdlc_sI1e+By! zWv1-ODkjJ+-^wUuRmoSfY>`6oen+UY%O~&+ue?epQJMQ&qdh_bk)mm#0?MKjWW(*} zU%fRgvK%7MDyXB?letLBwiB{yN@=CFtHaq@1>b4ZxhCUQ{Dd{k-6!J(bb0*WF34yc za*m#i)eFRbL3%G|!gRyOa+(QlDWMX@r?9QhVazMLcoH_Eu^6fz$YyW$!u z{;u_dxpV!~Ua@t5ArS3}N~=S=^pM1l>U8drK{#r|tfjctiLoAiFt)sL zqq!M@1NMwmQ++BsBp!E(EBpGu7olC+`4uraJm$p^<{~#FlgwOdL_+E)CQxTO;iC+*(Ihs!Wgx))|M=oEs`Xd&1b98pm0Y7u>^J*@NTooD<|cQd=564 z6y}89qPL>LamRuR5c52fPS=J%D|d`>lxPXXb12FefcYc`gp! zT{!P{f)Ly3z(eRx^YI=A@2%?93rQfqMBQN&j5OR$I_JXr%PfiS zNk1!c4A>Qa(ZRT|Qk>Qui-3dX67B6V!_?z>MjtA8{lxYq*Nm4WvsF}XnOP50WB0CO z2I)MW9J-Sk5EAz=wqa)KiT^0ftAi|xiEF$T7uTL`A&s4F6Y19*E@11=)N^2E=auj6 z(|e}IJ;7Eu!Ncyz3j9}9Z5HXhfJ1Ukg6OlU+rE1i{HX6K9ryRA$oTVFjPP?;LFBxn znE4Yl@-oRWrFY#-mNRq;z! zXLq%CU_9syy4T}#^oF1Oxan=!an_UNpT2EG%}Q7~b8?;2jcwiyEH{oY?w+*wzjk=; z9Gg;HD>BWVdh>sG{%Eij=>7f;+rr*#T!WDp-OO%Uk10i&8^3cX;ZQh>c zF8}ng%Y;}cI}^kwXcx<-cYwcpPX;Z6wn1VP-zCwMNd7)6V0z-T*x2|17B`~*XR5zF zj4?m5$Qf`^v-*V||Ncnj)-?$!+5`#uKT+%7Z-EY+@orJ%mCubP{6^CM{)j|Ud{E`1 znF{XTb&w29e#@G_lHtD>&HAvj@*_sh7|JF_l=83N81IO>1LoDA@E;2NhXVh1DKKa;_|)RyD4@9E@8tP4tU}gD78d#t*T1kO|7Ap} zvjaxm*1DSe-`HG(b%4z^e&Xu-H}6%(fcJT}qS1fX!G8wu9}4`30{^!tfZ%+Zp2d*W zmvmRn%B&-F$9#Ne3IX9Vzh}XSl`Q1+ae!J_8o86*Wt3cg6280Iy)C-#sU{XK)7ePF zsYFFXm#q*UVWtp40SOwFE|X4`Of^1r?fRNr-@f=z#Q4NOzT>5L?5AsUWW`Lc=kfvP z%vP-OH$l*UU-nwt2Xbh8m-dghwBm1DuV%ccEttQp@q#vVS`;KOC@RjqUR%tc0`LPa45@wH{zu z`fZ@~>p4T^D=&CCJkBkN#i~76bHqLG$r8VyDccfKNB#f=yVWz&-<)klvcbf(O%1tw zT5(u5X_``7{Rb;uGHeR>CmxHZ;$k)HKoEJ`V}R0;Y-9NiX2?_jjy*Uw?Xac4i)CYI zWI-&hc?nLt(99R-Rl37&ku$!)ck+90L~h{es5m|=Gh#WQx$mtc8{?Lx4+aanS{qg$ zH;>1|L?~d252}CcZwF#e*MBdW_g;}{<11jfAt9yC8{6}%pX0lZ+rVwA+Ls_w@6O1q z`2IWAZKoavXZ@nCd$+xk#~Z$XiI}A(&VmdlsM~?Dc2!edV~gwuUg~O&mEWew%d33@ z99HIDrN}>g*8%@Afi(-rE%;>wgGN9L_tTvXu@EFgJbjU}z#8dI0@HTNAfa@5hyubs9`4Je& z-3Rr*e<}_5ty;(Hd$Or)fCDRk_C!3j78ufcFthTnJM~sY9MD3Cg?`-k=Rp66C#vuN z@O=p&V`1MX6@UAb&EuLx+c$n!87xzPmfEe1*Rc9Yfk|m9{BBL9b^tA~zua!cUI#$5 zIL0pkd3YWJn*_Vl_E$=Yza6@Li{gG`t?)f2;GyT9C@zu3PgtPVsONXN$Ibw>z@hk-iAqL`uB^&*7U&OTmj4kHi)q8PAV0!(eYAL_6G?4`t z&_c*i-BVw8U@g~QWdQHPZr!4w@GbpKq7Z2v10<9N?}cOc01ss!l(DcAewv#_S}naa zt{n(2`<~DnR#T-?L0Wa16Ay&!4u@eLtS8|eLe3T?)>eC7i>T8B~y^VPX-Q(TYTqLjM9P6^coqqMSM zsv#;xTGa{9o#kdPen=fo=X^OljYFnuMsyf=T)WO4i*K~CXd0rfUD*xHT`(Z}$x~04 zP@l7*2PcbkheL_rE}8uXT?cKWDT&fmyxy+h85?5MxK1Rg?^j>}!cdQ`?PnXg^37Z# zQ}Q$;2JBlO=64*71)mT?^IwLBI)Xh4kMGRYI|XBs8nh!*WN3d`*&H9=cef}W0(UIb zT%AI?<uF-W(+Jkw5eVS4)xXv-&`Fc5y_{jP5rjomV%vk8VPF+zR)-HuFn6gtqzI z3Ydk(F3wim_S+6KzlFGN-}k>f0ryyjR4Cwm1Mp*~&6Ld$s8pFkz^d_$clP5_^hEfyNNl%XNO{Ea z>!Q>K2e%Yce;K_6ukW{;_{t3z4x98IYQCb)EiX$k1fWoYsowR|5`}m^cAtZK#N&W# z(5j?^!s|vSYno>jkHa3;?@wi~R8N33g_=xG9S}$v>Jf{naUmd!=ffHL+#Fslc3DD~ z_bn(Sl@?s)()er*#dWyvPY@BWmc`d?m^-HNi5=qX;H3S{JhF#%ln*CQ$RaM;c_BA9 zml<`3qQPs%I?YT}-E{Ea-1)LAmX9J1v=m9sdpJ;&dx*UGvZH>=+?~AQO?Ay_Tv%^n zA)493;)Frv7l~7mApXTa5I2&s%M~VA9^OAub)je7aFH-%{)yhGr$YI$cOs_Fb3d4i z#wRXT*aInI?60l~tDZUP`3Te}ybaF5zc%dnu&g)M7*RP9W>3u6xe2L%{xX76)8lG% z#u!>q-F3z07kK{KYFf}QFiWuVMAen*)c*lynDyMas0LNVWdf&8ho@fS@*FRSJGjt2 zTvngxjAKk0=q;$5DLRbbr-}pXT0;J{R_oCcZP#Xsh;G{QBdf2Mc`=07t;V~ZMGIm! zUP(ydQ3aO(@ZBKZ)}Qfl-|@Rl4uhWq6@-v=`Hpcb$SKZoJ^M_r`i8Gf{gBp7$d9(b z(fpB5R%!OETM3+emqHl# zYv1MJk;!*A#li1KybH<94yUBy-zx>9Ev$CyT?@|p!K*WC(If)1ke*F0hxY54`XV<8 zJ|=Tuq|QrVE=+)&Fbr;{MZZ@m+hd<;wqa;6lqEQY>Nh6Sj4kWYG=$HQ)_ivzciRi+>YTzx5#P{97aOk+-??D;%V5ZI zK|&9t-eZl20!)0mR>`V_VHazOW!@dT)n+d%CECWJ+F}Ir?h{uPGY`E5I8ey`%-u@O zhxf#$wsp@-vkIOcc%3R}doOrk8vB;QuA)YTzcuXC?vi~|>#9|}zp5>k!pEyxbGUbt zCMs#T@y6*c88h3I)8zD!duc~cHK(GNH%v{rJ%d?IE;1mN(95O2(kQoJLSCn8#%`sR zApMC2Q?=G5ipqV#-+lq6+<&dM`#Xn)Ad%wvnc%H?|1v=%kyc>|TD#ec6eq zAp?aw%|*yGlZ|vj9*Epvqi)pH;qoBV7mU#c&;96(>4m)_R*rCA&K-6M+G$>MCYa_N zHkaz1ah)SxDYwctEqypg7x4Hb_K>sr-U`S~a2Vc|KF>PFiGNaYRi!I~Z0bm;uJW17 zx6vI`v0>+nxZvZpaI;)poy1&qA@cRzj{{33F%QpObljIuK4qp5j+B?Am73-oqL#@# zi@%^E&XSsmdQ7vGprqM)DAifi&g4;1ttjDnYjEj4pL0-Sg6807$*=w#UeBP%b-hN^ zD`j-!(0sJxTpz(N(vYd)r&5wMO&zpo9+PB-*!#hOdx#(13{=yGE zpDbuX=y8ZaQ%2iD5;CY~_%_*tt2ywik1qnznWkpq>`vnkG_qnRYnm&cS|kmv(7Kv0fa2zoVY(Qg|X(*7bDx5xm=r~-MsL0t|W z-fudo8mdGjkEvOadIx_3&u<}ibVJ$ zZ%@n_rk<(U8jp1xWLi0V3S8Q;Vjiof=Wz%nvoJBe4CDLcUA>U|B^`fXsqH1T$0_-F z3(T~Uf=|ol*MWk0iinA-Go@H9yv9?z+RuL@`j)mKT#_+N&h$d$Io+J zCDQxEuzG|h7|A$_Zlf208|ZRS<|11iP<34*u&^*OlZglXmL5uWy|6%; z{SNq5+tvhsgHD1|o!;A%7LoGv#~Pv0<%Y4UT6U*mpnPuHlQkJzBB>jrK2qtWskHcW z$Ni2Ed(no^@|~tgp6R*$s4G3ilaB$fME+vJ=IN#WkZ2p-p)6YvMZ`LP7?EEuwk}oY zn?k(HTyol?vNl=i5e7$4?$dmsnKMJ-8;@99BuC%G?+Fy9AgvZTQn3`sbnxu~e+K~- zWiwYcwJ!Kj`{7qZdW|eab=zY0ZQjTzCFPS#)KJ$8xKd@?rJgHn&VEkBHJX!}neCMn z)k(jH#ZLnj_&Qvu?OyW5u9Q)xwLs=N8^4Gh2)Mhen%7M(52k#I)|kJZ+9DaYqi{`e zEA6v~VpPyuxf|KkXUW6l$wJP3o{$Xc+ZP2gn7szCqpcRyMc4d{4Nbneh-{W3^saK# zg@c~g2)?^w^VyW5@jeU;$^+%W&tB0)VPHk+YGomnz1F7FBIYta@u+W*OH=C#vGQp9fBv;gEY{~1f^H-sviTO zOrD`*R{q&2*#2ic8|O~u(!L8Qb2Q}2FJyUa8_ZJZx;w|(bX&osaW24I2D($r zcAG&3uyKI8MJr9#dc|brTs8C5g3o~JzvN{4PD_5TD!!Dn`Uf6AZt{#3#4KeS{IQnu z$6A+&0A-y;vxgL!H;<`V5~O$ga3h~4rZtex<>5U~YXeubzb^CvF{A#8(fKp`JzuNX zbv;?(d1`)M7coaAWN%n`EtO9>MrWwh$SspZ)$6<>=x8aTsjU0^*^uTtPiYweEt>O(9(|TM>237dJvp3D zS2hug0DLMiB_(F#hmdrZw*W2r`~mP>i?Cj@Y9$uC|w|>yD z$xu4g-8I2%oPLg_PR26}+!$7_EV5hhARgz=CPZWe^Zw;&@5!P+k`J>vvq%oGTf;-J z7N74CAg{=vy7i!R=@FB`UqZd`GT*z%+^*Ih{;Zxo~>uTN|V1?E;jE4cA`RdEyVI~W8ZZZMO$1Q z#!$+44P%dGQy(YSHqj>$j1zLB9j;!5iAwpT2S;PfB56TRD<`C$?=+RgR!g*sFvE_! zfLEV|jSonl5%YnMD4&y%hIh;*=Nf#WZ;Wl?$*vZHQ`4G$e4Cp8iB|Q8O}FR|A4n;q z(U|3vL@UNh@Xi-Cfs)P?P{_d4f;&EYxw$D_qzPn*mnY3JK~_kSDLIC=euspT>h+8; zbK`d5oqHM!#?`|agKOK6v#o9W%QTrN{`6-bWly}1cNSv8PYeWa|G_C#+|mr+3L>vx zKr1`)u6{#Qt2#@xRn6=^_uQGZpBfp@x&zedb^*$E3o8llj-C@+7@Mo#z_;8B=&0}C z9C~Wwp(whevS!TBL+iM9SRuN!LVjq*w>q>znBAdEqwonMDqM7|&Ea}nBxPK^RH@Ib zd^HndKND#z7c~6&Rjd~n6#Ka?;Y@G{K2I;Lp-PJhcux zkJf@IBs~7WFw|{5*KH@0Y$a?52O=e}W}uS2^nM;==Ve)wTuRK)-n-wVR%d(eVVUCZ z?=oN6K#qBExKOjcCoDgcxfB^L!~nUL5-2Svbt9Ah^V776g8?Rbw}NRzi@((LY2vW6b$PRNp|?&!eyee`?*U-<4)r7Nn!P; zV(TV#gFQ`619WcV(<8qVjV(ghn|-^cbBp^mSL+GWu@FnR>Qn>a47lc1h9Gl~JVo$k zPVxThtq%Jw(%5w=p3Fat#!O>b$u37>KezUZHVE)m1W-M!6jThX>UQa4;~)Dc4EXtU zyu)g@SS{j0Oup;@04tj#-fdC0i>U|h7ywcW!{j-ZU!yFd(M4}%2wi3YPCt0g$GpM) zQXi2NSL-wQRPZ*v?G$qH$^+WGSfKUpL|uNS+6$5DHJMR)y1+O->lx87D9jsPpb>!q3I)g4EUYVkd(hOufieT>0HNuFt?R$~hoO9?5K#6a!3oy+Zs zctjeS*ZLP+6i7&XV>PIfn;gg~$62R#_BrNQ5e=fgnro1~xQ}@iiw320mW+Jpwu~2Q zbh)*3At5E?vTTYW+mv?G8NR}|d>G_fw*4@%KTO473wHbSx*`+u5mT&XkNKL(Xjn8f z*_-|NJGXN0c9MrqQdGdr-eYYRTd%h-^vBf zU53k);LgIE{hQ|{YNz2f@I~KTH_O`H#eL~ISI5|%?wmx=qN7SIbxIy8pUIZeIk*_3 zMGi7?b~KeX+2zm%+?nY*j!u7K6Cq&JyF-aHr4^bk77k9n)S8awv=j}p8Q-MICp37h zp;sq!yg4OUCF=8HekARgg}_-W@gOySwAHR7n4bSn`kf18jQEPqVQLmTx zNQ?bwY~bpQ#;-!v=2k^ODsANp6c~xw%b}4j?(mFRPq-SGGGC>A!IH?}IPVt5YrK(a zYP>n`{Y`nCcyZY}+@EJcLWcs6V$W;2^lYUc!$z$va&rKK9Ij@zN_Wr<*&1Z8BP^*6XvLqo<=bj+Ml zd4XmtOXgB|9detJ5OXo>h8V|01p|g@gHLba;Rcw4iF$v&8MJdWA^(jhV>lDSyt`dJ zPEpz~XdVTAebKPr4(j}ImoREP7Bd^eb=+Htm>Fdr{oeVtmy=9C#zJRu>iedP>CeT^ z5TxMy(K$73e+lc_(yorDmC_tZjTd+H3$)s!AvMQ1DisF^D^0U`IPH>X&R^OlK@i*Y zFrGITqIJ2 z>}Dz-YJ6&OB#(=A839&-a<~A`juq zXA84~jv3ahp|=*gvP9S2UNJ7y584i&SF(0r5RL3S@e3NaVlqud-A6Uu$Zh!OOq0UV z^M*A}%T>^c)cu>`wp5esAa1Ed9Gz5FF&$3Pt7h8to1?^Uk-j@l$6_o z9nC0rIMwg4?>)m@uSq!MUaS7%^D!xULaG2byHeor1;%nP;+TZ4uqO)3ahSREM$h#pb_w?t`5*TlxL#;$d zamTsnM%&nY+Cd{nf{|t6&0bn->gs$X-(~C7te87m86G*Vn-5rz$hMiUF4aA@Ja0eT zY1kC53=73y`0g4!&MQkgNH1T>4I4gDu4zSKlbzpQg&IBrLQGNya%ot1TNoV?GN^#> zq`UOT=|-mem}wLkL4bWBp!L0ZeH}<6!_2-G^SXhz5NmA(4YLked)HnPj1EzKlU+QW zw&FdBiEJD}(!Qo{kyJ$-ZY;4YRi{hJakp!c|DU(&#KKd6_1iI5W&EANc z>ktSI`ByoIXjvIRwBYXWRt}6^mAZU?Dvc|mhwxN93OVwua~1L*&s?6)r5Q^jm_Kf; zVdXA88FhV|q)euDVd70jDbR~=z`yxfiBvRQRoKSpbli2>S{Y^t*c4;dr4zv}eiw6V z=I%8`JV8iz*@|Pg%xaLUZ`xgRj^1fH`W%hz=kHf_2-CSW`R`NM6EU4uBsg`Hy1{RA zBthH z|89*O*X+2le7C35-i1-6CEnj>8t$Wjfdf6Bp!lJsV~O&VMyq+{1185gSr?N+=3;W% zO63HUXt?)7Zy8a1TSkF&#XKc(G-Ct(=$3Gm=21!6*C5&Tp?lEh_cQnVUe) zBtMxnJ`0M^HH;bqRbBwaWAno38(}=@suyHA&gNQl{W6 zNaT7F53Y8!D#RnIR1>fB1V#v0B)+$Hdy&zGT}Dt>K#3C*NHU&gA9K{KrM$EGzQ*jn zHg!P~V=RT5GE8aiwcjjyzcLS&sK3&`WVWG3b8xXm#A*urSPQEeq-v-izA)BR6Os~t zrx#z|f+ijOwd@r9ti^-U%YLxh(aAt6RRv=wumXP|#vMHbF>7``FHNB#XJe~N>|$Em zHgXaQhXM^`dTMXAC_Y*B4CB>*Q>F*=?~&*nYcBzPdFy44EyM_OP2Wxl+{W@EpCn2b z9vTV>bo2l2HG!x4`1b_Q*iwX2pvMNC6GRoLn=*lKk{a!{b>hFr)*<5(r-{|(bKVmf zf7z2%7ByEntz3$=0JClyv})N8!cVm?HgbZnd~NCs;7H%mmP#eKSKf9c5V}a$FMUYR z@l4{j0Rxet&Fy3#tlyJQC?I+yBrRJTDCtl!Hcj*hPv|W?B+x-m6$u3y*7~<9OLk!S zem&HR(m}|~aw&v584yjaI@SwY5#lm~ugM}uGl0qFMFvincrl{KT%oP>fxkV{B&uV= z&zUu*5=P^hqM@CPzG$Rsq6@-qxSDiCVIeDu%djj2q2$)#4Y)TZCYDxP|6CRcy*c!l z@6e&+Y8PH2S9H~us3lwabnkFLk-NTrCzMRq41f|n-7dWJRl`T$TktbajDD`6Sv_f$ zQz_cv(2-Dks^g<)s9j^9-B??X1A9t-WUK zT>Ie<&E8)Ab*~3-^9uD$NaaO+8PyAj!vZ{=5(cqRp0(*4+Gj#2rdYmU2c zyv!4Mj4!_-4@62@HUsr)d^T!*Y;f-~G2)a(+V&v%#Vj(0tMQqK1upjrv78xT_`dI; zL%c4|G}m1FV%bmt_n)TN?VQrPmV3hU4-1%#7{$}-GmrVr6*o*JVFA1DUx_oO~+qYsKq015MDpnEy91r6zI2 zTWbNtURaP?Z5%9UBr|ZO+gz_&kW--JqrPYD8IRy`40UY{zdg(tNt&v$7*przINdq@ zZFAMCgT0Y5Uv$HFj^G8mvN{%^M!sgfQkc3j-vAha>!qFIsSO(6+=nfeE6KKA6kG{R zjJxGMjvi;sxl#bdlJ(NOCXV_HX3=B8%Vg-rP=MU34lG2p73<$BZ#l6VI}}>jce}g0 zIW=ON56qXZV)f=6)5{hh5;|aQr)7WCDil3gOh_P01X)m8 z4S42-LjHCHlc=@D7U+d{v+vEdb7d-A-Gau313ruOJ9MsEq2`Kj6fkNbe?b~wGSrm| zUCVmM0Oy=FnI!GBG5bxq$I2D&_WATB2+elj4O+xFw_J-h=AycO;`f2_TW&Ra8GSy{ zj$-R);qc0})^ai0O|r(di5{Cg^E5i%?%hT|x}kz$FiDLcG>frO5|Hn8G+B($r>~l+ zEpLCWjLo4imcBw(U+_(^CDe(n1GWY|!9d(5Ea*&Xq1`ZIRdFDMx@1wTGscL^594CB z<&D&s=!34?r*T~`d!@XU&VKeU6HR|epXvNccUSI{_ZP-mk{M90FBjV(!V zby~nhGSD2q$=E2CF6ZH2ZxvV}PkAm9Yf z+>6;&o;3|cTLLo@26sYfkAhDDQ}$FGGX!`H^n4&dn8Ah_W*}XO-6ksE$?ER?QcimR zG=#psw9gL_nO3n_E>^o)XbnVuC6H>BYcl0#4^<{yb4M}Qsx32sBFRXWb~u};`?1T> z^7ort!NrXv4UuY(vMZI>FdF;0BJReTy}3TqzeJ2F|NQTWtZhD*`m8y;Usfr`jBH7Sxa2*K6(6ohSxPMq@7Xw=xa zJP`C*VGE0~ZT=L#7$!07;pRBN3A!TiYrglRm)`w1BfI?>cV)^Qm7M1p;$9$;Rh2NN z&o;!VcC@70Z&8?^wvaZ}?W(ITFj+X5>eusXx$}F>My_^ZtI(bLoM3InnQEn3>dipv z`1EpXU*40+N7qCfy=e%CG1U}vOn;o=kEp1YApa{=CZ_n8j-@M$Xb}Fxw=G9f>b@pwhU&H4DNZI0A(3N`NkAG8iYzAQ?I7OrNR0BBjBT{=JkasU#R zfcv#tu@ld4jWy$J1aFjl5MB2G;JDnTgfl+|VfV7t1I!#>xqDZ^JOI2Ak%GaO*<{Zc z0iNA2PsB>>J~}lvia?{gUE2+<^BbO=()UF#y$hOdyBzH+TS0k$>;Fa1x6p#K8yPkVXS##wBF{ z)Ci}z&;9aC=`*0!ISw|7tR;EiWx)G>2SX;E3b_1YIwCkqRhbj*>dk$fm1g`Cn8vdn z-(FdM15nXYniBaTyOkc$YLnu(`m7~6z_)<+Zs#O;EZ{&3Bd$(gW+$ct6%8s@9{h-A4>rkQH*gFPq@DXP*H%vLO81?Yk2{}>fHqu zU71{5*>J;)I4yl9VXN2U$69hvxD%kMDF&15Y@7y}#0RK-3pm-kPHix_u$=ZETAl0{ z{ik>m-L@lM9+kV6cUVj(HZ5IN!L_I0T85&cVot`T2Z^9-M@?A`Tn?Tj+wg#w*Z;JH z@wI|7RykVAwQ}dKjC!j-Pg-1!zW4nfHreE1{;PfA{$~i)`n?yNv);U(NhbX&(2N17 z?|h=MBWp{w9DNsAbO42k18-mfMxXC3}?U!e;@s@asgB(qOKGohrn?a~x8 zZ$*$YmV&U}=#lQGa?BWJO6~W*WtY(B*q`t^e*s|0@5=rB%g6I3J>hzy<~=h$nVt>a z%f>0gq}!(k-i@)@<|=}ghPu#Wjc7C+FIAx&?k~CYdR-aKOg6}O<_F(2^~sZA{kg%h z9}Z?*k3l=P!s$`1C$(;4*^k*4_^d4wL$R&0L|y(`sxLFw;4f4CP>xc|@KM^q2GQ4V zZ}_zVj?F6Z8+NRH1;FfDffP~>IDG$6IA`tg<^y@=bzaZ`ens&FQ2gd;0BRO0(H#$C zQun>7qTzt5%=LbX_-O{b*v0Wl!ecL?(uNUT548l3PJPR{CDUH1pNgnrU>P3N>24CS z>wM7fY*+aD!lsJ)?j}1%Tf7hI(ftSMX4%2M@yILqeuL{kjjhAWs3C;(ZB{gYx^SBMtl4+~8webIVo+nX+VuSLkGfk~NvQiZagUwom=Q#*sbx zlq^*2)J=9ct6B9o%FQygrM%%_XJ!^h(#fjy((*<(%W&|r&tj`hmQQ1>Y;e|nYju48 zy*kyxyc1}#7ej8iT{ zIoQ9eB|i$tfhn?X0ATa~-!tI0mT)!rtENvVAn*J>>Ok_`>0O$@E^uT@9=LqG00KF7 zj=CtZ4!>3_$lM??E9BpPRJ)yCGatOe4?IBeT|9K6)Ef4M)iwJ=_q8%bfqe!dwYwk# zV8sSU>5A^!4bgBDg3*gaQLf}?JzVKsJPDz@bodXgP@t~=QL!J!GJgNX$HM9e|Cx{S zz%pE;44LVczdcfHfPHj-SD6$bQ=zoYf1_)c61On`6@Tp4tmq$m{ogwGgp(!X4sy9{ zX0MP@HOyqgb$DY(FZ3#+BP|Gesi~ zNxJE1fBFVl*Dehxp4UjYS)N z&|V(!rqIr}etwv|#cUY9Ee`qoxO^ZMG^4%iyoYj(UxEaAp!m*ZujeEl@6upbJM&{7 zf2i`L{4kr)Q1D`{jCqpHOufd{ z`TgxTn(DZp*Ep<$T-cn>iC6P2 zRuhYR*soU;>EJhV{`_VyU8VW?vhzo|omK^va$V#Aj$x4=j#DsqF8ui6jjS@bdQAF2dy)=bL!bnDytzdL|wlB%;Z~V(M%F!W+FC6#6oP_Zk zV^HsQe9iTlA$Z6m#nyXXsZUEng#3cy%S$Oy9fIL2$MovUc7iuvj74HR@p(y-3TecL zf|X_oYx)@_@hj&M%sl~|?^h92gzy%;mKPs?`Y7?>)4=rczovl1ZFwsL>F||%8G;Ql z;8{0ZUO1m1ju-{$Z7`BD#-T|nYDCcHOMsu9I2 zF+T=^51C$X1*p@|a^B>5IS5P)%Wgs2A=g3K^P!~C<>0#@xPN^ei#YaKU>YqMo>Av5 z9&&eE`3fQ%=3oHAioF%P#!Gx}+-2J%=1aQySIyo5s9rgQb{){A!m)6;fr8;-c7oq& zguaI{WWwhP#fP!1v5W>H5~O@!L&RurnbvLikQU2^h!PQ``du|B7Z@JXXS&Z8x^?tE zv4<+~lMto>;5M6*z-h!iH?!AOi1jGyp^e`fgZ5iJT2`#=5-|o}V15^G)Bp2!W%7^1 z@{Sd44YCHS1zc$N?#liV&!q?#Ca4>8rFsQrW$2IPitAAdoC&n9HzQ%}PYG0XCDdLx z*jI*d)o_izI_YF1-djRHNKOI~0(S#l0|z>AJKq1H7Y))AIw9-~XAtcZUC&e-6&gh! zi(j58ssgsQZuBsPhes2k^rsO+iIV`29zASfn2B(MI7AHF0@@kabRFKHZ6 zc0q=M{GfcYEKjcd#Jh3!9XGK4PSg(4PW8C9DJnA!lM0S4(+P7gQ;6yOFxD`MiJD0n zb8WmhGc~ic(c%=|Xu1izv5?8SQQ-tfj=fO6G;XnZ?z_x^DZ25+40o;igzqu~Ic8L$ zb>Vd}E@86*?IQ(7cxq&Yz7DaIQn=$IlhzY~Q>v-*xwdNA5h260+juT4?%a1+ckl1| zNZLgUM7>2#$tI-gn71Yq}Bm*ex(sFe5NQi04=utXK?842T~hu`C$5EZIH_vYxQ^GR>OV zb>%F@n(UdPO}akiIothJP` zGMw3*nVNQFAAU!Kr^Lp@(U5Gy!|c4%m1{2F%vr~7z z@0G)K+@x%zAA?Ee6NE` z7;Kb`ERB-TWPBZg{g$zV5r>$cgxp4cZHyv6XFex_(V8*CKxxqJ_5PbiwmMpW97fiS z&;0?@Uen;x(A9#~H`ay6ILDO76UX@IQ0QXl9O&6(bfOK>nJFY*HP5Rddxs$(3N{VpDUPs~f6#hZZvL3C6h5d?JWpHeGitTXgH4h^YZ^W_%)edNrgrR; zPCdk0%y2k%dwJE3X+(<(s%aW_Sc&&*ylTDT1+~%qp*7JoD|5Q~Q$$)oS|9UKd@Q<( zj!|8yrXZUjbGgN4^rT?DxyVXGw(ieeuW!_VpTFNrzXe|3TN(LGEfU(g=3du{qKVjv z^oe~_jY%{0)5chBx5|#v%!0LDwZ++dUXDAJ`wSb+>$-FB!LFl4i#e)gP4$T7>Q}kK z(c94j$uU-DGXpca#aoZQd0OROjXno+QgcPKeVR}T%UOda^Y*G@jJEIfQIJvgb4XRi zGxyf8p528>_nfAV*auWI;C1p5X%vTmJ&T;O0;)Nmxrpk`&c(|{b6!TzqQ&gyV!fs6 zyFYhHu<0loIp;Y=JVsVl?noLLIorIEHd`AjE$xz(=au!lTlS>FEw4MnVua;G7dhX0 z6oA=Io%TU*o6U-|Cox(1kPvWTaQ%XlBt<3Pk+(@zu(+~LrP#66K1BB9_KtC6Po)qh zQF3K)C3rgI2#qpW(XDDY?#@qkZ=w$^)zY7Syy-j&iUGaU=2+@7;dGtZJjtcjQkK%t z*D`O|@F-lVn*(2KFL)GMI$B!RtXOAk|Joeb2r+(VXmPc`;mCP(p2eBSIdw2tGiMDt zSoFD}yx_z?!aw8g_qg1UUCdbNekold{XNBmht}2Ls9=XRVQGhBfm7P?rGuvD`_o%% z*5aFq!?LC3^EXYY4HUb~2ZaZ=2b>f5^PZ>c1u@*kB*p%)-|y4Fq5H*!+7BlI5BO8C z=&-JfB1;rYMef-b77wmd7li_{0z*7&Zdms!x1xt*Ux)gK%(c;)&X9*5zCWnl4{WHP zUK|}tN3x4$`BJZkgh0X7EuYyzEFK7Nu986HY$5W;GqY%i!ZV#q(u*zg9#13kP#r*w zr<>?8eW`}9g4T?F31M{kf}Y`R=k<%}PNB+s(lR^D%~BOTySfe!IjSXWC@)Kxh6G^QE;Ofd5K}xWNv0*%i+XL^p86@faAy0AR>Z)++t_SO{5|zLm*&jqffw0$3#a@ z!~;)2K)_|AXTTvR_~~E8f&aLPjO^^JI6xprM@KqGMmkFyL(m6yc6Jaw1Biiv7Py1f z*4e^N$BEX$miV8Q{JS1OeOp}{V=FsjOACU>dUd{7+S_px5j{5aU$1}mQ{Tz>zgx1f z{nxO70fHW{fIiUCgZ`^-peWblSq>RvCw(&&L1S}Z&VV*}J}|Q|aQ&mee_Z|JmmMxb&~0T%gCX|Bt!&=S2VG zEHKkN@LZt(S~VVc+86U@z(V2~3rZ^h-+-7szFuqr9~A%m296>9)#GcSdLSV9AVdZE z6`UaV7911D1@XI&mqs!#7F~riMP*$uUS}e}5xpCSeFMF%2^~rHj*>`d+nWIRd&B=d z-A={@GfeB?pa(jl@4(>V{NTK%ET!T7ydFaw$>AQi=UP1@I%)xJn>Pd$9D&y}AHD(v zUa5q5CU}3ls}6$yg*G%aDjx*o(;slv5c~o)+ia-MTz@PGhjWSiY&QtJ_-bCl;j~G1 ze|^5M1gIs4%ekMip6>@A#MdJ@R3=~HVBNpm#D@uYxjG!SyqrqlPORchY8>7%{Fk12 z;UhppL$l2{mKO39?ppup2=gKq4&4K?m*_S*kiB8)4yY0&d89VKvpS80FY=(wfPjl;lJ@L+$v7x5nH!4C-<=|F^1 z__@{KBREH3gGJm4DQxvVb!eHf#l&-A%9IGBIj6P`_{;Qu9;{vtX=Ar5vA|ssXsJEL z9C(jpvX!Yo8BuQUO<|rex5I~jbj&Xze0#Pdyhn=CxgK6!{0^zyzG@~ zx3KeBHR;yheTutAtg$*C_2kA8^!D~9k=%(KG%pE$Mr0qC%7g5)@2kl<2RcR{n29)k zKg2v`fmx>9g6@)#zmzJ~_(zMH+%m&1AQjA2tVUs<4`$);cyKrc5(UK1?Gb|I6sS)> zm)$M~*A0eKKf++JWr`=vUSU?-+iFds!Lx-Xx$hV#U9PB z*8lSESt@$*2 zsOxW+R@v_Hw`PbT>%CfQ+_{b5;NckpqCaiYy*G!k&)!uW@_ol_i zi&>*Y$rhUN2ac$Oqzx8j={r;E1 z-qWC39oz~P5(|`|GF_fddAUBTEx%EHRVw8C7Ei7-8+jZ~qdID(*;S}sowcieC{~s! zsy{n^ykbJ!02{~e^T7^{8>daY$NDeb)Z}}K)E$}yRMG`o=*(m=N5O@T>(iy^Xo~2(b2_p70-rypR%uJZNQT02 zQuIFGH>Y^0K^-3sM>_=Uab|XCq}En`xpWx|#lgQp9$A{tNVwx!g4xN4Fu|loPBgOx z!_Y|nh$+ucn_#Jzy%dZ+<<;qCl(Br5IDic@E_**p6~iK#Op{C`d`%^U_GkXfFy&fs z7;=&kP1rqd^(qi>p*%Pp$k-@E{1Bm$WUu^I=AUmG3u=(C{VW&#OjENC{LMk<1;5Yn z_@&^pN`n9gZrTsAOGea0+wQR;ZWlG&50om0BdIPdkuxDKzkFE9`1wOkK`QE@gp)+8`U?%VWIa z_xwK6SjN!Lw|Mj_CzYRe zFHK(9Owcc1ipj{J@(c8P{+fq;euGF$@}b};w4mbQ2@W5PPqV*%{?<|fg5{R5W^cvc zsdoXXgbrNt2T;!sB%6#6s4(ZR6-om>!8y150o?x&)hwejLBqg^ZKq!)&-VPSS8yF> zkly~Wceh{8CQ{g4m825cD0?DEW7_->#Qt;y>Ym+M9Y3>0ym;ZE_jqp&OGHYbVPO%t zac+;PkIoLS&i6S-^Dkh_3(66H;?Qg9(4sO<-Dyi2Xg7SB3Q-2;I2S)f+SA+pH9br*!Ol$`8`!j ztV#vqN=xngF2c#BEp#KE#av&F=sv?B@$>V$0C2&7>$tur$-~1h? zIhrkQSReZFNsX2+2Z*n?k54~4&KKQKe;Dyye-k`%f)JALF)C=?(wUxQ-&0iJGwBF0 z%9W#UXE(>RzL*ZD;!!IV(Pc~B8H;lm|6wzp-%^ZmH*xwUiyv%Fsr*thfhGFYYS-*R z2I|*XlHqhk+?hHs`JDKBUW*@0rn4Om_Om*d`GTC#k9= zHY(9iqmO=t%G6N?+q?gSV)n1xkV79`zjoVku=Ng=8 zG(x1)On@TntIuGBGT<~XG`t)ZkW?xNY};rq5sN4M(IZC4W<;Ftzo^NIG2I2wy2Nt^ zdVXFuvty(6Gzwp=-4@zjH?OjW^hA#(tlzKR&}j#fy-X0@{bH`!>#n*?X+)t~=38*( zQVWvCOsj&!A?oOEg^LB`hwLTwQ*-`7q{Y(5KTPpcz;!I$LK6kAkxqL|z*~;-U`+C4 zi2`<^GP0o!nS;LI9Aum#t$H$8lzY17hx>rNIZwVK?FV(6&0b39leMrsMXJDf=~k6C z93~p=COJBd20grkqbsq-x^PBA0U% z5w&nK$uH4Dc0x$U74~y1GoH)JwQk$rDN<^zS4C!-j7ix*f4u90EE&D>= zaq3SE)vu?YyEoZfedlsI;u|&kwLO*<0d;jMzD|Wf>e=M>J|UjdvT44_UAVa1=~%fg zZ~+pdHzq3u5N6wBM~_Ug(cRr~~!WrGYx$>U=E{X84 z9F98#g=$S?lyaFzDxSZGU#B;TJM>La$B1r^lImZ5S7b1|6si5?hjZ}Oe$d1HM$ za$a#no5FExdcwhT3B{#v&eA?iyE5j1+Z7zv9uPV`$p}Aj2i~1iM|klETPV%r{Uw<7 z&b8kCCPZd8?`C_vw6S5bAudxif@A!85t zEz`x`f%DD?*a$i z%P?y1+@4s2Um@!^&42rz%HL?@anX38e~O~sP=^7AvcD<=WvLv?S?pRao%_rPwC21) z_kQ#}v9DH);y#=*u9mf*&Ey-RI9GQ+eB|Ef3dSAHJyov)=?QSFkW5xPWoC&y^fwY%Jl&?9 z3Lh9|#Qq?Re3x6r`URxCnCvC(7rnvY4Yzx-$z%Z?E~|wNPsco&5k2KoSmR4D z0GCp=X1N~<9GmxoMWLGDaIP)4iJP_U@qVrC{@Nu9UNMG6TJ4gKlNY!a= z>m1$mx#uapv>SCY9xwT7uC7_vNNhS;P`Q9P*>-hm5QJ0J<9vMfak{psdTs~vu-?JU z9$Twhet6k@&H>DYf143__TQ1rkXt@Ex2!| z3X-UFOyVwjp={@-sFS^6?2CjDcu`I%`*^gw9ME*Yeb?bxeF3%HmdGWp&bUbdQr9!Sc++y3RPKfnnZRyxRudlRT zGqIVLJrRBFa05b8GL6{d!=h(KR_-~QmPs)dyPO<*zayxMf8>AYN$ZcnO?!#7!ag-j z_##W-hE)^!E_I3T>JP#Y`dprlSDs=ajcS?RTk!6I-)!;yRFV4OXtXWApf`-EdPKHF zj4b|)w9G<e^L6&r+mn?MdPC8Y<9%BT^`2qX4^!={eJjVST_WYbLL!)5Pd}>oVQX?Y zMgkr~&)v<1{#@05*<~N;dnDW@HSGk;7VBwJ0JX4~tBKZ@4eh4=#`nZS26xufi-z8u z<8N7iGyuC>-h9F>+!WHd(;6?n>z2M$_$85aaK5OZlF_s}*_q&sJ#HnZSo!MbShh51 zb4dH=D|BA4k=2jk<+XW=9ih&pUfHtzm!O(+W2>o7nLwG8^eA zs;Kz}XZcCDa)2tssb1}N$WU9$xhIN=F%j)dCE`u z68i{vQOvHwNEsfMxdP%VZJS9J#2Qy0P3Uhp92n%S{AQUdt?cVcx33>N3xw!)%MGL= z>OkyLYy}^4SBNWLIT;Q*D0?adSgI_ve!kd?rDRim3EprVxB}5BLO|zYfVLmwp1sW$r+^@iUcD z-hnm4YU~>(Cl|;T`kd{ z1Yh^>ol`ss?_j5SQS4iKF~rxd7_tU*1zZWuF8(aB)pWZa_Kjxs1xp4<*K5I~fsINK z>VABRq0uBeY?_*zw!4}?yK|vbA!t_RaqptR=J^s?Yp!{GmZS)N&x;(HH(@$+P9du^ zP=zl*#&CY7p{VZ8yG3i+tp5(jN@0emEY z_ZRAOL!#dsIZ4(J_PoCm{{E&M#abaNOPhAwfB99MaHf5NL)ldT?Z)wBl)gBo_?1nv zKnvuHfZy}Zr-cD=yN1#!KiRDRY|W+JxjWU7Pk3<*Z49WNRTVslCX$r8RXTkYKa2%t zwE4D7`Viv_cYys}pOCgl=Xa1w5Z>g3m1=RN*}jayg4I3e`B@`8Elqh<-&08nzCF~V zxzyH!V{T;l$OM%8Fi-sXNY2oMX~mJgjY)NaTy%Eil+`L5Hb<_))YdTsflY14xrN?Z z+s!PqtM3l=XAGN|k$J;&J*kDkJi+V$z8PAO{CUHlaktDOtM~ zWWR^$;!oBp%M z;ULUj1duN@QgU*XiG1VUc|{FpD2Krkh?7*npIkt+ajv`?up0eUxnfaTk(~(p?eKFi z8YmDghfB<6;J5EBK-Gq9r&HDegq4ZZd5fYmwi~u|EY(Rq@X|~9CW`sLF;6#RyUU)G zw40Yu=kGXxbgaij24O=evsU6IL&c~SW&FX+5z7kL8Zc)1DWFw*^-rCwi%tvrXp;xr zF1=;z)WKB9DT@vC3cAyq{hBQ+Y`dQ%;Bm_I`pg^c0_-vp0%35Y?|% zX|||z)^wo8(8~GafJL_nEKYfuDJPBoWJxvvQOk_SP^tpz6NYE1%3}OhkZ=qJ<7ou~ zf-AU#;(t1KpVL;|6!<0I^1i#r+#BI*Fw;Q{Fl14^+D zL?q2pU3n|VX8sx!`b~vdn%^g0Lb(wU+&NmMDLhm2K~KWPG-0tx1bilb7K_FNsCVTP zOuMAvsUxfRb=?#wyPKiv)uMe$mNndaXDQu)!|P;mk^gR$Tp~P_H}11~xAQl0VC1?c z!&Vmunmx)bcjaY%uLM^5vE|p->+H{n#~W}>l40tFkgT&@eqP$VvK*#2*kg-hGcMcD z%8{|@JSjH2P({FHwxHuZtU9zui%w=pb1yE~)O#vLO5gx60-T&ew$TlLwrzhm;>P+e zI-pU>J$`mql#RjEa3_VLTHAXcvw@^t2#VmX^h`5v)Rk_g3#H_5U+oSh6)yVO<6n4@ zJ-IoQKs%AIY)^-LdVav&EYkjouo=M}q?%(H2OUpFPQt_Cc`oo#f zv0^Qm_qX=NBqBdsXjeeZdl4{52{jA&5#Ihv#nn-?ycU&>F(L0}dw#aQFuTC^GntON zxj4j4*f31=VgtfH5w$>q3whi{swTzGadBQ%uKbhzsY-nmPUTMTO1to$gJ=Rvp&oz$ zHk!UQpoR?c`(zt}3t2Eb%4ZW%n^XYsM~5GRqdTW??{>8oFt9Xp0J!zOvoUlt0m`J} zT;x6Bq>OnxDZuvpc*A*nSKX*~8Q#01F&R7z)ov_LE_$cD6Bi)3=Bm%q2LF`PUGSQ~ z=-aQ*6JQNF9S_3E2Gr^l;mpzWq$5Q0Kk3R14_80%#qlmRT?D~vo*&GR?u=Q~I-mY} zL#Nhe5u*pVuO2h+7;ZzdMIB86|Jc@GsKi_tr6{kc#L2ElpC>TeQip>%5GF&rrmb9g?hexbrT-fW&Qqr5~oMx z-b@+$9)jht6%gs9RQ%N-pgtL#CIBNAaBisvn5oVFI}I3QoE^YUT^jEi^h8l-tG)r2 zcn0ptsA1_RAb=Uq(+h0NL?FQ5tDLi^lqQqreKN3v@fdH5;Q%acOoK{pym)QpvN1GL zT4Q3hR%o`pbR*}ub)K-#&dlfP{+nBbZQjo%3v|Y_6{QkbtdsK>7DJ0=dOZxbbIzSt zSw;4qLt5@@eZ|p_T})~uKKaPT0gI&VRw~1@#X7vQ7>tCmXLe&90XQ7LDQqqgk&&ZY z1^oNMGP=(QqsKva@+8uak)WSzJrTR;{J72c54*)>z`l-WaxrS%G> z^^@P+ip``y5iS~|3hz<21bq+jH}0DQ8P(Z;j(@j&UubgAcM`# z`MYZ2ANZ`F;+c`QKcrImvzQH#loyT~@V&BUZ@A*;uTrbvyD-QGQh z9*UC3MoFU&>#A5E^@#1T)$Sy%yA+b+P+lcVN|y{Rmdi$*A>NPiPevhw?TD48OR7zC zB_mnyGWe2AJ4y)AKw26ZB6QkK1s88@E*vK^tp(!PTEVJS7GqK@4<(&u-F4~rbmL0_ z_4)@5R}7z*Q61~S&G~VRzu2JZcQ}`_<~Yl&SIMfo!8D1V_V@OUCe#%xItuT=49zZ;CgDW-Hte?7 z1#`8C3Yxor@>5rKCrmTv)XyUp@=kMi+Q<4{HJ#R<@kp7STdz+ zT}Fenl^$N+CTpMfJ|cI`s+66WwX2g2`{~W?nBBbeYm8cWrex~-g4?@`r7}_1tG#Xg z5)Om0i`}fxUvEt&G>HBw%{wp?BpW6SwvIvZ0%@DB3t4=vw`d>>uE!YoOsQ@*&Am-v zy}%it$V-7q(h3662}N#CAdo~jQ*JmWz{yHu6qlJ@K?O!kCC$n?o zc)H}7r605*S1Tt}o(Hcf7Dc)FfkJ*t^&u)I%j=x`G0*B&?vON>mZZ>r;PMaMrbYkE zZf_wpfbq>+@ zch@y|=wX;`Biu%pkCB%GC(0Pt5RukdX6p6Y&F}S0BRST#vJvh#Uu3xzS=_28(+tB# z4#tfc_0|GH_ybCZuF3)A#9)-F`x!^=^3VJyqq)<~f#{tH&47^azb~jNY|HSUNR$$6 z0KTB$nBh5-D-(scqIPju^`gU)EZPVJ@RjAn5lfteK4ID5W< zxwpuasYT&=vA~KfAf+05%2e!Asb#dAchN3A=TX8fEvN-2e38mun?o2pKK!XkWzlTz z(Zr7r6Ji#RC+26R!wu5Q?H!~@zA|t^vi+ZoqH3iv{c%@JfTm#89M<%i@756 z;m7t*1C7Y_dpJ1UCcX{#F5>l?2CBsuyhm&e5vsE4SG(h~fyGFe2Ac1AJ!mxRnuwQ* z9tPF$eu2w|V!~!pB&W#wr1V`i{@;ff1O&2W3pA^>IP4ELqQov98fhDsJf&0kt^jMZ zlm6=;@db}JJK)@yuKmRy)4oe4HNSL-c_O)8&;4C^O#NKIJ7UdEjhbY(Rg!5MVCRM|mU2|r=z8mhP2uv-C;%fOyHFI`{+Zyu(2X365@xns~ zC^btLqMWo~GU=oZYnwH~S#F2%g9*$am%u_OWM+xb?5vMhHlyW+D8*W2oYfir4XX7P zNfNR2Glf~!{nWF1O*@#EJIb4Bw8?-^9vHslI(28I%4)e7*(M}Do&2#e^JiGaUTAH*>0Yp6J}QZO%L4JFZ!07fBY3D>h$4s8kh2 z>$h`LaxiD9zf%!s@t`!$c&U*f&?@hAT+Cv8=Is|$IjmFG-NFz4;heSDcfItZ?3MYI z)i_ood4wi6Mp@%TVbB8IlZ>Ph}n7H;L+r-ZdV?V|J0rSnek8 z3a&Ckt4piKiGMJOo4opPJ}gr-Tm*0)NyVf4>Dqe)w*(*FxdDck-E+koNYHCp7@@y5 zUEMR<>?5hQU5`B59&^QWAg9?>23;yzdY5lj+>8!hEw{c{&`8So#!}UMD#Na0Jg2=w z)y`-**b5{d*LNySuZvFsR70m)W-!u>-xE#-e&x60o|-)Ia^KZj>PCx1a| zuHy?Nz?-#Y#Cqs`3&IMrj8PYOB8>m7s-B9Z{_`A=JO}uRuFLauPXL5} zDa@ufKzb~T%>0SG(7!smYzU+cJkDEcHJ?a({%gQ)l&B>aq3Er%ZF<8^3R$$z-+2op z`&*^oGgbeEd!+|>zJmT#=0yLQtNM4J$RGQ3l3FYId`mx|U6=$FF5dXQLEz-cF2DfYcwts0! z&>z@_dO4$H&#&hr31gWYC4TPtmIxStmWTwRSe~a{9-%)i?#kJP8+Mi-7xF-e^HYVUsWhjOFTC5Ta6<~hXW+*Tpz*| z=;TS>E|OLIKH&uX+k}J>w&)FqrR|WLC-b-~IULN=ZVo2J0E8+rfD4qVHX#NOsa%`^ zglaZdB>)g(*E=!$9=)48LDDbPf$AN%Y&cIF_v9uB{&snWX4}o8y=&)CJZ={aWPBbf zSWjM(M`mV&vyJ#*;>>zhjEUIS+pFZ!3Bg;Yl!0Urqv3$P@zz+NZkE~1=xFtW%uI!G zP*bx)&!!$g-KVpsw8Cf^m>}VZYT$jynQypZn~z~i7vd33A>ywI-Q;_6ebX}@`{G2^ zY?{{A(n`F3dxh|RNa_4)l)-2iHk{5JCls9SvKh*IPjYyHZRCorUR@A#dAurmg=xaJ zw^V!Q+BoGSkcMxblMF9h@l%x68VV{?BvfKx_vyaEdg+Xv8p^saxf zYo(9^kyr-%UbdbH&X}oguKn+m+6(!%)gE`ulo~l+JQ8w+Y7^kT(n;gdny+Ub&D~>7 z{YLgpK{0gVKFZpR#m1c{e&NjG2DWo5tph*5C8v}U8aY`mzMgT}@<-N4`z#hWULK=$Hvh7Fz%UlHHk zhp}gW%^R*1cXck`-=(w95a8dB!HK_MHu{X8dtsBbWu-cDjnjaHlMa@&vbJ~$<7xkK z@}M#Aa47s5`|8>!++z0=7}?uD#{(+yiAcdW_eW@SCSmA)UfX|dmOOKvgAyPDHi;TA z-^5_{_Y4TJOjx}%9Pyt}%|$BKtp>Ob;^((z+5o+eP&foHB6XSIkzW`IQvamoR@yLE zi#op6Z-Qo0840>*;4wbc_DqU)zwsQKog<$rexQAPK0yqF`uC~67<=ON?Nv~j-HceH z*~p))4W0>3V#lJyYX``}%{Fm+lbu~$7PD}H*~}>uN{yP-@jO*YZO8keK=kajn8us+ zP=SET)1{wyYL+23vwEXZRE-3NgNYGQ`IB1#BvOeY9QJNwTp9z8B_4O5+&PU$Ge^_h zacxuV*MXSW`Vg=5uFw##wis0;$n>B}OVJPp4rkY?)lE3}w3=)l^0_~tj)td&`2!92#7dH>L$_k)BZRw?O+bMjJS-s;dm2>1z; z)tg(vb zln$F?k65+-fU~i|GzK}G$eH2FsNX5ZB`@`!8YFtScqj&CzC~QQH}{Zlx4q+>>^EDP z-*=Su;_Q0Tmf5W``Rpz=Tg&2>TqHrpaiy(zZH$uf2T_1DbBDre7dWfC9zS-y-tq2p zQGU!tyMO3p^#sC=r4s1Fg{t!SF{i_Q0cNG~!pB9A{D|5)mtd+68UDT#4DE!Q(~W@) z6dnCH1zM+tKd{)lrYr9Dif34J9?EJh+q(vUD6W<5oP~aGc8W+GgR}>vWg{6UEAwIZ z2}Ztt|MV*d$!+~1?u&wRylZiP#BI$T71xaZSQc4;W)|!qp0dcDX`KP%P)}it24@PS z9d%L>uXZxcc$^k;vwjY2fb=4@z_!K@&9CJQ3e0(J1g`10EI5Be$Y$U4v1i(^|8(Zd zL!32-LHzV?H#;87Mc;DjVX0(N=c#-n1SBVb`8lKDqBZLsG{YN64PEA*}bC zJ5r;(=c0FI%Hc41AJ7qq7B`_>tVK@DgJ){tsuuT4l42i^MMe7yre{^o?e*MYa{RD% zZ+^_F$+7+L(J^_1Ue72wH_5!FAV5N{T!izCt0x8+S&#!)rF(BE7K5>89;u@tHe1*$2RP$*z#O&iG3$(%!yqlX z!SW<9t0vPbb+9E$vqI^-!Z|SFM!^Z00eLQYto^F|`A4mD>~}!nNx&N;({8%Os7dt7 zMRGM2%vpv8zsbHFLA6F4fG(uA_tdj?aK(Uma9ZcWb6jq*9L*JXEbp3S7AMuLBM05| zx6u~?@oXgH@iqJM7(oCntT#F?MWc}>Pmo6~f=}Pa(Oc)uS?R+?_D zi$;)y2?nC=>`vOUH`DVv??@YulqI!0FYb>>x~6F=94s}1cr6y_Oupf7k}~+ftZGbD z5(b+X320X?!1xiVMKmwz!L^1>&kuaHsECi zBqgyP!bV6^ETG%an0}~&vuS3md(3h}-a=Ot#EO>vlA`FYMAfONdKh0PZ%k9j8mhyH z+O#2K+`Uk@(_q1?F|cS}B8X9-3l|F~|4y!svhcH1`+<`6kZ1BDd%|B@jW;#2$pgF; z;KKI7tVeXl{m(BgB_d@T?8QGl9TO&4q!Ta*Px{e17z9Re`LUSbB-i(Qv!yd`VSAk` zRf^-N!jmz-gWmQ}dRV8-r4^k98DR(lWam=V?rSu43}ozi<((#lzWHLMw?^&QlGk>1 zs#QlpLubht24AbbxT|tY;HGB}dh+{JhJZB&`P*+AVYfh=!PnZf$=O5JpUv{6cZWqj zIqSh9ao0IUMAOFOWHa(A(gO)Vc=PEz?Mi3j!QOPgc=z|ht{5jOn?=(AUJIyYXh=ew zO#-;^Y0g2c;M05r`9@j;30zQ5xL<>p(mJETU=+YC$yaobd$^LI%o#}1p_w$y?v3_f z)&?kf278mdh3%5LQ2F%&LM#%H0FBUgs#5fi@F8pHt{P`TMezX}$Qws#ukyG#PDfy5 zPgH+#uCrfv=f^blRK+kKEmEJs&->ta%|RxE{tp8@G$s_8-m2juL)Yw&_+{f*0>)hK zNw(B7F`#Ym`PCBQIQALiF0LX16U$8_a6#&5Cx52YKs39P?D%R8lY%!G*XmUP&2#0& zW=l=tOPg*MyW(cd6@%aP5i~Y}YXIK4LcZ*fnd{!xid^kU&_^3JemUkn`_GpftkR%u7*;dQ>{=Fje0OmRUUm`yDL zT^<}V#XJS3nttgCpLD5(PX>qIHwJJ-hb|UBT&Slk%AXa%);|aH~7`vFN>HUQ*;qY5viA3dWP&S-!5HP48fuv95t#x!rWt zBMLnx`OHZqh3G4dXR|Mf7;1L`?kqf@h(128i1GnNq|(`t^U&!HS|96?CSz9;7&Dt` zm<-C8SAGPick4~EtEaVNSu$x*UBB8le@Uum7PF{Ul&W~DS|Z^9ELIZyVEA0aapjcB zm=PbC^Dr0CROx}kH2!32t20(QKu;EF^$yV;#wC|;Cznk5&^>K;soz-H?E@n7DKd}y zJWRehEhU2Q*yBo93QEOs|4{So#E60v zgMLj0sK^NrIIF?oaBY{MJb^|CxB$GmB8#vdE1BRK*>vY0TghUsvCq&ETssyNwS;_6 z_>QB=d~*JBVJe(R$i{ZA4%i_djK^3q16pUMi zM6kFb#$s+({Mk)iIlT%J9C(rTc9&#ADtm$z)3a8hOFA~am@|NWGF7Le1X3b~Wq4jcy{zYD914)o*(^OdmAXKiJtIP|(UUdOHTn$Hou z`qRx?T}VCH{OQ4FM58B(Gh2(40~)EmG6rnfJl5B+CW$*`L?|H#%vhPussT2=RgLN! z#mDCWy4<*0bwUtN)9=+~1!RSQ-w&7&_ymrW4YDuW{(sne%do1ut$kEQK}A9o6p#{W z0VSnTq)X{Wq#Nl*K)|3=y1TnUQo6eqNXMdK!6Md~%l$lizt={d|NmUq`EWkGpF~*e z7h{f?V~l&;6Ct&=trbh&Tq%t4(i0`Dmkq3a&K}*T#fA8qxBSuD9HkCzXTmR;j9O@v zt6^EnOEpQ}@=;TX1q(faZCVe&chCqgW<^)7@q$w8_SGb-dx&!LsUxUfR_)suN|J^57rBH-PzemSRRq=3hno%9%*!y&% zO1Jij#F1|u5s?S#GO5l^5=StV9mAeuE}f=xBF0PB#dd7DEN2uFJA8KQnosvUw-3}(4gGOJ~@Mm0Zlt)sE@5njh8!kW1z}f ztoY!~GjSQw$YvX}K(|fqa3W#zwi#JO2QL&dZVV%u5RZD6XM%rNBY^*Z5|;Wsu(t}f zftWqBb1AitTj&UDnkrL$+jKp1&SNM^Lob^w;#aF5UAftG@EWUt$G0GIR71w9>;?tA5lMpRokQ*OUE8e{X3J#Rz*t_ujFk5d6obi{LdXhzji2#Cjv*(z zdz+g3lFPT^ZxP&~fVesmvVfiNC+9s)#!rpo!5yb|Uyt`+o!3}Odo%JFdgEv92=c^* zokoUyUnaX`!UKCd2-NKZNMoZpKKu$TajvaZ&S@P+*mqf!^W0U)KUNU(y>mS5+=(Zd zDhxAQ+M(CnBBhdw87fDAz(8%KFCF&r;}xrV6=cl_fSoHd+LMQWanD(Sx#}UCOaM4l z!!Ua5-Z4P2N1;B!0x#Q%C*pDoC*E>>XR;O#>>6nVt&a1a{ z!9=9qTYFFMCHk3AKE$cGdAedRLbNyyqnphScm4Wo*3*&%t$vU32{rUezou?!yWTbj z94PxlNhs*RvIHOK|?fdtT4T4H5-<)Gln80J5c|@%utEV zv(glU;OnvkWpOnwE3EKO$kdPg_8{SFOkP@i?oz51$Ywh6enf$B*y+GoSS-w0DmsC~ z(}1rc0(9`&K#O!?eR%!R8vW7xaGl}SGj_b?h$W-lUo%^J@<)|{0w zc?j~&~4aC+|Ciyc1)&ZrBBNREw|wgznX8| za&SeQ1(vLDhu1-l0sy=RHp7!CQ<_((T4ig;IXZzwHE^yaB-5X@ISBNWJ_}=i>79?3XAl1dk49p#UC|1MplS^tY z#yNWN=5Uki-J#AK+!&v(x4Ll}@3YTZamHVI!t)MRxs=LG#`R(b4rObp*&X#WZjS)| zrE2~B^CDZEtPrmvp;SFTJ3=11_e5xZJ{l;Itg50Nf`mNy7K%tPrsv2E% z<@Cun?V{sZ8!IlGfg_nZelaMb-m~U9Tuq{kq>^lU`O)+B z4BTO%mc~q-cOl%Eiza`9A(PJf0e8YKb~nQcagKuj!l2@`!p12hH{(IC(ZC8QT#b#$ zhe+7(AN+%}fWe|!c%3{DXhaBaz1b9DS-YD!n+iE6_zygr-UKmW+lQYk-C zt&&M*YmpOKM<^cSFnD3J##l?`Ui~9Y+o#NOX+!yVvs%)T5Qukks*-N&aKl)N)>I=< zS5Q5>fBhxy8;sA1kg62Z8-|wFHw%Zu-cuxD9K36Q~qFa)ss}f}N!7jKTD)wUOLZHg&vp@eKfe zSP@{XlpDAm#bTU{v1+XVVSRtZpDAA)CBSNo{Tu{&nOYTHpEDzYZuZ1HS^DlM)?kgT z+T?sL#PYr&{mrrM+DCk@GIIHTIpamh;-aCz{jiAmvaKN}`iDPXpkZXGoprcP9kpW$ z2xV$qGr~kUkXHA(djpqYw>uoX2oF?+zYIrk!={P{&fL^fKeGk+ zfQU&jB}wagFk$0Rsc~=5Li(O`bl9o0?!vBY(e83*m4{rifK_h%(*w_*ZhXivg%e3coHwBWqo<55g zJ-At6zgnbLYbl9EWx3daZzOVeDdhFe)lNlc`sAMyefh5r4v#h`!_4wU4mc~EkH0<< zkCPZkk%DfcTa=@DY5NdpY;=uVB`tjxiF+EU(;L*Sg?ZgPTFyP__MM>vPU%ljQ^KtB zu9j~RC0ZeQ;#Jm$PgKitmSTuz%3juHJUCkJ(dMv%#!dAt>4~IbXoa#$zH*@^H_zLc znPVVPI`5F{f%hc#M`}Q5Uu6M0%;DIgI~N;y|O}T3L2%d|D0LY@ez`UjSJ^7w1;Zu(C?IYxk7ijXxwXzri4+ zj>xiq!1Ao3V&c*j`&t_`9}dc)n%e-QGU9D<3x~D6*v4a7tR)#_>K;BlKOw_s+90)V7ols{E36Z0qG%akt2k=R}8CLb@>?e~#&Onh}L5ikS!HLWI z+(2~Fpr3ZS-(dB}{O+%}eg$Or;A@HdpOpOf?>@#O!9=T`%Vn3UG4{3>kR9XwKX� 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 z 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 IWb)?!0R7Gw=>Px# literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/pre-configured-connectors-managing.png b/docs/management/connectors/images/pre-configured-connectors-managing.png similarity index 100% rename from docs/user/alerting/images/pre-configured-connectors-managing.png rename to docs/management/connectors/images/pre-configured-connectors-managing.png diff --git a/docs/user/alerting/images/pre-configured-connectors-view-screen.png b/docs/management/connectors/images/pre-configured-connectors-view-screen.png similarity index 100% rename from docs/user/alerting/images/pre-configured-connectors-view-screen.png rename to docs/management/connectors/images/pre-configured-connectors-view-screen.png diff --git a/docs/management/connectors/images/resilient-connector.png b/docs/management/connectors/images/resilient-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d216d150f8c1862601e976fddcc5f78eae595e GIT binary patch literal 152361 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 i}u9xV$CAk^8 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

    UF zZ}gA8h&x|_2!DZDSrb>nFGovp(XkI0){jO>1}-3aj?z|gZ=UmgVcyj{C85xL1COw6 z6(a1;sjE6w%S||)xxsTVuDO6sKlAOFx~XpO*g5&5_UM=xUAP2B`NL?Vg%Cg(bYg_M zG9dbJOp5ja-)R^*>GhGbsAS4|s|Hjzl?k=uy!kFAMOchl+;>l{WF?~^qjdZ*GZCy2 zI@w@fJcGZx6m2bUn6;y=#V&w3Q9+4Man+r|YT4e~GksvQhkLPPEn~H(O`PGf_0i;} z8MhXRVcA4pJKl*tbsoc>mVyz5ZlNMZ2Abi|>-Xvv9$!&=@gCy4%kQZe721Nj(TjE> zbO`A;)Uu0X8epqEePr2MOjf>Iox9S+J*HXAw4fMSwAe?7(c+AM*$<3F0`1uwjv2I< zhw^@b3(x_?a07K2Xie3`08s$BI^Rtd&fnQeqjhNt{BM)=9%8*@ayT^4S}ZcCRj#If zAEavb&Z3}d;{;$Jze(B1mP2d%Ee{Lq~&mSg2Qhw`tBVPg78MQ3|>RkRZC% zj_Oy#0NI*;u~bJNO-T-!Ei01Kwb#ro9BiXYZ#a_9oDDZrcltt;yC?8Od~`a_$II7g zJq}pdLpBNCg>_nkXH|s!xrnb?Sa=<303TugICarl+i<2MeD;4~aEpn* z`c?~`JD@Z!See|e*ND>VzIFMglI~>g@}4)d&g`n4QsiT-uTT8L=(>#ChH(Lj}9|m&~Chfv3F81PIA`Y2;|Gp z0qqu{jKk<3)x_0F9NV&%(Iu^5PervwbI!LRx4vps>#&x*T^GFN6TrC|O2{8w{MLT4 zEW5o~Mvl-3c5hEfL2#uf5T?bUgNlDDxXY>PCRoej{}NARbg3W}gc;g}>zq1wBwd++WvZ zcGzAvvxdl`Q4CGimOHZwo9|4V#^&1bkc{Q?Q(1?0OO7XLhcc6}+}FyEs!$6mNx}Il zM!9mM!QC3|jMuZjo~f@j%J26p&W0(HfeuRSpAfvZ4S7@=?^i z!tFo@F;MiR;yVguD`vayopc5;;@)WPitoq+by(`O>^`_rQ@$o~I=hBi!8f4t?!rCr zH6=xdA6jWuB1or)NQV}zl`0Cg^VE?J%C`kx$<<-jBZqB43fk<` ziRmLP3Rv#M8V)pF%2P6(cdps5$M!gGm8MDZM4GLh&cbAHD@?)P*k3Giu_4HXXa%WJ z)|6~miDs=yaDUTFiV9Fl-GG?U?-GL2HqY_T52MD1amFT9j6EI8N=z*Gdv&6GIH!=( z!2imk>?&Nan9;)(R<-R-p+mgfWqYOB^<&YP>1-kPY8kl`H}J@$pHeaz@mJ<-_8HW4 zDyRoZ%FS^MIb`3_=hay$Ov38S8bqMtcP~su+RIxW<&mivm#Tq}_1>I_1qP3$}z^X0z~Zd_&wX#5P)Pi6@Da-A|Aq-TZ&ecu{n z6lRoI)A}6r+&m|Aba;?fwpK$GtbR>{e>Qx=xGsW*#owb;mgPn$EY`n%Hye0c7P{`* z?qkaLjl<<-3eB|ia>aL3&l^0M$`tpf_>bN(YYwJ5p(MTARxrkeS#>WSI#)Yya!$#0 zXXcDjkFrGf#t^Xgo6Rk(tk!4BPMIyZ&kAI%?09qdCV6mOFbXEO?kOX(xH$mv1=*Dx z8I$iJl}p?NyUOM`tZU2m$Q4f#uV(pl&A9KAnH2Cr(bDWX@CKtUuMpmV_Fl-?FxC6RO$Tuuknwh+s z9qe9xd2E7=_q-10VAn*pw~gefITR!Keq_ zSQ3BnttfKlj{`fG`BzqYOv*FA)o5%x6pz_b<6V$fGDN|3IHOAy@o5*!ox)gN{qH62&8$pqg=WwIFYoJknFRk=_Ls)VmuH6k#*|}88 zSCR*!zFmlCW)y1P=ql^5v&2+JWZuAM?=W3O;Q=Vk!gaTjbK~bUY_(p*4-3&=JcvEV z(4SynUcPgvHbbW+zYqA*B4-2u`;!sUf@%)no4Z9zb^~x7JvEb20$Z6oJLIu)lsgARncDl{Gj^G==%r(BwN#6^u zsyVIB0NG`t;L7ap>m7U*Tu6C%`9aA;m+Y$C=bUtBh&In1!SOZP}2bF*Nqb0o~d;HLz(AY3~om)`{uivjQ8|6j!7e?K|&zcGbg>kr1ZkK5SyzqZlY zkGIhojSu0m6?;T;?*ToWXf=dkAM9>;9v@Y5QW~>^6s;+v9Vfh3LgO zP~N3#{ZarnVVtn9Z+>kV%Ymo}oT%&4xKh5FdOK2e@(d4a<)^bK*2-HJtgnv?239;K zm+!lA2z#g9BRNTYp}`eL$FtY-?W7A94UZ;V$>FK|70{z1_UKNT4M1DpuBtd-Q8Cc0 zJzE@k^}OlE_EWtGAj)I&+zXtb7$U5X`pwJ9z`@JTTvhY~Hlg6uqbK6`-S&OpxPH29 zu0#%3W%i9jaL!dtkrGvT3=uMTU-*-+aLj(WK$AV$zRhbF>H8d zEtHPxdX+owsWUAu-9M{*Um$x!sm^qdOxksNog^XPq88jqxd@2-#$?5Y=>Ia4!h zyx`*&)KP^9V0%Va|0F3FZhe=7kto0`*WtW#UF|58_)khqx_Z?}ZugK+))@7-{wn<1 z7}spe9};i`8C>OGio(joAF(7Ehg(jpXIKEL_doNEXX{kr2!Ai<{MBsjWQzg*zAqpp ziyr`!G^;a^9tD}+WH|%Wz5y7voN%g$e%hH}M-GlNBoO0P@qP4M=-$R0F@-WZgOnk1 z@i8#KgB|nL_E3`nuS%g?6~6|FTq>Z@jn+@d!<>V*sVfosVZA#sDW505o;h!ni=cU< z2wT{{%@V$Zp4Ms^EK&;`X&HrR#ddSvW^jq7^qUaDqVP|Gg`jZ{xNcnJD%n%Ge4T&- zNY@q7b`~#yCA+h`7XkN*$Xd3FlE`~8m!sYrMynfkfiQW8YW_*j0sKE*i~k<~FMk-j zst7+Bwsg-x2kju`e=YfPHOQ;zk68f!A!5Q2G5@dfm>|0E=C^E_#79v`8IKDRG>4?l zpaX}QbAcE$v#o59(evM?{FYus-@zdea_1bDI(gj#v;>#sxd;*`eRTYTc(yP^U=O2o zr#b*oOQ!1Jn6gKrx2MY08As19X|tAukFEL-`!j-7% z=z_7@y(v0u1bID5>{rtaXfMEoXy0njuf;>|c3CGbMS&JKLWr?NS$-Cd9D2$EYC$cO z)QG(NCu+R27zeomUWZ6kiC=#sCIS2eDa!y*GtQrb)bG3JuF?WMFMySa*+Wm zVA+HRN_|qHvYA)`9`Ukh!eZ%tWf*e%blEQ?+hXTeh>WYCQ`EGhwYK)bS%#}qQRc$< z40cC;E`m$pRuiE0TkVOyKsd)WA)2&&24HZuWVbNnxp)iA&yh zk}OEs>>X;UgykmQz1b{45filC<-g|N{#tfzj-#=8bxc-VVtZ^>EF zYa3&(Yf9yuwA;loQ*!0vR*{Z6bqZkoH3-hocusnh+dJ2{rLm~LFVix#>TpD8H; ztEexnC7tZ_KMlShbl;6v)-r)(I;1n+Wx4OJeTqHa7I2#yFn~4wlhrFE4pHZlcfP{@ z;5po)OBT98PX(WY=;Kvz?Ad%G^fb2g&9LJhJJ8|xZ7)gkm(5~fE5*=(pF6`IZ+aFr z-kY|hToGF~sJ57X9J{c}RK?b3`nbVpkDXdfc8p*)VCPnyMXm4BwIq-MR`0u%LvJXS zRf5iUwHVH+#9Y8`KS?gZz3|%XstCEIYP|U$bZBNn#WCl4uP%gkiQZd&}=7f>_XQ|09&WqU=K{q&tnCA;lJmI3k<7) z)oV)5{Apvp6GDvNztQUdM{F2qDF|coga^&X)$k|z0O{INdJRLHD+ zfio*E0^DG$e{FUEN-zSHU~n%E<}_X9K?+W{VIBl?HKp269}vfJ1JphvywDedsBDVQ z(Nex5HuHtO%@AlwD)5C^zw67EuJV?nm~bNypW{@-(cC^lr#)}by8;Ef3cc$buA z@Bfb2w}YZK)QuP-{lfM;U^<_jfMq)00u6&uFnx{zrEr$la*P6amKF1skyF5Yrgfuj z61FL-Knttp;f`Ak;8<3{aV$@`lAL`M#!98`X!K~s{`rxjE|!KwXqN0!H0Zo{Y*#PT z{5>8}w?A08%I)-^f!6^|K#Eey>?u0^tNp^l&d&Iwr&DveqF1xb*1e(VT;FTS+rurd z{Xe(`9Cz#Ix>fyb9IhU|pIr+YXtfY3$Dgw4}r z-PeX7`?lBtj;d`cpiL*RZ8Teq>XkE0JaIn6Rp2l}nk$koDS$8SMM^Xfn1fHnouKm* z$|9a#*x;zC!DtS>pJ++vc&G{E;nJ!7vdKV5eseO?9zBP}y8R9?z z%lGe*k@AfFgPRPd8jwFpow=*OzWv2--GZ9@*VG{>@F(DcJj6&58}}G>HMh`j=AidpZc-3ql?TUh4q?NUzAXr9AJ2V8 zJ*mwJK<~W=Q_Lw=*5-b&a{&x?hQK-50FS70CRRbB7imi_-yG0|=wf;=o-5X!PgMpqo zo2CNx6zV(860he2hBMXf%ERev$W&r~SLMR_=N&<>I&zb*&wXZ}&crCb`=Mvyl z(z+Kn+^hd)m`!L?PEcAu<^Z?>qdweD`J8-m3<9~vW@KPG=)(@8IO|F|OM3Rg}$E5C(tTDASIS zUwpay^(tocZhUE>BiNBu6@mR=>QVDXb>s<#zfcBRW*DS+vL>TJX{2PiVJ|^+doHvz zY{r)|@s6isr*JG>qLhTcC)RCWtnE!)hzml|D1@BayEfW`#p91JTYyap=}Yv`Ag?%q zQ+n;p1@xHT1dx6T=TmJ4vT@k(qXV-zScoc2DI2VdnuFG{R!7-h<6EsaE~rt9u#dqW z7EttbPA{ff4Ycag4EK4DkXpI3%DyPcJ8_TRO3RHhP9_r?qArp|HeAM|xyFFf&q^y zNS$9v_cvylVhdN^nN|xcl~p+BwvTVY6PRib-WmUIh zUC+wL>DyU>Z8hgI9)FdhO!A@3({|zI6Yi_-t7{KcIxPO_*7(Thd8_#Aztz*R-w`~-kg`gjm zjO zVs1Sv6CFOGKB*s2@6qCAU+)}r=6VCOlP zc70K>PdO99C*;i1+@#p=TtvUS^*Y>&Id>!$^`?i~&%ja%fiCR}VsdZ25^Kp_TZ$!A zEu5p^?MR(^_Ma^4^2g#F2dk@cg{V5K$r{&=74~lj=F;{AY#7MC+tO5hnYOH^u=t~8 zu7Y6t#Gl*bNSm?S)O@5I3qpZ}!B|Y#^-(GT6wG8Vgp>}kpW)dYL(pW1!ump8AEb`B z8#p3Zq0)IU+az3v*i8o;5M9 zqHZn1k28zrKXjPa*`?ya#=9}KsW{qXg`VY5m<7HR3wP^vaqCo~y?6jn2ab+l`z=*M zK%{-FW+l#Oxdk!yqos=vFTVjwb1(O8YQ^5C4NKM3XrNpjJv{ccoIv@0=*^3=&$m>d zR^Av|84RV|?lIiDZ(a`rzx?iLhRDGsQHwOObX1@ zXDBI0XD)&I6Is1fs$pU5I)<&H&^;_rkI63}ut=-R|>W-;*_jpPz$mY(dxVu9Kj6V76eQ zndWHuH1p#7IN6a{Q-Z>8$ko zfW)~mu?6%&!FHE*1#zJ5tQdI*tgI5{)78|-?q3VduYuK~{ZD;4OfBkN23y@GcoS^{ z*2$DhVx^?!xkgo#b%Z5yQcA5Rg4~%_Ling`lKc?jbgb-*ffiV`^?L{@SlZz)y zZX_~%Za4BWUc@=c`Or$;YTgEkU(YX@T9P-%mzK>>Ywzl|E4b>N;~sM0kYHxf_-kv* zL)TS7#r62U&gaLOx~NFh_x4b+xU8vDV9Df)`>H54DZ(TbKGLMdxA%m6rhqBZEE+j* zbS3}UgEQd!EWTay4j8XZ%M8H?_$Goqm*abp7uJ(js1+m1x*>oV(H3})OaCAQ>lEpD z>U|^sGsL677L&_TXI+by3N5hLyvuCxANPhTQ_tFd=+qf-G=@F<6JP&+rj*(x_Ci3fFFA^M9&uUR$6-2v zEoy<5>n6}2qUAy>$4iH2h?R1WX+ORn&v4*Eu8^K)HbvwB*Pi0QMG29c=Zfw#d2QK6 z(tf??neOSwq_;1Va_cG>x~Wdv8f@>$$b9XMx^>$@$wNTq#ka4KU#&vQ@GoZ8>m`g( zQ>|uTxocUd(mgtK!$^T=~OEmv$sWQst3e1P@f$x3uw{P~( zX4z!2Sy?JCo49roD!^`L1MmF&EY;j{;yd07zHHUi9tbBo?r$H zT2MzQ3+?1d$6epN$iacoB8en1Z&!q$X=CgkA!dh)?L$;vCI@xwSY;Ft&orO(pIwNP zNIwpKZy9Nb#vMYTKC1Ge1hKPqjJo!7@SdwNM6eAtjpxfV;vSf;&nFXCx+T^wQ{26YQ3TTr&E(3CN2lbXef4B zeOy2nr|*1;znY*SH&`z_9+5hD(zb8J~GrnD|vT>;kfdpoY6Y`xT5 zUfL(bM`*y}Ce!Ega_{4(_*1snng4{+dCyg@4cP438gbwy7O&H z^qoD3waF3e4uRF#it*E1u9*(ORn zR6Mn7z%-NHJF)!DQq35+DA-bQpLiWbDRC|j5=sxKH_RsNV&h|0(f3e9JRZ)<3p_Nad)B?PW6s1TS`Mve*+XG6u)hL< z3|5}+$CS~0s-#+~6GD|<%Q$704qdlftSFD=n{(1NUe8kKxaf3}84i?oCo#y>^YF<> zgZ7`siX_3VNzyJnofI)#Zwp%WoP_Z;;?tNoe%M38^`pjR*l5&g#B6*)azvFAGhAt* zQwVo7IW`=N{d$-eqZ~t~ymfS5Gn3WXo>>028?CDF$j6kjI$I!0jg7;%87j)G{Sa0b zTV?$gr>qS3{<3{OHJArsi|utKl3LUoYG6wmYu^q>+3BxI((()V_mnOB<6GGrI1!bf zfoI55uB>rVTBxzQrN|!p$-g;RrWbCqIPQb92vszR)&OpYx7(if06A0I669kQ?R%-i zBROXNcAqJ2Rf-s`9Bnu`q1BK4mP24RrB$C;mmXLF7koJ2JSUD#7R)_tY1k1*{WdZ` z2v|B!6%r`N+j@@voD~seYpt`TgCP@muwmq-EsaZF64LHtQ*LBv!CU zFw;uL$DQSfFX9jiB{Tj0BPNqP*}EtVmDJzna;mtZFi!Xt4)r2kNH z8G@!XvOcE~M5+hgOljpkKA=UNX6Bfg$H|lzoI7}5oe9Qnr7dM>yHZkQQ8pAWg8{6w zqXnTMV;vHGmLszX0@VEiUIZVqzg>QB&a_ibv!DsKPJ(6#ts@WeaZI?@ugRNT87ox7 zzn)iwcmMY;$rEwXZlAH&3O{P?(QLEg(oQ$(h;mi;QDh*>hx)vioJzU8O2WCWnR(#Y zq<6^ldOJ}+nQVp4sR&0qUqZ}(k>DEXvKFFRqblYIb`#<9j1H|%gV?P1#fNUlLyku` zJ$o71)=`{q<~Bw40P+0&MD8_S#2PuXxMEtOw>YICW!-49J{wf_{@^N;_Lc4!piQ?T zXj6}8yVm7Shsu{6h*QzvdT{ao|Pbf{HcvcK*@*1Xtd^_W~?! znnZ~wVLgZ}j-Z8_JzQ+Zo7P~JX#E(a-^IU(>}VFE#(VcivG3r$g~k>4t@o`>fj|S& zzMT$;{_>LwthOpfhQ!&Tbuvp0+(%1F+Wx!rUL|VbjNdZOYf7k(dHlxF4*_`(Y}30mF`BJFDSabvORWvB!Jg}Sr}X~tiI-J<3RVEQ%kZ2duYR}y*eg$s( zOg#_6vx6%jT<40?gZJ8Pg;~ZJW`%hD%7OJ9@AU~ZFh@C*>1V-a5Og9-k@$Y(sNCED zUwjJk3-z%aHH`F*H$C5d_lg!_r+5ED45uRdQinwWa{Q}sxP9XcS~Wc&@U-S6?=FEE zcZwlyBy`Poti6g(p};Ykc)$G3i`RV7qS}bWquPjrJMkG?`Mqb~%)ZCNcX8b+kbWGR z<-HP=MBX_{E++ya-%iu@@e>6a`=WYN$87X-M~~ik_p#{Z5}k3l-rJ2N+US2I(ITF2 zL_7^t$IKdovN*gBPA*p%KUR%#9lvM>oV1t;8F#)l^P=)AO2}p*l!APW)K)x|u#s_g z9X^pgz~GC_T4uWEx%r>B1{~dwZ4F-mMaX1+joNOE6gI|w#>m6JcTK)9)Y zk5PR-du4Mn2>nHS56B1SQg4lDX(4WPdxG5Xfb6kTuipoZXmHI%ep?~f-G+Pfmiy}+IwO4OnS%R~M~m9Z4j& zASltlgyo`xH{B4J0eBe$-mv2bfF3=ZAU-{)Ku05>FXjXi*Dew1l!a33e12H4M01PN zu>al@ajY8OeB~5YNIjAc(`(uLDa!2hUi19B@|4N;W+@9bOj5)?-oxs8B4Q_8#i$Q z(zInurayn9C*r&D8;q60u6G2o-nFmUq-965+Qg)a=H1o)juz*ksxaW1RMH$B*U(tQ z5PA!nu()7RHFTJ~&@M4m%mTlZ;NaU20@(R6B1Z)yyCVNIYBVSM;5N3FcUQk$O0M>E z)W0WdQ2R9eF}+hh-4D)f5W9^5bNqWZ;x@=NgIjTeei#9t13g}}Z$|dDiF5b>w!wvrbFlfSvmO z54Uel__r_wGp#Bj^$t%=WNWqQbtM#lnB3=C;Pdfq#c6g7vc2>~#gm%b7P14Le4!7rDU4KFpey zu5ju~B%;smW%FBl26~eNdek%usnc;YhEq$H^@CE;Vt)A>!w2x7)4%@C1;cIBhZt!%4Qk4Bc!yq|p22W;)D3nn-36u8yuK^XU4di z|5X{IPkUeZ@Nsbtv1q@E$Zuvv?qI72d8``sa* zC?d3eU3Z+a6E5N+%N2Vi6*)@ghe;uM!Va(qp?9~@v3{Qe(5GJJd}o4LrW81S1Bw!`WW&B4t!l7^Uc&fM zV&hw|268gj`x|BJLK-0VojXqCc)*Ma5tn$e`IkLGZb3gRfAi#!IP!>UX|TmR$nnMA z*>?`xMgY32OZm_cjw)_omD&MPINTr)`z}jG9M{jIC8`86%7Jly^E!-3F zF~^9N4&O^t7?RQVV}bmoAjIzQOu-z5oadJ@5|U?}`S|ARHR9ubzCauJIjoD)A(5c; z*Hi=_xnM(A-*gxlzyYP5Y7Sm!z}Tm_-fRHjDe5vikgHsF;+4&%P9s>91U|91&bVJQ zz>~M;3Mb4H3ggxHr0DGaREgPm+k*X`q%-}ELZff^-=!cMae~P$II|SdFYcSv2<^)? z3JTjfOI?>RM{v=>cKgz9-U`cTyCAc~ z0xx>gg_Z@DY%31QV6+^J1~whKioi~1IpnDGp);w`qok6t-_wv6elPXm`iGQ;gtYc* z;-Pch(1w07|AW48LE`vf03E0`y#t+1|9SkVy&%*4!%D`X9K(Qxu95uCfdIifGx5ce#va|8P8sEyYbGaN)aXnloi*SF=At;mQ~G8 zxZFf%PUlAc zvY9dJ7j((_>`8xoS{*J7D3ggLO{!~4y zY8JTMV8@*PW606mGXzFaR(WN!9!Nf5D&j=2PL@73kq{qh9*kg)vL{7L-f8x$ig`;M z*$QLRFQUFHe=|`T# zqlZ=<5tEm@kqQh6_^J?bF*@#+!uW zwO?{iMnfO&e6mTYZu+s1bB)i$+mj~_w*7DR-@*^`xGgT-4P8q^}vO~%Y zXoB_PvwYw|y3EIy_oG#7F3O)U`z5S~^dq@+9Q%v%-}fS(d}Y8)F~Kg+%W(o79RDd3 z-3#oP$KqPao42xRUPRk7fjV5jKx^NXci28|NO6-vDd7oO_|vur^zzJ%t)6@c>wUfB zk4ZJaa?WKr{c3B1%EviUZgb^>e#{I+AIO$q5r(@N`n}~%z7?)KC&$d$7T)^^!w-wm zgs;LGFmIw3f9!q_5=Efvo*(+*oBjFCvpb;&xwjMCz1&BMd)fF5nP8$>g+?97^}Kz) zu8w_s5Mm)+v&uq9o-#At+ebEnmCqt_wD$OkqnkW$`3}xe=l;g4@8*ETbSt(lsSZfwXVS7xCW2Td=;&gb4K7K0 z855HNLh`#-NX;8E#dGOo70zhTA`BWl={8-0?B;XBQ25;o$7%-cUbY!qEr#ewCo(d_ zpPzMzV}g|~+Ec85iKxruB)!zxT_^rqxuCIM$A#6Vy}4(+eb?qXSGsea3rYvX=70MU zaw<^0CJjWF?{`V|hW(B56M}s2H)5h2h=~{KYHn`wuV^Lilr#OB!-qh2l^}sUQd2r~ z?S{YVzLbCGL{$1EMTNU;aoPsgItiyik-A+9F#Oa4`T6{yCuSZDc}O@au=wxL)bx#*SD)`vDSTmzxr4hiIF zz}@Y`Vj}PlpGd&xzG1vvyJvG$@;Uf3hwk|^hmMC%%TA12l@4m{`$nqc!tz#4Vk=DX z0spw!Mx3fhX-cRF!0S7v_*HK%Ryaltf9AwhK$ZSTaX%8g5VnQWm&~-p$g`URFT@9c z@|MPX&z#LbAA=<&=G6yaRfi`)?bc3kHr0E&PAIZD#$6rE+r87kX|s3a;F;T~Y-Umu zD!|NDVIa#TtSr9#%_ZH0VI$Cl=QRRqPA(#rp2y`Y7&UiC1wB_&DtT$-M56 zUc}5UWsqSsj(`%eWa63R#G~X2P(m_;+MYF`SNBe3mXGP?oiI0-q2FybUpWWDR5+i~ zyS-hYBKvr?wHpmipD)kU3!yMOJ4mE%7ht&@D!{E{>~Tr2)-J4>Znx^D<{#DTyz(vn zJzqmYSXkweuataNAFM2ljBvtoY6Y{9?n^G-sM5u@iRFuAoF54IOO}*R7#!4!iE=>g z$Nor5KM88?k6Jtct*I=wh45^%oXX8X)91E7TWqfR()Mo_T-}Y^F`!k+Q>3q<1R6_F zgSe79QyLl&8LAkmE1O=pcCZw9eFi={UjHH&)L;CXJRERJHzxm}X~m&=prD+kw&175 zk&%HB!aA}&_b3kqC-ywoMm%A!6PK5|^2I*q$L8_@G?^@*en5ES@zXA*~Lz@xo>1EiTaBS70eA4|DCEMYMU61$xqRXD&d-d0Hm9`hU80D72?k^Q}6m??f> z4xU>TzvK3R6nQ(4m}*A0dz0xOy8sOD?&l)}T}@2BT6YGM1od)+#+nkgvghg0A*`$# zZdm#tcFUix3K%WFD3yJvl&ly|FgZH?=(DQr!BUc+qgl_ZCg`T#(@UBT!x>lAvWU7c4c(55X-g;)bU=F_;A9@LMt30_N7OGj+Ju&uY4m}j8DhJ>~Sm` zXW@4S46~8n`Q)dd5GwPXAwGrQjkB1Q9Ly2M?bcA>i}m)jeHizJbnAcngD& z>P;|zC- z4hbY)t!rScU6uAc<_3sob`zkdAN1oRJ;?#T1)van_Oy0gfRa$ZG-C_oKnT+5|dw~r#e_jNYBE6~&_`mqaKsq8OVUy8dAY*F? z5zZ-!nj35GXZpCNXR4W28d0%_R|ko z9|JFAr&SvWN)1@%-;MKs^^X7R8|R#*7u5fP9>xp~@$|KfU@a&y$;%ANrPKBST7j+x z`co~Qgf)bwB$}&vNcxJqztI3p0lHFN?t;RR5j*A}G4fyE_h%C|^~io?%7FIQ29R!k z$zKG8@wt0+3S-C=HFxZQGe5p-mk5=;sV>IRe?e+G2}0pX*Q4vb8+lW6mOq_z12P+Q z8+e(v^GQ#D8IJXPLX#}|K0xyvkPc_oC0BJ2TJke60JHJDWpkdo@ys*83218B2thfX zX2!&T?O%9+9AI5Jm&ax{S~D+wkI}icZ$n@op|~zBVtE#1rQ6$af*0vEEufbX0Yk-9 zckK^OA|RWy`#;V_Y7uSiOBeHJF-|ld>0al-+2_WlJ-IiE)*N*GL^BJIPnLCOcIL>8 zbvp8GZXE&f98!fqM-!l#J4)mbFBu&`u8t|+bx(RHe&SSmVFj}phA*F8e&*v1s9}zC z6dJ0p;r9}QFtb(dvH&Q+Cedw`HQ-VpZQijlqJ4)Qn8yaR>KNv^+tJGbwgBCFoQVd$ zPCYBm3lY825{JPl&F7qLn)Udea?Q-2Go0PQrw&bA$H3v$PxeNB#<9ut@VI)7_4$8( z7Du__J|f?zQ)1E+Y?DtvxoKQ1W`6-H?@X>dHt4MX^9 z@B!x-AYAyTOkLGAK?UjSNlX^~;erN{2+@*gZJEqcL{SF`$4 z?K{9LUDG4WPPF-85N2>EuyTIHDGOW=u(Gl?f~B!>8zHZOEv9NXw1d+AE0M=fMU!ik zhb#t^50Zu3`63@$sNx;tKd3)ui%aY_K()p&bH0mr_l=ci;pvC1p34o{j0{9@v zLc7&@usPBxu;8|VQ}C&Zpbt*AT6WhdKDvf3VcCmqhW^5F-p3&TqCd*S#Rcr{yVqeE z5mN#1IAH?qbhuKjoXf2aNA1xyFI&fw;`=36s zuk%eO+==LIuKN=&1CY9v@x*m~$z2X?Cueh7!|`kcg(Y4yP-J9uyFkz<4d3y=A^}p% z{SKLdrx1R|xj(An`sHI`eGPFIjmR$)WyEMs8LG#vVxLXAiT7}tnvbG4MZRVzi`-`u znq4n#h>`GFNvonR(C(S&*|oM-oCnmh5;6p?n*6Y!PMoWWOYx#5E3cR>Pm{|8#ES~4 zsL{cdSjVoT=V<<5i|xUZxvSfUT3MOlkimnBg$@-$rG<-3cS)!KQQ0+)Ds_O03c@oeD>d z6f8U{fOkzLg~oifX0do*3_O_6mKgbtM5A%i2U>O5!XxK6L-arl12yj#Ahg(wM2M?U!+P zl4+8(D{CWRS?>CXX)i*9X*>0|xNVb#gD|4MM2BG3P4{+rLU`|O>q~}c)irO{V=&(t zuMdXeS9e;`sL`{@%ImUMdH;ao1gPF*tPo$`&=6g!seQB@SdeG{uu=2O z7y}HzpXI8-_o^#d60HcctLr!=$|NVh@A5M-l@fKF7uiwCQ_InH#Yl z7%&}6Rx9zjww6X2)Ic2drm~o-J7A(5N~EtuFMrGMGhf7wgshqOsR~jHX&)xlmH-4& zmQ|t6t<1;Py*|w}693G&VfGhrbXQfhj1kI3M_#`XXJB@n!j`;5HlY5{4 z+zd>5IxxhF1==1Reao;lL{3EIb|rVc&SzCI|0-#KmS|R5Atn7JDNg|hhxk^e7u-qIFS{ib1 zFJ_0K5ag0Im$i{18|toimS%pNVGk;cVC2E-Y|}TsGvvvM-$4sq?%mH8`p0P^M@Hti zeZ1K5QL{T9d|jc;)zA{kiX_iocu2-Sc>KMaxSWoys533o z2;|(Eg&K@%d76IwCV6(LpzM%s@sza3jp1dS`?%ZFZ9dZrrmVuT?w6?ddR^jP&}L1$ zQT=1daWG}sg^{YMhf7^fWCb3cWk&CWn@PQZ+h816pqlCfR#jz~MHrhJl(@`aB(Qr; zeNv-(I)W)n`Rdfna-4YsmNxY~yX$TmSJogvNjusihC3WMXL=Xo44rbjW_TH&cK}y6 zSDf1bn^9bD9LR7!79>LltE+WB-teP`t} z%5ApL8+Z)h3hD*#)2)#T=Fd|uuPK9Jl_@eotTr;x?FutPoZO7UdOr33Y&pv0P7RDZ zOTw~VPr0D8(cIMm zt0_3BU3zm~pDH9N$-^`0Qfw9Nd73pkxfjo?8v-0ToE)xpl@lgq8>svckOCx-%hgQ; zRyBcz`W`nx;bM+3xp%s(bmH<7D}=i(>upe;@xd44l9dC0``#}_QD^P6GBumfkkHCL>lot7h&iFIe5mABJGaEW4nQW!+@YZaVh|?O z_lN4rt1345-85Nq9u8GBIuxxfJf@?bQI=J17N6Muuf7&N&dkcXZJSr`vp?vuk5n~m-&(&v6d}RXfz4QfH`#yQ7djk_|WkpTliIBeC z5FL5SFLqCL2;Ymo+PJ}t@PRTZi|T;o1W#{1R0*v$3&p48-BGddm~&Uo@qt`5Z>4DO zTK0K-^_(ts{ez_C{15X6%5<@WH)&QQfXBSDMz?I#fc;#se zGhpNnOKeiu%O6z=9-!^(i_coq{=|7*ECzVBF(=F4(^l^ zuJEFc7zdrqR60`J+RPoIaDe@|xt=4)y!QI8y@=zAvmr}R2e)?tPE$wMyGF8Afxjn? zmz`Or&-q4Am~!TNJI&uR!dRLRf>vSO);#zJl-6_aM%h;$)pxz5Y%IVA?84fOv&g;e zZ&%PQm6-Y*TxcU5?F;h0^5c!`fOTfGy!I@veqovdg2(yo93KgC#(NK462k~26+jiLdJ5EzcLCQap z)od?#H*{jz(z417JVjByRcR)?)VWa9aJOR!&n4Tkm0^8NM;j1olmlw`qrzr_w0F`9 z=N(qq#~GtEYaZY4b?ZJQKmlGilSQ^+W!(W6j_*AXXF+H$Q(BvPj2-Eoi@Pe*d$96+ zV-EXSR*~kxQ(3;2%MAsg^``l&Ta;k?z>E@Wkv<&wrhiOZHex@`yI9px4zaN204O zfYY&NEI9`5>h(2q<(2zHqHgJG9x*kI)=E0Dk#7oNe6o2Kz{-Mvc1upq`hD6p-7Hm4 z&AUEY&g1hSS=^OD29^pnD0ww)Yj6zd=vmRlB2HY1kvmoPO`z%K2=@&CUAuu04ezyC zP0?eb;+5>TqEZ6~!Kyc|wAo1MP z;4?M;oyv%*C$sB=8b&{yX6izmX1xf;+)pY+(0a!>1akHbkgaI%T#LNDmL@yR*4bo4 z`)G5a>MRiF8Ml7`*gJmpjCTgYHC?g;g>4Ve@Ew><*R85F5BUgP={8*8_4sOR%b*Ko zhC4)dH3d0W72ziXN8a?5Pc#%sl6l)C;k%Lsk$g-Ke(Z1xjR+7@CP!uiazP?-Wud9Y z`-J!4sKan~w;j1;Hp+Cp#GYpC*2@=*9aOLK$~o#*(!l?(QECfA>uw&gn->bsT%ur{ zhNYZ4?2R#|=PkCSc?bH453rK~yQj_I#DtI3;ckBS@BUeXJzsCvzC3ES zG87?tWgnj#Q8=#iwTy#_`|RiKxYCxHI#C((6O$bd7Dot4t_`js`tp67XCo@I3`aFD zY*Ee4Eu5^Kz=1(e5AwpQ_iKm#_*NZ#rODZntJ}(^T+TtwmQNgv8ld%9NeHlTd*GXi z=1z7c1&hX( zOXzd2vzp2|!wnBlmJD(QyLx2Z0-ycLeKQ*ed5qr_;oEM^`~DtSpXkli{B+(Lbh`!7dv*W-P|x-EXSg$1k`I90yLW}(0c7JH02}-ZM1ShxM*IHw zJI<|{Mpk&W{ziR#NWBg?w-e*UMk$@$o23iz`b=n$J3^66yln0DY5ace3yCZH*m~|@ zj)6h6M2mF<`4Z?szx3X+P2PK>;Fc7eq1RE@3d=eh5{G~OGO8u#;8#sI{6yZij{m?O?T6y$YDu6mBz0v(Fikd$g*+ZG~{J7 zKFNV`!RY?m!pR_4yQBW^~xjTBd#}iY1Tt;pPfkXV9(hNc1V_x#Zw2O{6 z(A|Kjz5}pJW!5HEyDMVcdI`=&0GK{vUzAxJ@a|G;$5CWTwTs>lu??(ZP@_BD{^PEL z9K3**vM#KIeD7ahmkpDF;fnbT)>1oTX>}Y9@0R4E6H%adxSL zwDcvw%KonU)XD<4U#V+%&fK%oZY{tt z0`tN5FJd-(0_ZQAY`{2AW#SH4L9lc+=d0Z zh(A8@7xS*u;0zu%zbpn$H8B^Ud;f18zx@9(^s-Wd?Y;LmmK$+J2qBc;u`?Z zhO|n*WRR0y5aUHR9?ay zeNjW^RkZ{q{+r_wZ>eXY5fB&(o(T+N3ssPlS9|?>J@mZTi}}sHXYd!5JwPDQk_$Oj zR6UQ*JG-^yUVaqY3On?B?u+J zdUthF6@3r;;b$rm3tY*4-znfCc&AHgInicSLlz?MtyB$m)5Sfca0e>#@w;2=P=`}R zuU;F{#J4Q!GGH=yOZ07l1TzQ-EP|&V>-1*3Pkc$H^IJ$!DyjDZ-7ZHSzsNXdVuC`e zO5|aX=|7o0{GQ8?Bq{G@&AN{7u4o>tft_yDq&JIOz19zbmDH@hHGmz)+&X#wP%D6BFCX zOD`6D1Pn{--KjVn;7@Lw`tJM_rUiIJch5y)Hh+x@4Wvo6pV}BO_j(NZPXYgnUhe{r zf2wnTbMqRE8oL19^P^~MC+Jo+c)Hr=LyVDY>==*?)#!vjqI0NEyg_7=ZP)A94DqT< z*udqV47UHI$4bv8;?+SFU(=M!&47u$#y+L85xZr304;3qzW643uS?1Rd2{sTe@4cZ z{{=l{$4QV(pCpg9nV?k*Zee5{K%lEnfIyZwBXuP@3`zi~-wGQtvIlQ4eJu1f)LZ~j zc*tC8Gxi<~zvaN2@~PoXoKHgJ0{g-r&+BklheD|yAF`rZL-Z$TH^gLT#NLbB0eAoq zc_h;KVM2FYDB^TptO%6nqnR@|bKS&{h3iZ5V1L7Wu$XnB{4MM=<%KWOnPubipF^hB z4>LeG)FuevOdp53ztIR_M0%19z2tvKD9nFJAU;)9{vBcxPbzT#KtoH|c7+?e8X%Tl zB^0?#3wic|Bc+5x5Om46+{F^~wqfExatV8wFKevE0M;{7RhOsTG`_qI;4qo{P+Aey zM_QHiUAt~ZU0Z=>j5Z5etZAGZsRF=i6pP!^%W8iCS$Kuyen)su*$`M!)H)`Qeq{9> zVLvcpv(kpKY=z+p%{LU{(_3(0dRLU_T;mdt-#D<@kgYHJw#klF> zQoVl3ZxawJ>g2yc*l&Fez>}{j&NdFDQ5j(!6J|}YaTs3b1 z*a1^wIHL4+1k7(fIJ}3nNXRpXa*xho$^n4csHAmNi_5_c%|H+h<}N z8od2>=SA&^0uPaZR^|=d4WO-dIzMR@vb2UnGuEK#iSbw%_V=2OCr@1HN9ww=Bu!)%E2U?z&FjAyy$Yy)SJw~YesPsf>K}HcTUM!n zNBoww-GL2&fWfJ7mr#Qp>O9X$?6|D)iX%jMxE?CHj)0 z9rFDIAg`JA22ud}WG9vQPryli(kNJR1?Mm8blbhokgz-Um7=^no++n;7^#-;2#()v zqDKu}>jn_N#~@t1*;xr!(-1m85(6a8x6RI}2q^hn+eK*U9AYGTp#m(KsLK7U>Iyi> z(h|70e~3;DG>GYeGgVFicXc9WdTK(iKYKq5_W;U#7Kv9R`+?BO3i3I2ubDhGa)a+y zyb(CbcTlz$WuM)(gPQ*kl~+6sC{LLd?DRm0!N3HAwTfsaHH;gYr8mcc10+gr8UvWj zodi^wJ+d!F&^4ckB;d1bDdp z`|tO1cz&YZ{#oZBKH{5@1S<$HpTOS*h%rDn?-gq6+`F9gCS!jBz2|2^&$s#CD!PDV z4QL5KCs zF)9j$^$5d%2B&Hxi}9cJ<)`WWtYJx$ z{^f71zN^Y>Zj`dHWDKscEtFnH0?|Y?8(IOw_vga}*}nfL!5I+zp7RYu)-N5pLGW{u zU7-W<(FLyPC5Rl|yVwZZK;=Effn{JH z7cEY1HeJBKg&w~6=ff{B{u_eMe^WB`x4Qp}2LJb{dlhIBu}GBO{k)crFMlwp+^GyL zsWYQKSXo(GTVbg%DW2-cl{oSImr|MPfH2=YzGO_tgq(Fjj5a2GzRitbJ$z%H0#b^Y zfd3>4$WNA=t&+xAz(_kz7f~sKDXAcKw$H7D*=yE+HS^jD@A4a8%!Yv1AV`#&c!khO zY;Rr!^}$Ogre6lIVe0mP`CNC%Vsjh@f5C&1QmsDoKh#eDNnQz>1%K|p*ht*X#D(cB zyV&2T3!>pY@q$004ba0I|4YFQp$HGi_kBW-fQ^S9o>}(i!|%lZCr9!>5tsoj-bifQ zKh?OugbFP>NEsaM1VlW13dS{l1565sh>KiuR_1 zWmhrXNML*Z)W{76WL=dxUG)VNNQ_)aEVNzXiKq3iqLc^()3qw~dh;h#ltE!s`)T#h zhbN-{R`;Kc0Mh0>^lx>CMDw@0WB&H;e|vYj>s|i#?tdpUTX&HDPGHlo*zAL)e=C|K|6TW!%wAR1Pog*nl~pLrc5L&m;27L(I26Ko%N0Q^PnIZ>_gaOf?Dd$$7b9c$2z(V z-SS>g!1(4r`1A4mQYudSt9G&Q)BF7?ptk=`ady$_Zw#}on;2%s49IyR{J<8np@4gG zbh=?%KrOYZZ;Mt{o(|647+i9N>i}N%G5XB_H&7j|c7kSrZx63kJ+yM*<$wC$fVS|f z{4VXMv(Do;v?u6rmTKs#fpr;Q^GobAkw-E&#+JtlUbN78S60yAY{Y{KcGb}#8cZiP zs=&e9^hN#{IG+lseC`ZJj6kgC^uYVK`0{}P>;S6b?YW?e?*s4WSH6EAK=xCMgQx1g zB|o|cZBZQhFiw<=b1j&mvv)Bb?3ht4D04D4?w5?Xf}a6PoJdko7hiCSDU@yv4J0@2 zQzX{~R)meGrg3Rpy&48>LwS>qETn*KC@oiIrp9ye6B}n{2-VBDlD^3@IGr;K1Ld{e z*Z4XQSv2n6nP4xyUma4%8N~%U^P|FK=+N{}|2*SiXdrM&6o7*Zp3rp?Jz%%OsFf)A z$WOWcDu9Ygw9RPm-T1nRMT>`_;zvtdH=2oRexm}QLC zlsdNkYC8l+(eLbv0L^Ev=`h&=uRgEXb@mgqh2wY7F=<+&+msG~29Q>uvAbR<(*VZU zzh(hmpM^Hda0|l*Q6nxh1UTL2b{@Tuoo_T94D5xI>2&LPUIGn@1MTz;qx~iD>U#P; z2Tt&k{uZ`i24j)HZ}-*+9H#0{&`r0d&~2Bff{rvP7qlE8qx#>%Oc*dZ*FvSQZTKcX z(C7KMPPdgVxS?2J`ts9x{4v2WncciV5Fmj{fdu=K(-Ht$=9Zy}j4onN`$lIly!-1I z9gEopI#i=pU=*DGF+y&^xTrMb2{jr?O z70rT++XZ|k8{T#4Gbb3BAo`j@eFxGxO%XqE z7ZF`94L&>0a2gmFN5@{5C&_n25P-X`bpO%Y;lVW)99)hCpbzBVu>hc5-TzR|+zc4W zVO5|csG>3Ub$88jC;&j+!#p&%N~{W}uNn@jnSbp2KPrO%ttiH+3+rgb|K|~S8GTiA z{s*Xw(=jb!3*aJA@%d|8hnC$TNJEcwaYgAw-*NUmK)U|e_kW;8|A~{AbNPNEZ^+#> z$l#_VrwV(mFg}h;=gp-voaKxFBzZrUa~Y!()8t-+y#Ue-p^zL<$b9(7=lzceB?I8a z3`18XN=Cq@0 zA@W4G6iZc87+(n%|AEl6#krK(kWE_e5Ts5pb4qD1`c>BgY+{OOUtSk^6G6E|9f)j< zk;)b?`m+4L@-XaHV|gr}QJ(-7j3qAvaFuPKJ|7#T*)7~=?mD0SamisfglmajFv@rb zE5U2r$uj~co0;DrmK!o-r@0zn25g<7XO-vA2iMXks(mMoPAkf>EM|Rf+>q0q;Rz)V zhc!~tI8ci(1WGTLQ}aUbE{LN7A)TI2yh z@8BhX{l0ban=zsL!g}-Ztb98&-;CCg%M^WXi@8RqV5m(8(2Vv93oDojY80`H-irIQ zZvb!F-=JH}2QCN>`&VPDr{1+3xZdSAxy&Q2bJU&-Dg!dTa<8@K8z3WW)R8_xU)Z*f_@~o0aue@z z%WV!v>;vzO$T@W_?Wohc-y&~vVJ%s(_UmoZ$BKQKK95AMsRHdh|riaqm*KX*Mu$5GkE?1|M6LCnp1Bi#HUSi^#KU=1TJeJ*yW6&(|g zSPMD-=DOP+dC5GYbJtCDs<$eF14Y?br>81&Q(X9008NQAopU0Qk${#srTGFxLRbW7 zNoV&Y=SPz<@hBWvLZxM*cy7=X2qs~G3?%B4@m_t-(j|FzVvxtu*Xd4)#+*oewX^sDm`CxWM@NN3cZB*?`ahx=IMUxV*$_+0E2qZ zlDTe)9V(kSj=NTgZ7kzr=H}Ta7<$2J@H}nTg>n_l` zzx$@~gGPWWJs9zUo%;S8&5ZlYIEYyE<#!3o7c+M|SfRxJQu_JJ_@bL~yydu3wrfl5z9xwu$PNWBO?Xu3AWLhf{7$~lbG{BaIAYjZ)1i@FVG9M1(ftCHo< z?9u`OwcKVrBk%iwZ_mI;9S6ed9w0P}{CR%-o3WM)0{mrbQ4Pm+>T;+@xWeHZ1*3ik z0w}vOPs~K$3Nn}hboD$|yP*HTl>d&ijYO9WR`Je%64PZ#RIrU%Mw^5S<@IzE5N3l{bxlfp{x$2L4FT0*jj*YbG zSe7sN%AtMX1~P-2^~blF@dV(>c03XhYX#4rKYy?<`*Ljp*tsp>hO?@HJ$G+ZP6c*3 zkSlfl6(>&Ok2$XA9w!eNfgvRH#lBkZ+EF{J#RZS#Y^SY&pDOD1;i$=-oOwR=|J!*6 zcSbbEmZc2BI4*GNVkp6CF?D(#iQ1oDx?oP~OO@ExX6}$N#9HmtU^R7|kL#?LpV)E@ z3bUM{R|coPs_5@W^jCwpXTI%~u(G$FaS4uQ7ixYS>TVYK1%T&-HoQ&82X+k_sMk|s zi8ULhToZk9?lPXd_?zcqmV-^U^&=(bVyt!bYD3S3vF@Z=Jxp zgJX_Q3sjdCPMr(4b!y14e4Q!+Xa_C4X!4N8Ty~E`D4&IM;bH$to)Z!*(AE@) z>yuTz*WnoKG%L$s@Fep1!kx1ionc=@sJ)Bq{g(bTsE_`7yP$LuTgPNc$e3}qY5KK zHZHqHE=|ETee_XL)APx~9CI7cvB<+K{K+Rg1${ceKthX9crt5WVdGjzSg}Se{mWWN zt^Czr+q4b<$@Wv<^?_Hb9046PqrX*_?I@lovM-peNvqL>E;L~=2==h1cR7JIaMC6< zUMdXHh}z=&(DK%o6p#ov3J|P)t-L<%l#*KLpx=~U5WfcUng?;dHG5No#)G@mD{&dY z7Q2}piFyigK4aHOMg(O(W$)2iN;N$V=VRUO(5MFvCt1P?)WGUUa-)Z{K50sJCgRi# z-O}spVUhrvYI`rK)+4l6LwEK`Y=eY3Muf=hU8K-w7LEXl0z+y&5-n~BXI7J999U*^ zmK_QcrHj^;BW8M`v9!TdxQ?==d7bx=v1ug5$$0MSJxb5G_2OGTCvli1;1}m))0;#@ zgcQY{3v9fL)7!Vc%AE1AOhz!r2&5OmN)Vialr1v!sNU?8p@gXI)K4n*ud0FAfK`I8 zIcYP0f?MAz65zH+vaB_`T@0vSj2aY5l$CJwtq&~toU%Wzr+J~ajFe4GbqPA1ORolL zCbZu>Rk&1Fsc=vPkWYJT;;>CZs`?W`9K4o7(dT+EJB-A8C^SaXyjyn7=&)uZac@!8 z1;bsAx$a_5q4xBU+T7us2jAb-DhaR|_XjFE>=VyhBS+#r`IP;?^45;{3gwGipqcX& z-5EAJ?q=0RQogC>W)`*DA$Y#?IW<8CtEfR#2%Y&^Tr7&X8lgpFYcuaO>RxL!%p&*8 zA3e~QeM`c0$#|Le!MJmOqpptb>ZBm@K2rycynSGcsc`u$`j}~{u7vBH1HL8E`xjFeJs^KVs1<1>vyddbPxc@Xth? z+t2O~9ZJ+^6=Zig7dPl$U~OdAm`Xk=O%=FT|CTuW3YRrE6h)(zF*CBT$q&dPxRE)W zCT^6UB%|zaL!CaVFANxc7Y*ST^b={N{ZTLtmfrYd`@qr%EQy=M)9m2!*+*IEl#KyX zd>bSg4<(+bsOAu>;eK;>YXjv~uSJdPIOBSfYb~TsBR%vfI!ff2M&rZJ^oetq$e+;c zb6(Z(GKV%l(KWHjAt?70`0*ml&*|GGf6)CjOz_G4p1&EE{@Sv7WVtm+t{Exkzk@wE zlc+=thU>E#C9e3cUREfn0IlcW={ph#WLq+BSu;f1>67S7DPotGZkvrhjv1(0Ox*x+ zYKT`lrgz3t`9DK7PYrRNbgE*WsIh zmWZAA9#-&Tsvh%kx9jC$>fF)*llMoL%?H)c9F^_ClvaYW^=7CFRTxprKm4B`IyZ0WTAE zFAMO4+`DSFV8BT*eiy*DH}+*_&*$k3LQC08H1zh~nFU+CQ3Gth?m+ZOaV7LrZsI2T zRIcX>c_@3RzzCBsMPFcm87I#$yu_a?qh>x`m4lQ~X^q0{eSV>BBMri^IM;?k5|D)9 zYxL_yj5Jb8Mp)jk@6Tm}T1~7JCvvKthv>QS;sTa8E6EkMo?Y^Z;^-#79#yo6M#q%_ z!8EB59p~fJEgL>{9gd$aG>WvfXHg}H45W`Ui2A2y^vleHx*c=-z%{} zNc2eY5QPe#K`^VkR$JW~O(FG=z0oX@B{~_0yr{UPx-Jgsy&5a};^p)n>w&(z0-H9# zho1LG7(@mdp@(y6h_BUTRNMAck&n%9hcaG3P_rMyYXWUU{7<*r&?oVSMG%%ecKrgg z_KCCsL1erdg;GhoESf{~rw5Y#$Z$NHb**DxxmnJ1Hdap!h$F}jlO-B`+4Nq?1j>X= zxMs^5td~Lq?Lj2eWTGp!!k#sm>&>pRol(YEfl)o4rtm6loY}yb6TuA_HEJcJwj&>@ zF?FhJkzPzy8%n*Vva^=^O)t7mgo)_4jDscZv+3UHFYo1dE;V8G#Q>MKOro^O840U` zDqOrrcaGY_RmV1E^xOLoeS3v22UTvjPq?UY5;yuPwsr>1#t?$=)(cN(3)w$2B@U+^ zF#UMIln|eo*2K==0-M9F&-K3p(s+qhybaG+0ruk2aOkL!_Dogv35+y+SOO zlD+Mz!El6F%%=g@c;CA5UO|1&3X%TDvp~5C9hD~9FP@X+!4Mf6CDVy|g(WHVb(#ZCP^&Q`k+EQ^6G5ccrm1bEPAZWi7TDtkN(C7VtdwhCOR`PLm<&Hjn zG<%q_^zNkc9{HVi4TNp5I=*w45y75i1JGG_<$}J78mFvgF~4~S;>IkmA(D5utUl}O z^s`i5EnJA+eu!TKWp+FtH<>{~vX-(UcqF7uyO;L(SAEkVMPqek+3iwBtZ8g76tcI> zmr-2sy%1p2HNSqvMKwLHzPkI{M zpp0&3cM@=$FRvMy^BmjDK3`~MQo{djAhBRhhuw$6S(s?mS>8R{rrTglQ1iKY)^ENK z>l~wh4mNww6iX-@zQOk-8-Cgr@1yKdPu4vQxqM|8=)qQ_l zba@hjtz~b-Ir1sUXwSY*rr;_<**A214fnEm7paR8w!!G_@JYl1!e@p?6IRO6noG_n z?nQiGLq>agEhL?!ANaI}NN1rjIKPk0=zw_tI%iksk}1oigSvSy0`O&Y$;ZeR3Zwrh z4IQ_Tj4E+1QT#f$zC9-rA8bv{uVs`=q3c57V@B*Qzfix~$%mKSKf=)yJ6i-y6Nopf zB}w_X(%%^4vTz}=QDg^gQxg|(BxwQv>3tOSb)Ys(;kBkVqvCTLVCs(VzaF8vqqfNZ zE308yy_Y&v^hxLD^r76eu+PxsQwCdLqqQs^9LD z43~<(-$}#(wg=@>z7_%r$sVSWoY>P5v+Z-`Ha_8pbVbE~M;6X|6xK-h?%Ug|y_Z?9 z2BX)tRIGtg%in3snv8zJ+3Paj0Dt3iR9glvWxjU%8^p0qR(9(l$(i0(eS)$HQ(|oP z6^6c%|7<|G$}aQ)qrVh%IK_?tZ^b5Km8Mqrk@?GW)FD6})K54azub!)4V2Q_ra#x` zHC&lNWJ4_&j}ut^P6&uEEv=>YvA@eBahN%B6eFM{EQTx6mvv=4ig&gRB-}fRX==DgNnxkg9?x|-46CM#l(K)z->HmtN*)r-542~12cD?6ks^@~0 zb+c}Dj8YneV4u1K;~Di?CJnJtV`}p+js@W73gtv%2P((e#IKc3an^Zto)Yf$v8%Ds zt%{=qzh{*~^G&@jZ=TX+Uf-bHa$e>U<>#VB9W)^NW4UEk#M-LMUh@ z{970CPMp43z1R&y85B~ zi9}kaOn%1+(!sFmUF#q%xPdydM%Q?|vh>2~YfB+B-GyzsQVyFW`lFQ5LusT|EL145 zVJV-|po2j#ea2SYm3sdry}I=HpLo|FE%kK*e@;o)CW#2s8}F)kBz8OK&8BjW);hos zbiIcewCZZH?d^kniS*v9`$?mV`EZ&z`)uz6`=vJ^tM~Tm)<20ZFbcre`3{8MaxP)j zKqUGVy`^Tej}C{jGCj-m7(*1+Z#YAvg-&1gJK`Y}GbR}#a8%Npx`|Ci^|+%!`840Q z$gN{7ZSMv>EzXgKv{?Y{1tjEjp?!7M5v=Q76#-ac#mBBF5p1$30Vg}rl z0_AG3CYX`kq$i=>?`L$XT)WmoX2fPRtW)EBd^$D^)#Wyrzv7|KP0NKW{!G_W2M>r| zg|At{SXp^q_0uQ30R`Q+Qd=o*sV`4b%}DfvPtHaHj3A{fbz zC}s7_2^}qc)26t65=_rl^b<*PD7(#;n4lDneDiI%+bd@X$X@8t5*NGSjTAz>j^3$u zB+>6s$?1kUTzj{7Xz4;dvJ%=iATT4pl+|OeG0qw$;I?>xd<4aet~OP3p#p&~acjm? z{H!}}0gBk9Gx^@F$F}{}H-}Ij0)rHD>r~03uLDpV0vr;6S?RJ`hJ00D!xkqJ0|B?a zJVLe?bA!;cxXIMo+n8p3<4Dh->T$65%CCg#dGNAXl_`4rn?*`N9`~S3W_+-0_YCtD zS+rUK34orXsJWfchp87>m;2^`?$uu1zEuLB$<^!ovQYDz!}~~)kyhKL+_QX#R1K4lDTYC3>nSF)evUT z&5AEg=Bh`c^UrH9#w7;QiDdtw`D7Ze^;~le3fO12TT8u7b-ZW&xF8)G2eMNv(0a^{ z8$XFyIss#RCPXw2uu-Egl>>V`{2Xb?9*)*=ENe!;NT4QehTrDn9Z^EiG$|CN@aagy zsIs@Z_o;JzE@N*}fzEaA`;S0CaDg=a?QY`JvU9M-?nKO8i2o6q&%h(iO*xvM%IFh4 z+AdMOEjt%lVI%3#5lpvzg13iPFM{cAofXZLwq9J)#55W@>}HK4tY1VLSgZaNY04Q} zuWjYCbe*i2t{xZ0Pz$Cpu_xnzXrgR4yG%TgSDAL2#?d-qeW}kvf@4C{Jm9Dw9pDGr z;JIvuH;^$il;7JQnqVJ)(`N{AQ#P4OUGOZCM@pU`8^t7L2(;zhE|pDW>p@ToY;?+XuD`X34o0eL+T;eusibDc??!>E@?=g-fa&z z?j+|Dw^ICrDOIm}IEBes*Q#E~D4EBo9gbR}4m6+qxgVljcbnOhauPW9Z?b1jG*8ph zfKTbxj<}mx-~d#ZTE{Rjpe_OWEX)Es^bY~Z3{r(oEp1K4bhxPZuD4IM@@V{>Q#h%x z=w&R@=IdkuuI`+YSRPB9!w8D=q;}23xiv@HC!8w_$=|O{q9E$34S!TCm7??O3*7_o zmXEU0?zGBE_Kc-pL%Fp7=iEm9RK_Z8bl=5e-iPG~5r&`+ld{n23GHg!qn$W~Co!Xri zO9xtN5Jf$$`8Z0?^a~N?Qht-GO+Ct&ugzs3{ZF@i?{F#k$)gWHDX%NH$t1`xg%hkD z9%XkKS_GNV`jEE({I<171At2y{@`FX#+)?W(degNGR0Qp7wuPk+K!!%16HqbQ_R0--ze(#xC`3{Qu8w4bc8 zYaY!zG}D)n-)l|_X-R`Me*t1+OA;lgkaNBSE6d9#KW)6)(f~F_DXU3p_Yh{nK;h0wwI8tHuYkrP5%RkA<@u^eOMB%Qxt& zlq&ejpk}F!fdj1huyC^IhEMZ8t@03FPz!W}HZnqz)4gNVdT&h#W$Bh|kvq-q&awY& z5#nbtlxIHL?d6*mSvq+5u<@rOql&-o8lfopWgVI7E)-K#djdy*$VqnY@IYmjC)xH1 zm7}rsNuItaH&`UFt^xF`EA3%+Vnt zn^ogNQOplKs>>h^DY}mh-*8pHtimm|W<3yeyxBgtIrQ@)1?gH}*zicYQJrA9HM3|* zzy=V=@d|iySg`_^!mwb4BQ?;aAqJY3BIf|*Gsu$N>q zH#9Hci_o!E2RHEzFTKoBoeMRDBQx>R@rjw5UFD@7J$a6M^tx2Z^Bfjw0=l6CT(?ub z{8>+8cf)_00eu5v%8xXV5#& zxjRQ$U8nB%)6!#))6nehZgnt7xyQ@yx+UPcz_|?KT zd7%KRe{k0aR=0al?-$U9gP|S<$}^`|-2te2%>#Fe)>=qUL0;K16=#xq3h&Q36$cD$ z$|;{+4~aSASt6*1u>NEImhD~XH?ATtD$=V#A#phwNN#D2rJPUQblH8-?W<@jpXb!+7*`!h@1#BA859vi`Gbk>xlJ7jRs{S%)o zqa%T=f)6bHlre!DvizJkAae~?RAVBq#l+_BJYlqdpm_KMxEGwh>vOnYG^g(aU-QbH z`_v!kp-|M0nHUu)c;Uh2r$v&lVtKT zy?_sb7s_S7aK0=C1iJbor4PZzzkcg~s*U1yx%Bx{ZDGp*_?3)cBW_I4;N`jCT9=*Y zDDy|(4cURThMOIOo+%DnQOD~@4q|`$|9aC9Ft7=wQXIHuKIih?PZ7nH^cGO0gDxaB z@%eomJNWXC8v}G9Z2>bLRv=et5AJAJy6Q>nc6)+S;I`*C3UY3jpHjVOv4zs7Co1JT4`300GDg?90RBa5420RJ_7ufTH!zXElva7f1}^$K;PrN zyT^Yt%DiiK9=jg)fG<)=@JRj0a*B}SHjrJ zph!5kxfo6@zq5|F0wBR)>*w77t)9mCPKQh>6QDmyqg^Ej5KjOoJ{a`1HCMNQo{m7l zyOkW=0MhPQdsRDbxh z3$vo@mJHtf@SVacv9$2}!*A1$>_u~HHL0@?0Np=WonW1WZhyKJsjVNfXGYmX-?89h zj7|K9DfL9$(kHYgK)jXCE;mGtuI}-oOxlq6^TUxq0H(*iZO^%r()e@IjXxCwIZMuW zatB60QwS&is!!TPJ3W6&41XxUm`p>+CW+ip(_Z*dtLgU-#|J-pK6 zLs%f-@@NW|nE+|ISv6}N(k7agG_3f^SUOSj)l(mh3mOkZxGlhy zfc6#ujU(j{NXG5?3tCsAXLL8i9#(q~Uc42AFZYGLJo5Fe_>ta2hFsdoRE`B)7!o8$ zyzA8#I~MA?6)>E<(W|fo{wAK&BTcaOJXtWmpaaCx(}mhBZ9jbahhC@LP2C<~@t1<~ zg+a%<)RZSQ-#A9-O|s@Xh~&q-Qb%wwQ&Jn0g3NfFn8`cgochh=e$iZ9$+I13J=IV`nags-6Fl{Sd9(4a_XNO>XRDV{KkCZB>4C3g8O4r7^=`m_ysN z!RbBg@%AcK&pL>$ETW9Zb$K>898OzK^<|^zReQK?xI;h(hT%J1CEh2R41B@E_T*FH zU~_4K_Wd0$$8^fMcHY*4%+JjFO}LIBK-Be2J6kzny%IEngFyRUap(}2bz2Ym-@eO$EkW**Pv@z^APL9A&*pqH3+)nA&nn_EW$>bJp|m43~#vIGL#ZGZ~{Ca3~;(2+}{!R~(2H>5q0-2_RK?cRlK}RlgWU$OD()kx&5d{UH zK=sI?iff3NT4t3I0z@YqI-KQV{(t$`E95yp9Qgkc$JEMo-M@IemFv2HnT$WPf|cvK zT%6~|mFv1(W@Y8N?yu>}3hM&5Y3J2QXGW{Q$>GcW+8W&gl|0I=V+9s^b z@1~Y-um=Abb?T3__6hjC^=d%D`G}h?)W$&00Z8QE+@YVk_9`l|S~&7eRj0W#%BFx? zTjC?|zi|jbElJs4H_fsy9c&*v8>^PEAG+bSOH^pum=2e_FW*f-kv@ZLX(|G%lWC!F z6nFgigdpJP@?Ynlyq|A;4xBHq6{c{d=TiX(VgCs8|Dfl?2Bowf5deiZXECliT6;jv ziRrlZ2ZQ1tOsjwgID$JVZSnH2*Zuf4M>Y-!fPsq0e}{!q@XjV|gm?{C{>)vRwE*(q z|Hu59Z&qk1xsWNZ&`_?>Q2tUfU11aEQWX4?bbF;B@|POGN&xv#8LI)48S|_~f;GN%2x~y8Yo#*MnTcWq@R)>|ntvc`O`wB^z z>`EE~7iQ^?!VTkHm$ZV=bG}5MztcDz(B$0++XkrqA(aIqA!7R_E*q#zd~>^^IY zxhn>_0UOj;5aUt<*l|W?N8g#suQ_X0VMESpYMhB6J;xZVGvvosB|tO&{@Ke_1Gn7U zw+&R&l>5#+^qqRGikH^7!1)xaLOa*G3*ta|QkhY4<|f$tlX+kKbNR3@p`5W^o4t99 z3pGVR<`zMhJ$8lbBp%#slvKBaz2l(K(6HNE61gk70m0Lk} zr8uxslUb?Btdzo5Dv&D`$p4QEzk;wqqCh695pbvl)_8QN^14?pD%D1AbJ2V7T=SrpnQCWbRM4sH+tgx3s}E) zqZ{@BpT@-E8>1irr!sG^1)8Qj!V+U(Pe7C><@WkXDcZq4iGOoBgO}Fl&EwK4wy{n) zYJdA<>&-4vlPzELR$&cqXsVb*kRErp)T>K0vu&fouXulUxzK={Fbw zZnf~WhrTPetJqehPdCdWWpT0)h;78&@H0bw`PGp4Z_by}74S*54zQBhv6m{|WAC%4 z5ADRGc49Pkyxz<0ag?_QkRLH~bi-(Ey%JW{pvtXJ+1c$cD2-`rQyA8(At{y-f|oG{ zan|{5E?(pDZ%B_cQv;t+_<4CBB`DwGiUl;Kte(HazxVi(Z~x%l7CD@3i20@8BjtoB zAO5KJ16;%0!<8R9=YC?;A-p-1AZIMf;4;{NOrg)b8WO1Kk2WW^I8r~(z%xq>_xfc# zH5ysFRzlmpr|Fm~KB>zA_VQX*nZDMk7)GW77L%~!5f{U$vsmp7#<}#()BeJZiUgld zBm4{A(7616tuN2t?6PO{HvlSFS>vUx64Yu*w8&ma?v~)M$-}&qPzjS}VT9s;<9)=JRXWovPw@3Gobxf?pGU0%Pq$*t`gteea>09}z@ygdJagF`)Y3pn); zeD808mA-}5xISL?PYH)rw{o+hje_5e0eEH_b6NQl9~Q=|F7YCeD?GS%Qj>kM3 zVOO>db>3f|MhB}p4EJ~60I&Y$v6tbv3|W#KY`D+jj>pP7`W_=M918}UZi6Xa`UF?+ z1nzrp2U$){f!vq4cYN3@2!8BSrKi`qbew{7(t+LJk!PPd$Z`P6GnwwH;@sc;S`ola zT`AMK7dg`%loiCq193pv17)BTS$0-h5x7(dOMdJgo0EU*0{HhtUFF!=z}sD}HTxu< z`l(BtC_47)9|RGi!6T2H&5Y*+PJ_a>N=Gic6}D>>uelE;;t z@qh3DqwV3*?{FSpYE&vI6%E^~JJUQkJt2R-LLONv-W#)TXNiuJ-Bl?(mLHNlEWSk; zs;B$V%B?KBV#`kaTiYWTfe>-Y2x~8|>fswZ{-~=cJ3S9zbHmr~K5r zXPd@JGa|B@>dhxk)L+xu$j99ee#bX<|H) zf22oE^%RpJ|MacJd)BqzXE(hva@NDe6p_h@RNXT_ID_~zZZ zOLkE6eB75M`A`U=$G!4p(;Q(G(6&8;aHoC!KwzB|N{_+O(w$dv;&( zyt_Wg<=FaT{`!AxgX!2r-1{#d3HAfK9c0Z zEX~S$p4#A^GrvKYUv>iLGqPT73-@WNYXO5itwcUh;}}IrbH+7XCi&7cHAb#i|7|Y* zW2v9pfI~Fqiycu#@PVAAxhU+Hm-XvcWu&ibZ9A1s$o+I!C8+ z&b9j`r>vhfRq^C*(tFInEI@gur(MZ`MhUZ_Dh?)aXC;y%XYP9=+aPHn(YU}|U*w5J zBKttWLXo&w46*Oy-3m~ntau>*kawW!5pS?k(J_NXhi;+INd^%mqHBKvo>j($!{6@RF4$*P>a$xfNfDT6u41iUobE zZIT~p@F5tX2Kc4%P$bw`i&mG$o$>?(;Iqf-#hr1J!zvyVQ89!#Zi-)*E^#KOz*?kR zO*M{+l@%*-xTMDJ%#;r-gKQ1PBZ{JcgftJU!Q=-ofzK4vS}; zzUTmTAK#jX+2c1o12tuhkbRi}EpBt4lSl$b9}4g`Xufm{b9OJ6X5P78g@-B??@BN0 ze49cqyBgD^PoILa$W^g73`dX3LZJ&w)CBdc%COZCX*CB?#gU-NKpxM)9(@yf^hMN6 zWkru?uf8(sG%?`s=_uf8iJW-;(2hpLs8mJ zc2KftRQ(Y?afwX*8_edbTJPoi9%nX(0KF#v8A{8B;XCe^+EzpAcWOGcGx%y+z{9=U zDo*|B)c$QO8N#5`JNdhormnbQ>DU|nJgN5jGU}5dJj+7y{9EO-%6*UR_M(Pc=*IPn z;ilI7MtV%Q0{Rp>FcRUPGG?A}S3HxQ>jU|4>8Wcy%S;KM>~QO)~@;A z@A>180DWL2bNBZKh9-KMdNC@$_&Mrj$7U1^ex5GQ%J}g@6@Nw%X|`4=Q;Rs-l8Pl- zxgCcs=~M^i6a7=|V&?`|C3e6ieCxiJT9b!)!4R|jb20Ue&vo@Sa;l1TKkG#8Xu1J5 zf&RVT8EPzvl1e0CBkDCT+IFm~Ab47+DipV)Y)I=cK?jdVh7sd8C-{4xpdLSG&>w+C zApIZf&$$faaPWtSn{H5Zk5|XhYalm0G<&^V+kJ^+3irGedopu@BwmfY(xkT>5WO)b z&B!LCYl{eYbkKI%1PN7D;tTTxbf+&-i4Iwb<0zlYDMF?j0iC;T>jxcjiF~&kMbUVq z|D(Py+4zn66Db@JUm=B}i?qAFM|w#2WfS?7OR49~+`b;hx98YaVDo!+JC@FyfU@;) zus?f@Fmh#83=m97oE|*?A=j6qv6DR{99#Vc6C`522f#3XxdU#gS=%AVl9?j~bMI>L zYXtPSCHRkxPA`pTVPzsLe^bbxct_f);|$g4^-5N`c4i6j`#|D1r;0!vRvcNRrOTY# zPojxf^M%Qt-gHv&!v!;c+EB&5+K2o)6Vu4>95Hg~f@FqTy80p6vX)@wGEwK!NhAqq ze5Dnncx06=-KccxE*LUcLUvq@;1PE!u@U{ycjv>ai&~y+ra+)WR&mlhcHREQKq3Pu z4|Vwuz;V{@PV`B*go%Z*&7$144Zm2>Q%+E~u`w)T+;{1Hw3XiUu5h=kzt4PjD_ta` z>&u75k}WJsH+DSldS#`bCUk4ryV^||-`~pksfoKBlbtEN%PO6<^~>PlI6P9)hN(A2 z7s%LI*G4UQ$1p|#v1^22pD12N%V59tE;OmXmyC0DJchH)XuOKU?McV6s4g=yfDT)V zQd*RC?*u~GeQ+~-yM7KK;X~0_OW~XIshDt+i^)b#BaYu*4@~CwNJLosym6^{1Lu)V zm>bY4PSZ9-yXlX;-Z@re+VfcARD!Nn+=Q}{r1?&-z>H>YOD$kUoV1;me! z-s4Qf7vgNe=d3RoxyRhITsv8y!49tlN`1 zur&m(1SH61m%f?o{MncME8sE+&Z8r{eYba_TJ5g-8>1)rL$&BY z%fSdsmhihEs_Qi!7rErteFG1>CR=vC7cF~J=|kT2^3e$dd!J*;SB!DwI#A)4_~pLM z@I|n@<5J?Oo!_!+Z+Z^CzcDpCR;wWB@7r#EQMSdtZc{3P=|*KbDPL%qEc|kg^n5ac z7mum)kFT?q?GcjlO)6EFQG#DaiROO3=V*O+>iuthkIVXpEsjd|j1vkdWTG*h+cYvW;&1d(Qf z*8D=@Br+e{vv_SPtA7zh6=~-96079J+g8lz;>0J*!Z zcJ>L%IR26sQ8-oQh9zs)MS0RaV&06~Bp?#SsWiN!Ci6&?=CZC8{t3QL7nVb$6nub1?p>oN!7X{;Be zy#hn=e6TqUVhP2zNYj8X<3B~b5R?q1pok07|FixmXieWcO7!}8V)`&-FQzoDjK z3up1&hN!aP`6Gr4`B7eJ{5mu7Q-veF+4!R#PJyX}Jo$|GmkSnR;207fYuX96?unt* zKj&_j62KLu&lejKS)-#aZSIZBi&%)Tlz&@ z<@{4#Kx@JkQTVKE;W}+dj81;uiixKhdfUFtI@#&iavBfR6@{#QC+A&yX(Dq=#PbjQ zmyC?~i>KbXRsz&}*!KIbUkALEGvH=?*y?(MOi)Z0?f8BP6YCqS8o_-1Ss&PVr@aHj z^9yMlGbECjb!+lXX!~47;$_i7dp;TGFBP@0ldo z)K=vxUBYSCxORIY6VLAPYLT!f>M*{3sm9K=8qDj@OAPp3|5xAbH46gr83mVTZ5JF! z57JnonT5lhUWLONey!gkadVY#9gOtnFSNVmX1r~f*KNOacOJ+LF;vn^W>0jC@@$>j zh+vHo@V23P3Gw5Flu;&JsEl1oUeIlw_TP_*UoxB@F6hcE-t{pp?Cra&yHCe#)6Z%2 zCxz%trH?)-YmoQLAjBnp^UV)!^|xz&G2%(|rpM*Oeg#%UcYyp$i+BDDl)Y1Tu3JYd zqZ932W^)&h2oIT$-KMqxQ)ukB2x{|0=N2bPg;a_UFpr}(Z2gQP zNcngcPAVZ5rrMpj4Z`XnD>aPj1?KvDA8BV1^U`jZa=gI?iDtfsltvvLh0?hRQ)EgQ zlgKVrLM`2HG_Efm`KaxXC6rmx-<*&t)|<6x;0C$|iYMNkr+z(NjeWB7s7ZZBZ%itG z%YmcX{*8^&SSev8I(|sc=qla9k(D$Z>xve_@NIt@AFRU(-ZE=m<*#n>JXIj0@ZkdS zK~c57uXC&_a3C>Su6Ab5-Ew-VmLJeVLpY;-;%%AQky5(UJ_DPsNsqX3l$eACx^%t* ziKdJfX7a%54)?G9)gU)>46;TtBwEng-@)84Z2^&xn@|A`4$$4Y=2jy~t+{5XZ`sqS z$!$pYeCC)kxq8IkeJLxp&1}Gr6qA<4cXxfgQcb+I-1+jPe8Pql3ZvPytk>a;43o47 zqU`b5d3sA-=+Nl%d5IPpbFwYA;t;Q*8iCOa{pi`@zUV^eVMmRd`}|gKQZVRNz<=`L$a(T^X`vPms#Nxzs|@vb(j zd))JQu5KAUp8fXX0s7aY(6sKz%%Rt3lPee$Tx3S8h5c$s=@-~96t<#Nj@>vEbZ8=Z z&!^VcU2pBJ{qvZbdoaPz{Y3lZh7Snar|LI8Hr(5l);~;k`gSKFhWsKP7)@4he(#Oi z!rd2t1c{fcp0Jq|W7m4+gkuQ3x#%?l53sIIQ1sl#bT6`{2;Joc4v1o8j%!J|H3g8q zBhm62@eaOK(YTF7yfmayDq7Yn~m|OH9BCHZX|C#qxui* z{$OQ{JE6-flQMcA33b0htr+ob-1Wx$d}tU`ePYn_ZNA~C>2cnJXcSPZeRcop(kZ3v z1I+S6p;?Fz^5AwV=@&3m#R#P4g9;<-vBWKQL+`JT41wwj1WvD@<8i$&x7pRj8S`l9 zvX{PjKrBXen7-_;P~ywUfw`-Hevd1c4Mz^MoyU-ie~r%Z)#=O3&TdcVEujrtR9O3>-wk`l?(cidGD~1x>kVl%v2Z?{D|HZ2J%%h#3M1|% zYt_&*udn}IOjo;aKfTd7G9rm@8Z#tIC>?@eXxf^;=I zE!i$TLKo%{{T2w>EyU3!an=_755!eWR>J6`>nh}jiA>LSuVj9Q1u$`8mB)XXI9+Lg z)8{@syzP;-a}KS7jdGt z{BTh0Fb_PPC@T=VE%e&3YX@0*(|8u#KT`?Rr+&M6=jQ{tN+YPe z4Jr(!8q$t>O?PyX-5U!(AR;5Jy?!tFK0Y2udwQpS#&wiv%~x$bcTIPqeZlXGe7wJF zySb!zR_}rN8?c8^oO1!=T`(voO)ZI6_|u_g?wNnM_X5VEP1Ey^th6z2y`C%)7Z}|X zw-L&k)^P28D#;$ip@l=}A7{Ysm0X4G5X(TNG^a#bNkN#Qcso!1YU@&hef?LrOgzwO zg1=msNvDq@F$QOe*W1!Bl3vBK#DMPMl1pW{X)Ay4yj^n_+7>vk`&$3xyu7G|0@(2> zZ<$nM2PI{FAFqO4JQ{WI%g5SCiDZ8n30fC6cffGUk@B&!Vuqg4_C?xPGVSYagU+v0 zzNp{27xKG&CnD*zHEz9* zmeLa&r3&!AOn%t2A)S%SPtC-TBMuZq@3P<;>{mUs6HVYy~eLKMs!SQMobLl%9*zr}|L)FA7|# zj_=iSiM@)K)=?mg+Bk#|5^o!nLN!_rHow553rR65j_uhowo~sZNAXsk?BwAOdLHa+ zu=!_U4%V^zuAZPa33tscnUYpRay!hoyMUZgq=GuH8QlW}+UBqmI=j2YFnrOHb>lY+ zCyO~_oYy&>sK2w@ql;LPAEK?T%lN#rbSWhZax!r-A<>6zwFx%&?A@=6SpX4hC9A2B*ozWY%u`^EWDmWR6bR9G5jvdy~0sz>u1 z61^HS`mYWC3%sN;IHG0TjL7cw#HTK@FVv4?C49^ZCIli0B@qcF!(;Mzkmjip=I4x0 zjLL`m(CbdF!rGS65v1}p`aNBy8F5*QH{P18m#}My+ur8I?kr^uF?p(?A`3kuTT2_} zdwt2gM8g{*3a}d=vp-kxVh;;n+@H8q@5Rhs&;fY0-UCde>wt6k%^4h-r4Oq!L z6VT(s6*}Zon~A`pMeY#0u<^ zW8(UhZ^`ZmcazrWH9vcpe+8Ud4n)@-ja1hSz2^L#}!uK?MBl9xA*EGH#lp*&rV7EF;gJ=qxHxP<9^9Oi8Dk$GLK4mjx( zGzgk_tJ891;Qm~%TCGi&Qy#xt z5tS08TTxO%l#m(`X(=fMhLNo@N*Z)4-O|k<-Q6&Rbj?sh%nsr^k;(NuqR<`?mxj$(Sc)@VC3j1ySEez%kuxqzfIS%Fm?YbJ1dUnMu z`o3fO_eHr%<}NuHsKxAHga#Zl*H>$7+x9dET+_HGjZECYz36YFT#)5>iJ8ZwtQ%4b z|5c*NJRZk`XhyA@V)Lk#0pictjvScE{&ohY>b&Bfmz?zSInboNXLq71D-$^vIMi2x zI0|>X4Z&fBt9EGg2Np*vb`yBLvY;4c2ZMIbf#G$pjrygEvTmtzv)B_174}p2Cq^7# z!|RJ$%K@~xjta-fY%jw|Vob@O71z#a_KSnF0`9G=3TI9}Fvfg=GcXhknx=i*ect>Q z?~1$>>{y;~p)p`!a$8zWeYqvEy{IDm#(pvw{WA5-p6NN@Ale}I&=YZ`u(E!1-cV|q z7q9z-gV7|wo;lNR@WhAF2#>idi>&F5WiD=R4Ij_}1Z6(equZ67{@Fumz01((;7873 zH|C>UT%k^nG?PdPK+WSyKuLALO}0C!)V#(32SLpT5m&UYgdJDLuzh~q&1OrCR<%|0 zs^%!XNMBL5UbGMWA~e!_uM!Vj5!2i3eksWRqZR%UwHVKYFA-SZu z?Yj)I$nM6*&8n@6gKDuc^UVZa_kD+nVR=ST+?|~MM!+U3WC7CIpXSvC-(MjuKsqnl zwPnEu?~nl~c>skLfMPekIej|wkazCXOf)M0k7ab z^rn{u9Gp+HnDq#|DPe?x!#-3pti-^n*2HK!NP7VjEYA$(0=L7$-O5MTZ|jP)Wqg?+ zy#7Yr0}n1|c8bDY@;j?Hazo-%9V#FQlS1 z7RMK)4Vk1?Jh#k3yn$=~S}j6|+kLilj2MB%hz{ywOL7NIBik-v z&~&+z3O>|HZ(XdQbpa4zeUHJ~d>+jxWr%X_JiH(sC%a%>IC3#q#k;p{M{&#^T%^_i z1`-9eY1L-;)AQH?t!%UhN@33mZ#H-8O<9J$C}Yk?44NDVPAk1x z4Ad2C)76#+sgY^g4@LH@)^Vs}&U1`n@%=cQD=TzsUlX=#tPwEYV%ILY)mO&Nh+c{x zy``%!;<0dofv0S|kaf=px%A8?I0wT{F(Y(YoyX|jTxvxfTDI&X`jNr|k zvP8}P7+384%6d!;RU5WFi+jcDtVGC| z)d#90lzBCylR_Xb*+C}zB>;wW1?4|_?73q#I!SBcD8~oaGWSjhtDNK5pLl-~O?R;sQ8Da2K^eg< zdE<&zFd;?pPt@_@Jc{}BeIPtQ>o*;}^?cKO5fuv>+I+D*U*$LiN4`0X_Yw(4Er zQ~8tYH5^bJ_9etnJYB4=v}^YL2@E@-{=t9q6*w!>oxH`%Z&&twm=|Y}(e$xGP^3gK{r!H1sZp!kuWy>QT9te6Q()2&{;oXL{xupbRzFY=8U9tNJi>8uwg^ zg8^_5?p6Z_VYK+D-yH&+;OA%8^T6tSg0~`OB^fd+7K5lUeWNx{h4T8f(T8rq96nc_ zIuk3CJRfT+OH8A$edud{C8}o(7UKi#_8}6~rmdDLu#5#0^{&p3e-STZK|}iRU(2xI zorkNsh3gG9iWBkD5={7@_oA5f*CZ0HM_1iVLa3@zjc07X(i9TLkALom=P1yzu7wuZ zCOnUs8Lr=Z;jp%mh+9xQ6(>(h0@*H{uHq2VE0HcNCA7=_B-O?v5QlDmxM#J!8A$tQ z#t8d&cuKeFX4YrGuzb(#wx?!{L44Kk42VeQeJ>UKUFL}&$i^42>B|!Ds;p)&lw#(I zS<%49O!pSp(1}68;nGWG`{#|e{DLo-H&j25I(&z9uLH)=Xsd8?{(CZw$|>e9mg*~M zybJ~U4j*rLBy>U}UTOV?shCOR+0Wk-j5RhrBRR*6Y9m0 zr9dY*_Tk(1+=S86*Y&ql!570Wyker260vdAah;g(BTbR~6@2`Q#mtKVPc~rYY~xLo5?}2~-<&onkc=d1#mx*mD2>$-B*Rq*>AIdy8*@eD#aRYK5{#LdPAOtL;~;WoqsdezK1%b7CiEj<>wV-Fy&PZZ@pnXv@yuBM8VQ=-V;CtS~*O*U16$(s=q`7=;-)nrkkLx zYG}F4A0)ZlOBCktSFy6<4>5|rn#6NVV6vYwoqiTgn!G(uuY`>a?~~wQnY+=>ox)3C zLeGT)6Qn+wp8hJR@GLDU_L9{-=ep2i@v$oSh^G)SaH8(1z=h}+qyNtHc&gms1*l1& zqb6wi`qTpnN~kjiKbVSa19H)N=6!GspC2a#C}d(O!0hDm#0G>+MI7BoP7RVUy3d`v z8w-EM1!ubGOz3D~F9VB_Be6{w6hxMkdA%MYiGpqVDzH$gH-C3HWUDMZZ>dSIkEB1k zY38-T+u02RrOKyonw7gq+!RG%Ez_J`Ro81?fHGo_Fq@2t6;x@rES6yhO!|@M_t&T3 z6V>HfDY*-B1aO06As|ykpESNVFM5WK)FOLM;KQ`+D;cvBCqZd{SO0Y|2*G^j0`b3! z2gX%lzg;N*G*alyA|R`T=gtg$bbpQ0Ayy$b@EXi%O`PNbtAzC1k=rGE@Gwx!#e;!3 z^8E;FK>>LZ%~-(Rp-S_;Kw_mk(X%s-hJa(%XXFSnV}CaHjnMkOH3jtZ*3!9$&oP`?wTT_1Zr8 zv#PfP?;xrw(i3_+EO@A*8((o9-_VE<)Mgw`{Mdxd0430d%()STV62&C3}%_&aGBt# z-R)h2uT}?rg}d1j^@xhWoQm%p(o8u|9gy{HsAMVN#U8u4#wRgHJW0VJa3mjAC-hbf zQ+hIgZp{8)Wz&vI;O7sz>IlVy!ilFMdGn$T{0tgXQ!#X;)_?SYO7L<#DycL{kf8KR zh9006L$AV}Y4IWf*!L;{p*Clx!0S`zEeLp!rQK88w+bIW!z@Me&gd2b!HD8&}E@gB{d;H<+8og?~Ak%K#y5 zjrFzLf(E>qy;5<(i-eg;>ygnj9jAoplF<_~Zg>JsrfL&1=${sSxD-8T$}Mjxa_2p2 zRJCZ)b7kr#??YCu?CmO}WkKyT#D0d~7Tjq`qg^-Ou5?JpEI3^Up_w!5?ZTIQ>GEZC zEJg-yjJ=yEFL3&@4!9*sSoqSf92^?~raY8~1;@Ax0k-ru(<|iu#6m<>o<(;xyiiBF zOwvMWTmIAX4U4s&CgDd8`BYVOjR<}y3c8YAauhB)D`uKfTUECRV>!nZD20)_3motZ z!+fiG zLagoYvmYaOjC9_eM*s2C0h?x$Dge#-M0@lH@Q!z20*(;eHY+2KUr|jIzGFbgl?l(m z<;bJ(ZEi!?X^h=g`N28cGK}-|L*0JXR_BYsWjVWxXTp@bo7+qvzPY)eb1!=@g<9Fpv9$U%_c4WTn4>E$y`tWcyzk~EY= zBz`?Smu1sN{25c%*RFXEZi&4g%~_h8Av*3KS1L4vvzFR-q=gTbqi;COv^33=mDwhM zIA+{++=IjlP`$A3nZ5%T(oNGKo*bNooTY@kU@zOO(^LFltZ*@R>Z?%@RR{_3g~vfE znRmpANZEDIJs=Ppj-L2^rxyM1zNhmZg%9k1tdAxolURE?4aW!!vqEb%u&D{E9&~3! zBz88|jjE7jrrpC>*-3mGluQPQ+vJ-SEIqoM$FlRT96UpqJ|=&$m=fCMFxjswnO?LT z+B7Zj`bSB`ezYLce%P-%#&%mTly9P&*-fypn(81PXG5)k)s zyBX1i61RTTD5Rj4CpP|JQ`B*;L&<32F17BBYXy6%MYEpuRU7l&-O54jMJ6Gni&^Uj zgQa95oT<5FmAoph_n)0U`*ol+IlEBjYjSpt&J%R_#Rmd??pOLk&3i7E)(vR*QW>i( zF)p2@xN|@J>s1!bAz_DA!@}Gp)Y51vt_59K{Gh!>!VH5eJCK|;U_%UEl0HGooiki6 zKp<%vj~^$c?WB*sEV_x+N1#?{kS>4R2yUc-9wjuuzYjc8- zXZ6Tb@#qV)r|trqpR3{=7Y10nECSY)Wlxb>++Vl_R-H`oan#INV|HTf;AOUYQHk=b ze|Ga`#5D7lyB=p5be|TwS^O$mWj>!d&A|V)JpiweuokxbUwIcy7b!)iAY6>gD_tEf z&+o<~3S|o*$=c@_N?}JI^+tRRygLFqbwU>H*n>QK=3t6^C`6E=1aXo8!9(+f%U$+&+Y}0 zyat;s!eWstl;k2$@5C@qe6TenftTHB-cMH>|7NF@(AgNMWc>V{3SWYTN_l^Y)8c@A zglA`la*|S#pyRlD0gKaM1PSxb{c~>U>Jc7K**BG6mTcjKwx4G@xG0YH%&+^XE#Nwk zjCWd48Qp($T1?EPhvcxG>~hoOs*3EhQLqx33NdimR&_-6up%C9Ul6%)mCotzct`Sx z4M8Bmd=*b1j}vQn3W04}${P4_l5{@V>x=EVfK^4Lm!sn1rDxwZQ#;G`LULM73k><} z23$Ivr%{5I8%6rx=XTp1!{Z!F;=GlME5FG14|t^caYmnCpK0~MF?kexgT-OA0zkMj zXn6nmn)YgqLl(6^?Sy)4vi;q0b+&-lgk}H<7r2)1afiFZTMGOg7K-jyhEhxU!cnq60knHbsmZ1y&awU7#c(dQ(YPy%`^lwGn*z8OVKAQ_G?uz<_ikLg42@?M+SMG4nNc0=cBCiH9zJRBE?L@QL~)(@uzEbO*|QTh2A^sG$^ay zRL$Z^B6yC5lOByoPiw2@A#(sntf$rbqc)Wsn8P=Pv|z{EwIKVY{e!=`!lGcja#DQ7 z_ezpJ-@NVTd|ddCn{n$Uu_6tnui2C@G(o$1M>OmMWj$c~4v+c6Cwre>PjSD>YS+-* zv-ez?v4KB5jYbuNXp7rRYcybHbj zyz@+DOVW#V5jvbZ*Am&IPF^E9+r`f4`K=u_tc82=01?gr_|qFu=b?*g3{jQ4`Rs%5 z$+^)C<>I~8muwkZH;iYN=DLcF9hW*PL=l#sD;Hj%|d+CQ(d{@c-$tv{%6s{vn?5QfJ7`xxiCn#nM9(POh`qHOy_{7k*dO zqmS;}Z8?|gC{wdm{sayCtq)07ZGbQ{Bc-E$zphN(9ZxdsW$CJ0B&R%O<*RU^Fy=qII@0cWTLf2L!VA00&ku2EkDWcuKu4bY?7>ep5NMLE z`bvfk|BPZdgK+eFDS^Fc8NfCbphMRGE!#YP1GfAW82H-rwKy+XxsGslnOI%GX88i7 zgpkcspb;952wL<1Kr729QAa%G z@Xsz4=>5&P{)^8-HLj(NdG4NuyW_a?y{eZ69iH4eU!rrG++5#ND?|4#ZgZJ#D-lJY zxLG>Bp76D6NX7x%=F_I$a}szKBAR}Ew!K~9QSR~64>>x3*`f2~eL*i{LCmlG5898t zCI+;ObToRsLqW=2?p0m(a^1KsvY7Uo6+ojFjt}Kq(OVDYWum_A5pv;iI(@*<^UW z)A6aSSk?F2zhal5TNxkV5n79%Hc;Ud9qF~K`=qpcpDco91c~H?A09In{?+<@C6kCh z-Y?eK7<64p;1XH7Kbbj)O1+d-50XKU!hZT8FVOj;iH7oE$8=wiz;oW+hUd`roe?N| z_3g`qO1=WYtkm5Aw=8E+FSdZ4+r7&TFw#+$y$fQ2z28)0Cyu`%Au&rKNa{c0Spq1q zFjLTwhS%*k^}yu3bu3ii#SXLAE*ntP33-a0jz95rxWJk+LpR|dF`JMX$<4*Um*qCW zu7QiM$RbaYtVhYpU(e%*WBhsgpI-j$U{~;im4m_lG{N!G zmQXqX2J^>rglqnPb)?{LIw;&_1BX4C^QSr7a9RhPq{GOf{t!Q0N!$&fKj6M^em7Vx zxQMwSSr`nq)(YIPkQD+%<4=;e-j@Nr1+%FC{O+z%hW{cf;O{9qV4ywH64m(V>P`{9vPCum<5QV1!q39R5)O`JW7+ z3%EHCyeHT2TYkcGeGk>obMy50Z~5suemLa)i$9sO>UV=Z`N^F0V6dH;Ub_b6Z9>xr zzj)7?t9S;`{wbotd#CY|`A~im_{mR~@EQj0`|5Z6bQj!#*pMv#Q?E2A{FXWI{p58v zydE$6OOGG+(GCW@V8vJh+oKEUds^1t@{=5%pR}j&Ucd*6-||!PPv(^WX(Q2|`R!ne z_`z(!U{etQLgtbZ}}+*KOE|+ z?@#75`rTlBKbh0-Ut#w*hWS_69dc&>6?VT$vVVmgA)9#rE9?mDv41VQL(HQ8Z7jQm zK}O1oNJg}~1h<@OC`Fuf1nuONR&PZJlo8SzP6KHVi?M>fcg~2jf(vCk7P3Ein;>=v zVIo%d%8=0*S%G}A!=&7^enwyQFsA^RfZ>J!8i7l_SguZ4?GcC6_@Gt%$vE25Wr@cO zyI{qt**go8Ploe@ef_X5xXo9B1nl>x8L567*hsq0eR)r7sw8=#=U>A;w9p^El;|Z+ zRL6QY*GNTh(;JB8WuOFbzw?VafvG^<$!^iH($7&}8`ZAzZgA}0$GmsS3(z7c|B3GJ zdRgRfn||dLbz2pZzp2x|?Y@jLuw5+G_ubC(>mO_ngo-)XkeHdcB#x)-spZ|&7riEcOj)%>`Tr`Y z|1zXwsR0SjDr}YQTIf5rpUQrG>+La>vcXi%8d}_j+5)Iqtx@~2`MV$I0G!8HQ7m<$ z&5R>(@PT{UDQhIBM}<7%huaM`f{da+JppcAnei2str(}-h8G)t?aDtwjQUAJ{MX4C z)X%psupUn6SQ9{_Paaa3zO5gPE)`c(n8rM!5`JvKGYvJ`myCY%qn)#P+m&Ae<%AyY z3XYh(j<)}PD@}96I^u9!^Rz&Tj1MV;(ihX}uO4hYjyi!KCJ$eD$3-G;A-kg4X|>6! zQfc#ZlPzfbnTkE*nAYItT`8Nt?d?ClluBv-(X;y9YWL(g=cxAy;#A{n8G8WS8F|@+ z<%`u$`U+hE>0b4)m=~7W(OFK5TAgXySvtj#vAN+wTdw?`Pd-lNpJ^bEf7HBR4SOm&K2Ln%`wiclqsHEd*(>eGDUhZ4Hu2N4`0 zEzG*VQaNWjxQ-afg)n^6%=+qH=yjT*sbau+*oJa8+Rgc#j#F<=X-5Bp*i27wpGlUM z+pJT+fw-9Cocgl;Az&eJ*qMm9uiJ$RSs5<9?6l%@ni-ktbfX&m3XaBVB`y8k5K`;w z3>Mf{FH(jsVI_G93A+QyY^>$6@ck1Jjg&p?b~+zgRQk*kG*hWw><@CpLHN0Y55c5> zi^kpYl?W~^y=%Wa-DuxhA|EhN;S#w~9^{Q;%stJ}6{7DtA8kJ-=~COoxusmdg`olg z3GEKdA^f46DdTg7p{tXmG*Vc=v^{Jr-K`W_+P69n4MUO@3-jteQV5Mdc7@5To{Gzm$XOOw)t3e zCu+Y`Em?n8P38ys%M=bxlJ?+{esK;nLVy#L8a;}=dz>^2DkA7#K7(wsjrksp!8!TG zkSx$ZU7g=$G7jHa)XI3G#qZb6@!722DZuajL0SGBqR;kSeaZfteB-#FQo%b9NV?<< zj=^_ZW1yQmBIB`ZaV%@~UG1PX0q_3aIMl>NvpAYs#A6F-w7PM#y$*+lkyCQ0`YJ-) zDVn*;9XC+j;#zaPoCQPA*A-+xl<)wkG(g+yoXQY06=+}S!)IJqH!zj!l-Ac-XgfA# zR;y!QOXX0T+5gCF`R?cprhn|+Y&0ypX5sS$M`<$I_Gel% zz()9{{dp6j*Ukr48Ko#O`<71mx>zKFW_h?Us{omE z3KZy3lAYUk(Rb<<M^qvCf7`vlN}LnVf97shYN+ zZZr1HsMvkubU0@hW*MB2s3?5QgfQb9_R|_Yn55f z8vSA|<$8ej$Y5Ikntjhl_-x|T0_ZPTTU~G%8=K$pq^1xNsB=_u*>x<}DR*f#lC6M1 zUf4d5bnjl-HN6s3E0m!jdz=)eRMCLgc0pwIS#6iv-YK*Rl6S&4xbv6Vta-6o8VeHOTL8xuGa2uefVWzU*b({Z6*&=ff+(ix*$>fx+Y; zIBmuVT{^S6J$aC^v7bNq@#G!hu@?sE-)?6OMWPrEvqAXD%{M)(-|(8%Gtra>A4L|b zFo80ueMOCAQAGTMs|L8a&?0n@n(_W0?{3laQYM{Spr60`Zuj|IkZt|9?C!OQFn3ZZ zi76{z0|Talyi@ zW^8}IT?t(wBHs05vRwibbJt7Or#sQ%uHHqC{}fr336nTb+}+1hknJ+s$@}4&!l0mv6dtv@lw1~^+xju`DmuMJ28)?x}>s?{P zfSdj!U(_Ot7QHd%UnY1mY{ysTlVa+GhM~fVDiMa$vI(A*pVcIEQ3F1_T4{ ziVJyQyCF5rS?5wVznml);?69cNv&GVyHcqtjyAMjo!L-cYChP84|tSX6ZgksXgr+i z9<7cYNIe?Rc4ptJ!liI9`3PB4ZyLFBk&tf=xgm0rg7lc(50KfNa`eH&TOHK_b$p8D ze=GzG*eSe*?`rsZ%I*(#wL2=sOL1msIBOSUW@DiISj?iH4a8#-bV2hE(tgB-cr?HM z$2#mY=V^n@N>CWjAdW6^%b)0`3W3n!mP=g*l|jsw&^qfljo)mM?X|)m<*S+pn(l1d z)Hd1erp>isxJ}+?5Nze#_OJux+2Kd&=@qwUizWjxIp(g}!|B&R)%@i#*~qJZbag&Lj4?B1~|^+1X%&6r0o}!}8z&(3j|bF-yGYDN@kG zMAhB4P_nrzP%q0eJbmMhIBM4|ax?8_b5w*)Jk)jD2wu~!Dq7sdCw_=cLEfMhJ9vt; zG+J0d>cCR9z`Hjun)%xIZgm+9 z*Rsu?dlp)^FsP&gY3a|M*KueS{IM#35Vh@bEK=Y_!xwoidOCd=vNs!NQ>x`QoNZiR zYZ_r|FufY*FCpQ9i-6Gh_ih+ke6v4*y42I9X)~F8q7G*gH+|+fKg3?*Jb&Jx#4#gB z>W*t%FoVeMe3Nt?D5=+6Y0GMfk(Tx%p^paLTHhP}7^r~SUr=b5jyo*O!>xi}o?bNO zc}w(7#C@F8aDIrlGMQd^lUrM;B=07!nx4X}|U2YAxkUO09#J^c7h z;>FmWx;D{6%*WFL(RjfrB)VLy)A1s@SX`4vq$L8uVuM8&745I``K{fVAH$IqKV6qA z?*D4@NfQWXY0#ien#%rD?_;3U^fnK1>Kx@; zm43qhBtkmU6}f|n+4G6VXm&z&T1D*?a1*8CXzJ?EDY=%V@q&Dy&u;a_qE5N&UM;;l z0U*QDEoJ>sZc+z8{!x^r;_{maHC+x}jG)I=KN!yyV=N|?T$T;JVv$^-RpeAQ+IDwW=3Op?8h z={NK@33-&*(F3~nJ@39QiP^aM7W8r%JUE4`Wk-~~57dhC+~ z-u&*4iEyi|0BL>Km*pr-xq-`j`b5F>0x~Mq<;wwnv{sT4n|T9sl-(FIls(0pX}!}e(VQCklKiwn2+vF|B4>Z$`Is1J79DL+=o8U*Xv7GKkT zDh9Jw@vH{@pyBmPnQ-dwF6b+XSIaEtG;hTZ|^p07Kug4x%Ys6rB6R6wC?D_*rHHp=S@h6JY(h}}Z z*N!bo{KtHqzfgZD@5|stO%hV*QuK>b6pXL@>N>X;nnHRk4lQ3aAZChZ~~V4kDTvu#KR=zIn^bSlb>X@tmaG?dq(l;mMWWrTkzF2PTAD*F-*UK zfe8sdC*bZ_(5Z)R$k2dM+rZ-eZr=7WdOrS9sEbb7URx=!3exhg`$zUU7NNq^&bC7y zjDPTdhj%T{&T8rJ438bqA|&#$GG7Nkf?a#e<|I5$+7}Np4BH~;v&uJJ{Sah3R^1dg z(IhZ&#Qb3(f~VYhyph@);QKxz=3)fx?3(0I{cAIuhvw2G^#0|W$SUW-AV)`8u_jhT zq}|@Pi);IVyQZ&UOvSP>BKG}M^kv8r0iBRaqx-O^7}c2djRyhRqC<~;xC?!Nyeevv zhoZtbo=gYfG+%NpMo~)RxNOQX{@at&+FEXDy(iDT^06_w&V3YFj66uQ->8nrB75Ic zcSu&rE15~q)xL6KRaiRUChB5X${eg6dAY>JQm?4~0osECu{WEH$Kz}uv!vEPmY~}2 zqxudui92?PFI6~TeLi}a=IcAIyqbzuHtXGelCKw1$y)yXqdX%`fYj!T{H>CeKgQ~e z;QPs4tKk*qV>p~!ohB@`qOU6O+Jhe)(t9skl=rJV8rj|O685Xx7OGLL@M*bQd~H-W zyCm9Q{2&_l!)++fVzpO$zFnISv}6huwK5&?Smge=pAXek7BhJ0^nfP;5|{)DoeddA zZ|m(YY~-#*1WECV90=P3L*U_1OaY`j@8SFjKMD~E?8>-~SyVo!B&1}rU>NnTUFtw0 z@rq5i2BL;Wm(dONH8zMPXwiv2HdtDQ!en?Ifx%tdb0r7OL zpKq>8`{r^Tvvuz6NdDwq225k#CZF+US$v($oqG16DXC_uJ7Pf^VhI|-&476rnzwW= zHS6`1ESCVr54i(L8YaRwV!QL!}Vd+lIT7Pg~c-u^CLZGM2mTc)5NqkndVo`VxUr_ zBFWEV)i;N3s!DVFi|lsHjTArNIa0j5DgI-Zn1{zrDQJ;|LL{DK%P<=jw45Z~F1D_1 z|Km)(=F43iZkNUDTnaX(ozZ1P%BEr!dtKgkU$L7IL!O!qZQ#$9#fTJ8f?f5`riKqWYh=CMl|FuRUh(!QG72JBnf7}-yB!~vI2 z#KgSZELO6fcG0)rNyr|naGMpLtb9$HvAS#QFUnt0T20yrS+FIK5_9r)R7%jZDdx^B zT1&l6Po>>OK|kN%x6ALmR5b8xJ!3sW&?6C&!>jsb+UqQXWq8$f=(xb0N1$J+@yPb- zDqNWd?@bDAF~Ld}!i(@;^k$UvkVXCWcMn`0P|=?vE?vv;;oJTWt8e!(gx;TXOwFK) zhNTV(F&;)B7J9tXzPtK8;D^6iof(@>VsESVB8Bvzb;8AtG=~HVlKFS=`-*d`iwFcW zTb&xOgQig0DULWE4=tmfyFxCh25Fcx40V3=%n=@DX>_(5Lmf26#nZu@E^XcI67;7S z-F1qgm_g9o3O1Rq{nfbM|E(#icx!*Vu~C}yS%03!@C_EmTOU1cL7X4;^k|s08$@Ej zx=HstCsup9+j|!J@IG+-t=lEOOndjA6=OE@OEL>QX7{m63a^=n5A&=1I6E#8!Nbpr zntewWsH7>#U)+FX8n;9hvUvGLQBNX5qiQo!t=F-W{r(_2k+%85m^oQ({DYL0m}G}w zzaeDVnAyGKsC^@vhs(wN)~7Yl;R!w2uB~lgS3J^~KY*9>PdZ|eO;KT^lkijfSEFJ3 zwa;;jCHIjVvRR0IxpPAfF|{_%NT>ey_`4{E7U{0r72$v+nTkilA zNKn01>CKGqcKa`9wcN0_?WH#|OZV$61GJqU1GAyt^Axl0vVbxPl}HP~8w=Ddt?`(J zrledkbog1h=I(Nv9x)DpP@f}&79lQUdIQ=aL5>d_3=Ya}3Oi{UWV(-ku)F*GQPj<4!sYD39ot#(rh}Um^ z7>2VP+S$(m-c^51dQTCL`)e}fA9ka#XB|0yNqLVPj6>E9{RSOoguSdjBjf%=o9X2N zIv%k^n_9AJU5KOrO%GKy;h+9!qL;&lZ2Rbf&earp&+@I^_jlqg)u21IW^rmUqnb=H zl5WltYjeh{A$m4`tg?m~YmvKc8$MWYS%XkT=_KiN#l?2!ER@3(4qZt2bbjq& zhGU3>Ci^8mdG@;>x89R7iaqRqny`nr%?gno@(%?sv5?UDi(->SHa@&Q`!+0%b8ZBn zdVCu}G)?&jD{KLEo%NCGz?WweEJjC{;?YqLOs}?meH5%+1*T~roxs{wO@?Gfmbzs1 z$ccTL4n~a90r;o#lDu*}+7%GLmZGserPW?CeI45 zApub10)QGNKllEwQUh%NHszIj@6@ECF6NrHdIQs|=4`oE!&|C(npHgXxuu+N;-fT! zq*$VA6y1Zwd#xvEEG~8>xuEBeZf|SP(x$qG<{|T9ow2nZx(%+iRBrYBjWlRb=8(Ct zAvY#$(iC{{rs*^H@QX>!{LMU{-L{7OZ!3%~mT$?`Of`OPbx{5+BE~SvH5kTPK)H?C$Y;^+NcN2o-Y9>--hW++i*Uz~GgC{`3kA zW^;RY!m~4f>RLv(D$;6tdm^|wq)*mO_b`+a#9^q3xOwap+?L-g!fQWlB?8_AYO791a?c<#U9)Q=N?K3)Xu|XI;Z9v)nOU2EpOnM&1S!R*g%P~mV!%!oT z?7Dv5d=-RqqLPrCh7zlrH0-^(;_0~$^`Flzuwz=7ev_CPp7pA7BBFvj;UlS>kiZy> zrJVLKd39V#69iKdXO+GrR(~JfP_h)-;9T#~I(z|tCg@(@_+HMd=1Yubq9VS&WV_JX zm!Vrri%Vy4vn|knAnlDid>uzTm57MoN|!0vI9lE{pA7J4MXRO!FrP#ZJ?%xU`bgqx zQ=45ZcOy#K4xQ&|^5nN54tz2m58~=?ZHI=68UGc*PAae;0TFDt-ewc(iZ0p|$+41-| zD?h$a>AWxr6Ut-0`-R?M1B*e`QCxlElNOD~m zKfuBvwGYs$-ZWzo`sfu_650YCXybtMGP`kgP-*Xkh5qlR@G~!=U26O3+R}^JNeey@ zl;5`d(Gt2cy%f698@X*cGqUZ9+SOlF&a-AT5HIjcDCMRo4}QkH7rcBi4YP1z5#;$d zJ3+oitBpTDoWWT-Ho#^jqK~N&0-1k4QNkxjtQpLmILv1S6#tpa9bQ2uL0C@zXSn+6 zOOXEB=<JIZ`DuZ2z&!J~ zO3K5tBaV1}q9GRvbf5Vq z0Q|7f5uVQzSXu0@`gyDc{+Bra{3A9Q9E!V0 zNhbe)B#8Xad;-0|p%B0}J~%vm9u!7UlZ#w%+Ik`K8!4eq2c$&T9EaL(iVcqcO9ZgF z{}SQ?dIInwGT3-kT}h-d;6b8j3@Qg70os6hR+qzy+mUpoRlEY zH+!D(tJPY6bL-2O*zWAr{`=LwPtDt+mXLG?EQ~vL1J|u;3z{(&8*ai=BqvBoQc}48 zDNfXhh#pi#GeWMg(Sx$Sr)=Mz@^^i~onOwiD0{ERD6#pv2p9KJW%q)OTI|l*rC}GD zrOqT+V?}J`m#3v|uYZ|eEzOM_P*JUaE0%|-)jnQUEN6ljjnJbZ?I&mXc9BRvy~MfE z-;rE|OHN+=mqx&WIWoGrMk6g23A<;bqhu7%Y@h}b274S8tb`(Wu?2F2l>BtEt?XNgEyI~e3dIH*T$=PCMgILiEAGEHP^uUNEVJT+= zpB%ODlug+$cxm&`T>!+1X$hyuooO}j<&0E%B_n&<(Y#wI7~PS=8g7{**=5M3TYg%ptZp28!jmpxsUglQZMK7AdHHV!!Pi92Tn7YI zU+}D+XqO%$KQ{zCGg6|$XT{2lnU*EW$4OPp&~3kH(oRrs@_b0|B~xdWvLF z5tw}E321JX|I=q_viRqs@L>s1m)kxRb^0NA;o*gBl~*#>_*DfxXZm$j=3rHFan5W+ zL4XoL3QK@y!QheZZP8x~-pwVzVkRGzQhIuW7rZZlG^%8LrFMZv8^Nknz^cr9Z0^K< z0xz6@&j@-VY5=QA`D)UyxqW^dzyXl3a=D}q>KE1T*MMY`e0+AKR@2L0R~3g}mEVxx z>4%_l?%}2E*GD{cfyZTeW?JB%94`~Qir-eVW!2-?!3)>D2d>D(7Jx|)DTxOB^C*&= z3xHL{-7ls1%Zqi!!yMod_m{|D%cTXP!D3d^k?&>hf*0;m41-nSi|qBT%@VBY3RsnZ zrSK(nP`si3zJ?TR>ou@z?1A0?W2OC>fL({**64h3ieymdmwfd}#1YRS{Hi!Lf6PKb z8im9jYIYS>52+PrR`ctmG^;sptyk}@?BcuM?BZW8yhsI{KCK_NVaQ1s-}0i!Y}>?J zdVRYU-Of0N(y9Wge^AC;2TZ)$l}91mZE}xd7280;x0(B%&!cO$n4SyquzfCfgFhSN zN?)_Unc4GAxL3Ck@6nDq<#MRKzklFy`3mCT*1f$K&sw&Za_5SAG&&Qu&Svk{(cc-1 zDhL267#RnCN_lV3@RGgfYnNbtAa#+^AyFlujdR0$G{Tl{&v}$@$a!JlsVxQ@lNIm? z;vQCd@Cv%=o6v8V+Zdhj(3Z>YYHzfj@2rP)&y>hsff1i|-w0inF8dj#eYu z!RY?;WFFh|z9QQJvcy>){V5T0=xD~X!&?8KYpfAqcam9A?B_G~>(yj+xXHS{fjK%( zj2~owC3dc76o&3Q-AhDzmSJJEk$9#(z^L$mZL}QIc2{UEDp%Dns9?pD$e1^L2B{L!m^R!N?tZ+{{Sx=tmUx)6`J=sV@(LojmpWIM z5cOqPh21nlzE(P#UVD+_p1h>K+b%X+E+#nQo7P))yJV$WslRW{Q~WWwINY9e&mUso z;?%P1>YPERZ}N839(xOZXO>iDi>5B$Rh`2Gw5v!KN9zgi3+``i!Fo$PTidqpZXoST zbz>k49R5YP{TGwr^j7YE(?X*+3ign;RuUX(uZiH;W+9(Sqg!0>b`-^e_tWz<5ZE+< z&(usWOm6GDw>Lbu%{4uL`B}MEyN*?DCZAi|?hBWeo^4$2djXGXS~W$cU_f`;&-0*&1+v#0}>W^T%AJQ=f{__obpm z_)a2Lo|TDXtE)&{hM%o(cdC|B7i8q&1q%}EUd5SJmunWSS5!2~uUuaOKe!rf=#nwA zp$OQ|KfAq*y!v1@D^%RrbfT<$-^ncx-C6z(8L54e`Nf@<-DeYlHj@4Nk_FqC`A(x0 zcHtdhoBSy1}nZEuYk)mfHega(!gRM1J?FaMccl9?SKBI@LseKhs$^eqn0<7o3pR5yxM!3G2A7u3Te@qRtPyg z22C+GY(98bbymP-^p6)d+wt*7HhW%}wP^FPrKn`PqBFDGlnjiUr}iaFdG7BVZCVPG zfU1_QAb6kG=EB+gc@+#TK_yQe4?Pe4@Z~sZ-NMXWAhh{k{R6cG>2`pd*~p-1nEjvu zj8njIk5@H-hcPYs`ZdNAAN{==c(r4mTW-v0c#vYII6W^0^>`}0e*YfgLHi(4&Bvr< z>m5~y0S}gYjI+~1vkewtmR+jGkx*UQW`W=9hA?uR-=m+ z5{vOeLAAZ7Pul44w1i5Vsm6DUPKOvqkoZmu4Y42|p>FQ|kj}XI5u!C>v#20XA863! zrUr8MLnYQ;Z$F>HWwY#{G99v}zitIba4cssXXtA0wLc#ex}FJ>6gH-Nmgn1#%;Ng?isi&YY6nx@+e^zX4sT02U@JzBx~5?|&wKZ?rxuQ- zT9+1hR@0#Ue0leUFIC+0{zHvkoJUwG&aF#$&v}qfjJxz+t#($P z`WD5{pDLDUk=V?O(1Jn!E@w;KoVkc_RAEs)XxhT5b!pZXI+I(>yV_l^;v+M*p4OUr zj;N`k%|KCRwf=H)120VSW!%LN$ItArldyTX@9FUgouNzB)6z+m)pw~n8C0<`hFY3E z8^_Hf`Q(4K_uX$zHci`#hzf`Z0!mjzM4Hm2BLdPvno>nXdhY}h5CNr2m5!7k(g_fH z=tvC^I)u=B?s^lf{tG^S;MfDMot@p8ojqrEcQ&PRFQH_|>ScHJkA+IZ z(^iv-BCVlsw}mWquoY9r9rHMb^n`o+9Vsz8WuXwwFpHlM=O*8Pc^nT)MwOQRWY#<7* z-Z~G^?^dmUQ8yzxoyZl|m`5=7N^b+Iak>7>{~AFuXd8mzI)3OaB0o2*^DfF8b*#q@w_J>|@F8g5@* zu6~wbn-g9F?4x~lGo(JRdG{quN9^v&+^oh835p^kN7q)CfQ?uL+}UP-&NNfy>@dJ* zr89#ds0#Le0ScxSIG%ADiABGdm^z-H%XF=AGjm@WHU~?v8;RlFcTPk}9134@Jp1`Qg54$IM@cHh~{UQE>O zE+4#|{vqCpo=ti8y!qNl{p+hQI~nqecVObWVN5n9&#LP1-e3a*2@kC*A8p$*g@M^5 zNUcd#F_332Hpb_Vfb{3DyDE?gOFr|ql6WHn3yZMW)3%7CDW161@q*$aK@Pqso>A4B zb7X*2I@EfgZ$?O-KKg7H(py{Qh|P|_MXaN%OLvc<%HdFDgenoYaN|aB7!fDddhN9_ zB!$lN$>tuCxIIsQ%q+TRw%E`u56Gbt0)z!$k>>N})Vnrw?I0kNhNG~tA}}L|kI=QI zABkjH4mu05UpmT^i`YZ zE*4{KG+JoKdi`=eXehhiHk&F>G`kaLZ-kHc*h)LP6`svPD4lLj7@yZzjI2yZiWLIqnb+*Zz_ZBNJYaM);->U%sFTD;=M{$U-C&h@Mz7Yr1t*+jmaoNvr{LYnf`Le8qSNFLvj0r19qY5VW5o z;qbdeR{);&<_$7jR$q&t^--ue(P1!f>nB7gD))<>kCU=pa0d1oLeyo$z;PApHr8+# z9S_chG!=5Np&q(MK=vGk?QB`ym6o=={hw6G zb7T_bTy?wLQg}8#ntG(3{Tjn=NW)(fQG@|`U@UGg?b)9xk)Bz&RJ9H8ETSww>8L_k ztTaO`HO>!P<`hg;>=C4sciBbiTJ_eRhme zijasAO)Yd^n|xZR0JZvYys##jiUp1nVfj|rJ0L~y2y2L=UYRv)TdBGx&GXSFc(G%$ zWFJxwA6qOz6Vb^c?a*(rOKI&uEw!o-BQ*4`2Ag%nG_P`jG%4RyZFa`=w_2hlB{L^m z(NQZA!(tAI$$dFX$9Y*USpD%m#!-B6lcnX%iYuA;L*2D>*CfFwn*s521xe?6U%f0= zT!%v$xDof=&$|_jTc(-7pp6Fzv8Osyt~t;2R}@7UkUkxQvL|NElo6jVo~p|XV6b^S2d{-XFTk7ZFr%JA;^7x94Ap5Zp!Ng9g7TVDQX{JEm!%yGFuC8BK@d zK;HNj7ahasH8xfhA8u<4|411Yn_9MH2$v0Fr8$>&Gu>C2X#6N$tm8Nl^G7_zpW5&jCm?{zBk;22z=2T2vWmvR=b`GnkXX`)`n8~wyOPDDpV{^K8bJ}KVHW@{4 zOqLa=6m}awmgKIU8-BK2yklkE!gGi}>>6}poA_Q1a5=0MtBT$Jg1@hM*HFU}Qq6Lm zX@F-1m6koC$I_{CW4DJ&Qx0;AWy|NWgwo=%8a}Fi)f zvFcX0^TQ&ZFu*Ln?65%-Aq*?F23{Wg>62hQsu2?Fh^)JfOaqx@^NpPLUo1H^xuQ+X z%8~M_C%lZTC9^%%;Ctp5udT??H?K0*;F@hYm#t9h51B}_$~oMyC?;Yq9U5Wfv~2~7 zHhN8A9-2_>?7S0-u_p=VDt5HC7d=i|wA8C4@3$WNk?6!SsWW`@)uUXN9ke9mYzw~s zfuH*rbf6ezF#k*592>LYD)RdYLw>3@%nsbYSCZ8@MGJUpy1k_D(s(7}kbI#uS zxrvi5qO^mQXI!763n6^$I^wME9Z`nktCO$K3 zy<`}ERl#v};n9=?+)!{|Sd87yXT2Babat6c+iC2Nn@oP)KhxajS63*Be3%Qs7#ZXSN{d|Xk3)#pRP<RGG_d6+D9QBnFCXpTohKy6jn;tqmy@oKUM;o{!N9SXrVDA<%B(l^j^kFUWVbOj=IP$xE6X5Tr-_vq z@uMw}!_4U767~o7r*G4j7jkb%xs`FS)uSt{t?>~Y&Sj@VmUC?PA&n5LaumC*+bJ@0 z%N>pscnsQ&@z^pxS{N4PK^WxoT8ymHoiDy<{X!|}v3~BvLQXv<<@C(ePi9PmH6&4S zb*4FjXVCN2)^hXPuuF$s=+mwv$xrPOc+0BxW%yorzj+c@<`Qk5>=`4vi=oS&Uk)?B zHAD_%2nJ$erGf)`B$hn^*xkOTNxEm3LFdWi-q1{%O)nDzG3<9R!M={XLgu{0^~tu^tD+c>2Up5vWztyH)QVU+Vdn$kRv@pL+EUm1 zgk+bgIsOaL8}M*i2pk+kYBQT?V;a609C_@B7c}jGx~OW{8FS2%9#~G3HIm@6FwRKB!TmI1~am z_3qSfb$egAxiog&S?}yDo@NB*w&D;KT7MdE zLQ@RFgHM*b%y#=}y0WtfdZ&E-iP-EwP~q0@(X~LOpg38}XLhdHnzY`VC%bd?xa7U? zq*Hf}uxJ=d8`Tl#=i4=X-7HcKjhCW)duo$=O3nHyG`l@ipZCAvN}kMe?vFP*(7H?c zZnVN9!5hCd21UL#ANIqTRbC<+Z!_etlHE#m>XkXtGc13+*HjWA(u{q#=#m>}#Gk3) z&*BWhUs-yU&oT9y0*w2xh)l*$igYGkd;{-q`l)yH%>43bi0wD_h_Z%K?w;OtZXBae zgWc>|t^j$x$BfxpB~+7E_~Z_z0(=EaK(;4`UdvKkJq94_#6dGQklbBk^Dv$?h7rz? z;%bt*#ugDOWLdB%yP*%)jw=&%y(?lM@l(M$`+79aCc{XXUi6x9i=VDW4fh$i2y6Ft zM~Ebqu3x*lB82fSuzgxTRcS0I2JdFCUf;;!V|OVD;br5UE?$!QMoO!{A4Vh|R3qqb z7hhIuPy7rc$o?ZYDdyZ?g6pIctQ>yhv1*KJ z4pvgD^@$nmdDtmZY;q=81?ha(A!!gJ_cR|i*7poqJ=$J(@rtJGQNsZ{#^1~G#O1oOwL;;(5n+U=7{mE>@N!dK5iTFd=U#%RAHrBdKZDS(lqk|aT zRcFC|1&u^p-TCa^SZc11>q5=aXC5SM#wQTXf-z!Ro4#~^Zjm)W`@q_YR(e zjl;v78jJEep7Et|I3~7L?bekG`}+9P4g3c*XdZ__FLqz(ufB5Wfw=9^x8jL3?*+2~ z9CW5X@cP73;g{)x9`fPs+jQWIL1WDj9#Fl$`N6tPu!nV{Ibs3j2>Ej0EKy8meL>nh zq%z)ht0$Hfsl0#ves1IIqbb%NkPEz;^=z!Ni0kGWAw9*nSB-6bgEEO9ej3&C;5Tqn zYAT=kPh*P;(6my=Fm_UO>n#;QNNxt8W2YfPm{P|{7 z21dsl+<9R~$(u2X*(o#Wmr?~zWtJv|jK`$|_qk3Ve1z@Y<}kJ$Wou3|TrBGwr??}K zCo%!%aJABoRxJpDzM*i~)_f~TaFyBj!vFq?q`yc&*5PcAY`Hk268$vp15-Do&7gIm?)M*N;Q1D^~%g3VoXi5$L^q$^NyfrC;gRIlE-eSWom^iw2R8Z%ArjlL{-O1I*f9kvCN`^ThDYRi-X%S{H!3~ z(>jjR^T$sO6s6(LX&zX`=jiM*{bV`MxZ$L+*VGOO^Tg$SpkYikiYMr&rA&yX_E?Hb zTYGqsZf7r$goy_Hp2O zxyntK{DnB0dY9G577a80B|h1DLyt<|cU`PH>}XZhMPzg}ry8veO1^MukhXqo!9`?< z4OU$%ne+*|U&NfA_mZbBQQKu)RA#nntta#bs zW>g>yJSUfBVH8A%=if*--Rrl~{oY6cFKq9?lOO`y6f5>d+xBBsGMgTo>^YbX|DrfX zN#WM93f;26rl=u|UQ#~+ndiv~uQyh>rb>+8=A#&HaqT@eWw;(=;8c~2!6`3Q7S;;7 zSJc*Rn_6S;u;Hc7xA&}@!eL*;0A0(5Zwv0q6$TMEkhkpu1A)V9uleNpGiUWm|i`k6p^WU35J!P9g;TIx{Gmhs{Eop}77 zS?k2p>Fr@G<3uRD9zDPtscTh%h- z1`dVJ+z6_Jk@4FcM(l<1sJX+WEL{4cNH_VTEn+|C#u>ssMKi>pDc#6Ps!E* z9w^3FoA=IKE@E2^XAvzXuqL`xNaSMu=;%88DM^cH2)x4|6>>h1ew{k>>1&Jsf`4si*#QoI==T zbdc}%%Ak|O$U_hJ(Xdi`98q2p<~Bz4EPk290rZ*Lp>JO@k?5yU;*oH(qGr}aztQm; z*u7*MzpXX5?;b4^dM5R5y5-m2q-~295|9c@ z`EkcAzxB94o;}l3P&X3}SOJWSt>e3o$JEW!j2}I)FJAibx=2)-0pTmt`$27C4#ecr zCb2a0WH_JFyuCkGfN!eg<=e5dGc_*&2xRaHR(My8CYG0AZk=yBbol=C4fkYwx|g_? zy#JDco9@2(l#{=J7H?XZPr>KY`_qvRJBWpQuS3I|oive+MlQomD*oe2X_~YO)|zR| z@5u7eQEbsu#%xRw%@|^Z39A|e#tT|ztGCZ|x&>#7F~%-9gKm2c4}M%;{Bi9I1c23V z2V#^Dqn7WG(K+pz{XCXE+#V2#n*Mhw~iec=E5&a2Uu6AZ1ecm*zLfkv6FH14e zGR)-YfJE5BZ*>O+9q&m-rb-HH+tG=&0M>?}F+IU>M|Z5gX4yxkW|3=tF%L|wvvijS zpFWA3y`Q5}H(st%4V}pL8nQZk>>Vc!yl%A8PY^`bF@dzhISQVj>tzCEjGijEo!^~Tg|)8dE6eW>S`h&C5KfFuPmS`QVq zv(D7I3fT<1NqsLp@adoAaZ;hpWZ7KQfiSci%@)k0&rOOR&?UfXJ*uOp{Gp$JXtSuq zfpzI$^;c{p4pn@3;3oF1Z!oRWX)-6{fNNdW+{Z=8FWQ$HIOQ^uaPeEa>-v~!FK<9m zFf{I_L-Ek@^FQkfaF!(KI7Q(0W2afZ-YySN3w0QsKF@|gkA|vUAs=6(gv4wqN4D`u z#@p;_HBG*aaX3`f8V>LVo}4-kE4;8Fo1J##t4vcORteai$nQ9I;0W0NM0 z+Os&lXPeU%i1&V&CWfu_dA08mG9}*4`JwH-Tnp_Oa1E~a38N$sCA+OEWC}7QfE+ zZN42@Nl?jpeN>pyNLyeYnO4K1sHUm!)+F2^R_8ouI+f!2RR7)Kb+|Bl*nZ^{44N}u zXH~9wJhqu5?GHs)k0#C1IP?)c-J=Qa9dzJPsY&H7*RP25fszFf`A>GG$FnIgXgW6= z2`0XsAz||Fp1P%CJ5;J>Zyosa(5%a>T~}7XdYve~_VmM`-BkCu@*=DR8UJ04fb4Tr ze)^n6My5+iDL39m@9z!XzEJ)OIY!w?E4Za+!KZ*pow^S3+mG$}) zX|D(P`g1k1{V(kN4*+%WCcG+qzs<9Ks&02Wk4Kj9GFA?euV!3z`XQu=OdhndWtR>k z9*0}7cMa!PxB=j6e>&!9>dRP&gll!q$ai)mM&jiU;5rA)xuHCx^*dW)#vm&fP3o8? zSim7NOZ#rhO9dTP2DWMSs7U;dJybQGhYc}{X>fgRT$yGaEHq+^?i|zi*iP@pqb{lT zn=JWS%dS1i2iX_G+IglU5zg`5{H>X2CHPv9LVKFg$`n-v*aHJj5L#tqLu-yoj|39Y z^$J;j$>@o35FpVXijijuujiS~hP+~deUqj(TpzpORd@~!mtoj@D;Z~Yv|7H~$lxAu znIYpKTmV- ztDVIO7sd-;`zP-H#JiLZP~$)yf_ZC~4SCJh1#quMFoX1Yu-g^=b{y1j zfi@?%hP;~zE_%1InEd_Hkw|v5!O)hNrR^&7bNzaBrSyY398`0D%r5hQBGA|?!27tB zH{qazz}g+3TDPEkDI@3A>vGG?(1e%Ru(c3nlU3s+f+1EeYbU|a&`&_bXiBzdW;)5HJJAEy{yiq^{`B^0_oY{|p=dsebqU(y zWsf1MD2*mzH_(x}$<)OYr_Q`myTi#(z`;-Io&v`SV-a<-jVaUjk0w{Mz7M=6zGUPf z!dVvsGT1uxE0{3r(YNm!f4wD_EN}h7CuC-tY~HX30LNS{e;XR!iw9 zUOf;po2xzPl`!m=l2M|3w`}!61dMFHg^27)^M269RzFXuHR=B@4Wp(ifDl@R+s;jG zmKt8M2LMGaXd z<0UfTU%ls5R)^xD*XbTCJ@b(hf76>*V;*54@?B(QWgrWDX$_V0w5IDJAjD7yjp`MW zSsb17eBYE$RDap$*n91UsJn_Z=J8+_2_AD8J%4VX)nKk^&&Tg^jOPmmIgS)M`^b<> z53XzZ{fT{HvK4l>oty(Y(wAPk=T)B?JdvWuCst zJUxBUgz}Fb;eUvC8UqARBrg>*y8`sGHepM>H$VMqjx5JW~DP zI~<`48cRt^RFJm5Ua^zd$MpA6eGOE8DtSRQZ2-U^FHd)z_pY|E0v;E)gb2&;@XLQo zQoO$wLYdenH$SNW)ofJDo?Y;J0jR>42kUIz|I)I(OVj)8 zTmY-tOp-zoQU(D3v$L6ee_FbK(Y`MOkm1$3L+LjPu-~%yoP&`3(=DJ8%O=LZspLa* zfR6?21z{h>UuwV7j_hF}j|cd#JYEj{^Wp%|?jUELjwID?d(JHA*U9KmY1e3TE$~?h zn)4U;CIpt+KYoUoAE=Fbw40_sN^+|B_`%QjV>c7+DP^DQp4#KvW#CfS1Y^Y7H2vQP zvgXE5HsYAOzgZ>l`^3!y&sW)RVSr5 zvOr5{p3b4z{{|ubqoKX|w|||VpB@#LPp97^41X@(rV7lzRH=d=Ls^~$q4O!z!lBsX zV5C`VYD)Wzax%e1!byS@I{r9O(IbbgAKO51@DY|}mf&v`jo%cVxb1E}tN%uixX;3@ zF5(wBWUc74$FF`}EA|&L`ksorY zbQ^+z2d+-4V52b+6v;)xPR__!Bl#aW*|Aj++2u+Byl+w~h}KQnHOAQo5|0+?bX+rWh(B^B~<;&OZML7SDF?-mfK|L$c}OR&wg4fCm_WB> zElYF3QMhVDW8Cy#t+n4R%DzN05b+I-7b2~xqVOd8i(KUBbT5_M)VR20O08mza%i(Y z-N?%q)gQ!ZxO1F{E&P@_^xVJ42+-Be64KY+v-zv>iF`{y>mlrsrM~Nbk)2=iVsI05 zbnAj0oRdJi2mU25M?2PKFWTh8^;`;zZ9U6rlm1@YQl~BMj;CMQ&XiMb6DxsYN9EFA zNtyEw@*NnK@~-}5KcG`Uw)LoflJfTnBBZyuCh@nS_&v_)-M?HkWqJ9(YQ!ImQ!!wb zMk&1S{nuFj%~$|aTq@z0;YtV(|J!u`UFQv8cZym6;*|cO6~MCc0-rqOV_^6fejBKZ z3CO;wzj)S|PS~TyOim7CtyUX>!6wFSPyX!h{)zNO!VKc)g!KH&ncA>5Td#KT{%lmkOD+VOvE3=CFU^m>I~MEu1yQw-o-*AN>Xl|JY_O z8#%SZ)qrOdR|%6d`m?kY>oDY#PyT8bepfdG@P<0I!08|M8vfi%Kx$v592*+D?XD)= z>lbO3HWwk3kzRvo=dBl$+5Ahj3j{{MT4Hpw;-C8?l|Bflm77jqS!OKX+A_wTiNjCdtYlrjUrV8W+lf1T97 z`SSH;As3i_ldVmhSf==Zypi-udoa~M^G3e?3npG_w)>Y)KKb2{A6<6@mB(W~ zdH`aCEBxEAYNvO`6->zJoMvT86M^DnnBN4;Q98UB!q7|#{WFKz6b=MrZjV?+r{7$; zt5??jXvmje?zesVYsqgAn4FPb$Yjxf{)l;o0DnW}vOiy(eW1(*;737L^?Bj5Hy{2V DaAFsS literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/serverlog-connector.png b/docs/management/connectors/images/serverlog-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..983bb6afadd65b3da5f1137f586008de040eabf5 GIT binary patch literal 68666 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

    Es!kB5#4ojLknB7r@QxHMP` zGh3$A^Q^7iBMrhSwVLKN98%!bWBnU{aIj6|jclJ{kq!1wl#Ct+JC{muJ?75VQpUyW z6sT?Jm$&H_R&w%LnoA^sK(i{X8=gK1cBja)w}aB+(;@Z}H;0;s-3H&>?0r_{XndWs zYs3gN66-rRSwSc(snX7bBO;=TMzr|}GeCkhVdFsW9Cvrp;Yd*-*w4y@6K3RW<6;iU z^Lib7X>5Rb;ZVTiYjrWBC@@d#h8`uRb}1X}W?}@IwlZ|B`8!9CGAYZH(pTl?32u3< zVO_GBEEBa@++wB+{iYd9?-ILcr)T%{qcXWVD$G>w3Z3NV%NgS*8}~1m``p+DZ1~fR zVv|t-+#>e+M%Ts-qhmYYu@qca+-jE#$l|)&s7mP;pxtIoQSuv)uB=i~pr@(yz#1u- z2w`zGOwZO~6u!x_C3Sl!&zFICS=RGY-Q_e$@GdlYtUPrL|{YM*avjj?BS-| z&u%s@xIiW1;Ic@w>HvZ(r*9IHs;F4s5}vgUkGU&NrK;-9Cg{5B#k0fx!~;|p^QRZ( zwK5q@I0F7@f81%t&iq_%@yD*w#P|a3uP3+Qtqt)6>#co){K=%nk$~;5QReIVSVNH( zL%sb<;F?$6>dLT%UNQKf2?^+Y8vgnb|0At@s2%+miL0f-KY;qz^B4Ld>yAa?(#77v zs6JJ)e=IKgvTX~bKQSj{d72};jf~%~smm%P&dCWp3iSdxBp~J%^lZ!DajZ2sQ-+$C zC2<0^e$*&@4t)`U2&!&e68Y`b$zu)tDqmeSv=Au0_A7m{0{q$Nflv<(M5nEt{ckw1 zT@(-l+EXtLIq#czvNhRuE`~r_p9(xw23mf+zTf({aZZ{96eeF=Z2Og0^s%`4u7(A1 zPFnaa0aZcaX%Jkjg|3PKxIh||nDEA6BSHMo=;d_WnUEWv>NW@IDOhO%&tXiVR~;-R zaaAw;7sPIOf(RnW#k6nUpiPVLjOG{c^U&6HO9obm=>Wj7BPerf#MI`j&gNPHoD)yO z_vra`IoXrZ`AViYj;8l-#$QO$8cgh3)f$mqaY5XIQtC!vo82qO%*}Fs3B^3Iy%rl;4p|REIWF43 zb??!gtI+%xxEe_AeOV4If;2S+ZJ*ve3|X`HTMawi9ojUVu`3$lhyABdL_qjoT=zg< t1nWNW@;=mLYYIAo*1wHo8G$Q8O&PCjyswjEAwR~SY%Co1m70;_{saw@t^NQ2 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/serverlog-params-test.png b/docs/management/connectors/images/serverlog-params-test.png new file mode 100644 index 0000000000000000000000000000000000000000..762721c7ead453272135c136e3cb1fcd4fb2d899 GIT binary patch literal 120530 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 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/servicenow-connector.png b/docs/management/connectors/images/servicenow-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..9891a80ee758fec2abf750219116b4ac571d8df5 GIT binary patch literal 158511 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�ASVqhy9WKd33LF;4$o{40TEsvm&$OGiF3A(F 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 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/servicenow-params-test.png b/docs/management/connectors/images/servicenow-params-test.png new file mode 100644 index 0000000000000000000000000000000000000000..79f1580c873d2647de495089041ac11814011ada GIT binary patch literal 184611 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%0A2B?K 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'&rQ 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/servicenow-sir-connector.png b/docs/management/connectors/images/servicenow-sir-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb137bd4f7d96977da185d5722e695aafbd18c8 GIT binary patch literal 159898 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 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/servicenow-sir-params-test.png b/docs/management/connectors/images/servicenow-sir-params-test.png new file mode 100644 index 0000000000000000000000000000000000000000..16ea83c60b3c328f4580bdd08d4f2544e8c8cffc GIT binary patch literal 190659 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%0AwWoSpN;xE=Y5Ue-?=mI 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 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/slack-add-webhook-integration.png b/docs/management/connectors/images/slack-add-webhook-integration.png similarity index 100% rename from docs/user/alerting/images/slack-add-webhook-integration.png rename to docs/management/connectors/images/slack-add-webhook-integration.png diff --git a/docs/management/connectors/images/slack-connector.png b/docs/management/connectors/images/slack-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..7342d962d2a2bb3b75c4dba8f07ef9b92cdf579d GIT binary patch literal 123918 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 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/teams-add-webhook-integration.png b/docs/management/connectors/images/teams-add-webhook-integration.png similarity index 100% rename from docs/user/alerting/images/teams-add-webhook-integration.png rename to docs/management/connectors/images/teams-add-webhook-integration.png diff --git a/docs/management/connectors/images/teams-connector.png b/docs/management/connectors/images/teams-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9112db28474df04fb657ac2ee77a201df71e7f GIT binary patch literal 148549 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

    Ywc$`-`=j_5QLi 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 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/teams-copy-webhook-url.png b/docs/management/connectors/images/teams-copy-webhook-url.png similarity index 100% rename from docs/user/alerting/images/teams-copy-webhook-url.png rename to docs/management/connectors/images/teams-copy-webhook-url.png diff --git a/docs/management/connectors/images/teams-params-test.png b/docs/management/connectors/images/teams-params-test.png new file mode 100644 index 0000000000000000000000000000000000000000..01efb84ae60d462b1d3973838f698615d2083b3f GIT binary patch literal 144338 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 Ef7j7dQ~&?~ literal 0 HcmV?d00001 diff --git a/docs/management/connectors/images/webhook-connector.png b/docs/management/connectors/images/webhook-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..6046572734afd32a0dc96c91bbf91d930cf28a83 GIT binary patch literal 193110 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

    X07WgJh}7dAWQ(Umt0H3eXJUm5_#_SyV<7lenb% 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 literal 0 HcmV?d00001 diff --git a/docs/management/connectors/index.asciidoc b/docs/management/connectors/index.asciidoc new file mode 100644 index 0000000000000..ea4fa46d3e808 --- /dev/null +++ b/docs/management/connectors/index.asciidoc @@ -0,0 +1,11 @@ +include::action-types/email.asciidoc[] +include::action-types/resilient.asciidoc[] +include::action-types/index.asciidoc[] +include::action-types/jira.asciidoc[] +include::action-types/teams.asciidoc[] +include::action-types/pagerduty.asciidoc[] +include::action-types/server-log.asciidoc[] +include::action-types/servicenow.asciidoc[] +include::action-types/slack.asciidoc[] +include::action-types/webhook.asciidoc[] +include::pre-configured-connectors.asciidoc[] diff --git a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc b/docs/management/connectors/pre-configured-connectors.asciidoc similarity index 99% rename from docs/user/alerting/action-types/pre-configured-connectors.asciidoc rename to docs/management/connectors/pre-configured-connectors.asciidoc index 557404f24288a..4d304cdd6c5a2 100644 --- a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc +++ b/docs/management/connectors/pre-configured-connectors.asciidoc @@ -1,6 +1,5 @@ [role="xpack"] [[pre-configured-connectors]] - === Preconfigured connectors You can preconfigure a connector to have all the information it needs prior to startup by adding it to the `kibana.yml` file. diff --git a/docs/management/alerting/images/rules-and-connectors-ui.png b/docs/management/images/rules-and-connectors-ui.png similarity index 100% rename from docs/management/alerting/images/rules-and-connectors-ui.png rename to docs/management/images/rules-and-connectors-ui.png diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc deleted file mode 100644 index b648f5a9ccde5..0000000000000 --- a/docs/user/alerting/action-types.asciidoc +++ /dev/null @@ -1,75 +0,0 @@ -[role="xpack"] -[[action-types]] -== Connectors and actions - -Connectors provide a central place to store connection information for services and integrations with third party systems. Actions are instantiations of a connector that are linked to rules and run as background tasks on the {kib} server when rule conditions are met. {kib} provides the following types of connectors: - -[cols="2"] -|=== - -a| <> - -| Send email from your server. - -a| <> - -| Create an incident in IBM Resilient. - -a| <> - -| Index data into Elasticsearch. - -a| <> - -| Create an incident in Jira. - -a| <> - -| Send a message to a Microsoft Teams channel. - -a| <> - -| Send an event in PagerDuty. - -a| <> - -| Add a message to a Kibana log. - -a| <> - -| Create an incident in ServiceNow. - -a| <> - -| Send a message to a Slack channel or user. - -a| <> - -| Send a request to a web service. -|=== - -[NOTE] -============================================== -Some connector types are paid commercial features, while others are free. -For a comparison of the Elastic subscription levels, -see https://www.elastic.co/subscriptions[the subscription page]. -============================================== - -[float] -[[create-connectors]] -=== Preconfigured connectors - -For out-of-the-box and standardized connectors, you can <> -before {kib} starts. - -include::action-types/email.asciidoc[] -include::action-types/resilient.asciidoc[] -include::action-types/index.asciidoc[] -include::action-types/jira.asciidoc[] -include::action-types/teams.asciidoc[] -include::action-types/pagerduty.asciidoc[] -include::action-types/server-log.asciidoc[] -include::action-types/servicenow.asciidoc[] -include::action-types/slack.asciidoc[] -include::action-types/webhook.asciidoc[] -include::action-types/pre-configured-connectors.asciidoc[] diff --git a/docs/user/alerting/alerting-getting-started.asciidoc b/docs/user/alerting/alerting-getting-started.asciidoc index 2c8985075398e..bb11d2a0be423 100644 --- a/docs/user/alerting/alerting-getting-started.asciidoc +++ b/docs/user/alerting/alerting-getting-started.asciidoc @@ -5,7 +5,7 @@ -- -Alerting allows you to define *rules* to detect complex conditions within different {kib} apps and trigger actions when those conditions are met. Alerting is integrated with {observability-guide}/create-alerts.html[*Observability*], {security-guide}/prebuilt-rules.html[*Security*], <> and {ml-docs}/ml-configuring-alerts.html[*{ml-app}*], can be centrally managed from the <> UI, and provides a set of built-in <> and <> (known as stack rules) for you to use. +Alerting allows you to define *rules* to detect complex conditions within different {kib} apps and trigger actions when those conditions are met. Alerting is integrated with {observability-guide}/create-alerts.html[*Observability*], {security-guide}/prebuilt-rules.html[*Security*], <> and {ml-docs}/ml-configuring-alerts.html[*{ml-app}*], can be centrally managed from the <> UI, and provides a set of built-in <> and <> (known as stack rules) for you to use. image::images/alerting-overview.png[Rules and Connectors UI] @@ -47,7 +47,7 @@ to control the details of the conditions to detect. For example, an <> lets you specify the index to query, an aggregation field, and a time window, but the details of the underlying {es} query are hidden. -See <> for the types of rules provided by {kib} and how they express their conditions. +See <> and <> for the types of rules provided by {kib} and how they express their conditions. [float] [[alerting-concepts-scheduling]] diff --git a/docs/user/alerting/domain-specific-rules.asciidoc b/docs/user/alerting/domain-specific-rules.asciidoc new file mode 100644 index 0000000000000..f509f9e528823 --- /dev/null +++ b/docs/user/alerting/domain-specific-rules.asciidoc @@ -0,0 +1,20 @@ +[role="xpack"] +[[domain-specific-rules]] +== Domain-specific rules + +For domain-specific rules, refer to the documentation for that app. +{kib} supports these rules: + +* {observability-guide}/create-alerts.html[Observability rules] +* {security-guide}/prebuilt-rules.html[Security rules] +* <> +* {ml-docs}/ml-configuring-alerts.html[{ml-cap} rules] beta:[] + +[NOTE] +============================================== +Some rule types are subscription features, while others are free features. +For a comparison of the Elastic subscription levels, +see {subscriptions}[the subscription page]. +============================================== + +include::map-rules/geo-rule-types.asciidoc[] diff --git a/docs/management/alerting/images/bulk-mute-disable.png b/docs/user/alerting/images/bulk-mute-disable.png similarity index 100% rename from docs/management/alerting/images/bulk-mute-disable.png rename to docs/user/alerting/images/bulk-mute-disable.png diff --git a/docs/management/alerting/images/follower_indices.png b/docs/user/alerting/images/follower_indices.png similarity index 100% rename from docs/management/alerting/images/follower_indices.png rename to docs/user/alerting/images/follower_indices.png diff --git a/docs/management/alerting/images/individual-mute-disable.png b/docs/user/alerting/images/individual-mute-disable.png similarity index 100% rename from docs/management/alerting/images/individual-mute-disable.png rename to docs/user/alerting/images/individual-mute-disable.png diff --git a/docs/management/alerting/images/rule-details-alert-muting.png b/docs/user/alerting/images/rule-details-alert-muting.png similarity index 100% rename from docs/management/alerting/images/rule-details-alert-muting.png rename to docs/user/alerting/images/rule-details-alert-muting.png diff --git a/docs/management/alerting/images/rule-details-alerts-active.png b/docs/user/alerting/images/rule-details-alerts-active.png similarity index 100% rename from docs/management/alerting/images/rule-details-alerts-active.png rename to docs/user/alerting/images/rule-details-alerts-active.png diff --git a/docs/management/alerting/images/rule-details-alerts-inactive.png b/docs/user/alerting/images/rule-details-alerts-inactive.png similarity index 100% rename from docs/management/alerting/images/rule-details-alerts-inactive.png rename to docs/user/alerting/images/rule-details-alerts-inactive.png diff --git a/docs/management/alerting/images/rule-details-disabling.png b/docs/user/alerting/images/rule-details-disabling.png similarity index 100% rename from docs/management/alerting/images/rule-details-disabling.png rename to docs/user/alerting/images/rule-details-disabling.png diff --git a/docs/management/alerting/images/rule-details-muting.png b/docs/user/alerting/images/rule-details-muting.png similarity index 100% rename from docs/management/alerting/images/rule-details-muting.png rename to docs/user/alerting/images/rule-details-muting.png diff --git a/docs/user/alerting/images/rules-and-connectors-ui.png b/docs/user/alerting/images/rules-and-connectors-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..3a464fa7cf3755864bea01f048f3411dad4021f4 GIT binary patch literal 281417 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

    +0i$}0%XeZT`nY>smr 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%0A${uRKxF~ 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

    VY5>WX8^ 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 literal 0 HcmV?d00001 diff --git a/docs/management/alerting/images/rules-filter-by-action-type.png b/docs/user/alerting/images/rules-filter-by-action-type.png similarity index 100% rename from docs/management/alerting/images/rules-filter-by-action-type.png rename to docs/user/alerting/images/rules-filter-by-action-type.png diff --git a/docs/management/alerting/images/rules-filter-by-search.png b/docs/user/alerting/images/rules-filter-by-search.png similarity index 100% rename from docs/management/alerting/images/rules-filter-by-search.png rename to docs/user/alerting/images/rules-filter-by-search.png diff --git a/docs/management/alerting/images/rules-filter-by-type.png b/docs/user/alerting/images/rules-filter-by-type.png similarity index 100% rename from docs/management/alerting/images/rules-filter-by-type.png rename to docs/user/alerting/images/rules-filter-by-type.png diff --git a/docs/user/alerting/index.asciidoc b/docs/user/alerting/index.asciidoc index a29ca1c4ca012..f8a5aacce8f0e 100644 --- a/docs/user/alerting/index.asciidoc +++ b/docs/user/alerting/index.asciidoc @@ -1,5 +1,7 @@ include::alerting-getting-started.asciidoc[] include::defining-rules.asciidoc[] -include::action-types.asciidoc[] -include::rule-types.asciidoc[] +include::rule-management.asciidoc[] +include::rule-details.asciidoc[] +include::stack-rules.asciidoc[] +include::domain-specific-rules.asciidoc[] include::alerting-troubleshooting.asciidoc[] diff --git a/docs/management/alerting/rule-details.asciidoc b/docs/user/alerting/rule-details.asciidoc similarity index 99% rename from docs/management/alerting/rule-details.asciidoc rename to docs/user/alerting/rule-details.asciidoc index a893db280c7f7..6e743595e5c33 100644 --- a/docs/management/alerting/rule-details.asciidoc +++ b/docs/user/alerting/rule-details.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[rule-details]] -=== Rule details +== Rule details The *Rule details* page tells you about the state of the rule and provides granular control over the actions it is taking. diff --git a/docs/management/alerting/rule-management.asciidoc b/docs/user/alerting/rule-management.asciidoc similarity index 74% rename from docs/management/alerting/rule-management.asciidoc rename to docs/user/alerting/rule-management.asciidoc index b43dc9eb635e9..b908bd03b0992 100644 --- a/docs/management/alerting/rule-management.asciidoc +++ b/docs/user/alerting/rule-management.asciidoc @@ -1,6 +1,6 @@ [role="xpack"] [[alert-management]] -=== Managing Rules +== Managing rules The *Rules* tab provides a cross-app view of alerting. Different {kib} apps like {observability-guide}/create-alerts.html[*Observability*], {security-guide}/prebuilt-rules.html[*Security*], <> and <> can offer their own rules. The *Rules* tab provides a central place to: @@ -10,12 +10,12 @@ The *Rules* tab provides a cross-app view of alerting. Different {kib} apps like * Drill-down to <> [role="screenshot"] -image:management/alerting/images/rules-and-connectors-ui.png[Example rule listing in the Rules and Connectors UI] +image:images/rules-and-connectors-ui.png[Example rule listing in the Rules and Connectors UI] For more information on alerting concepts and the types of rules and connectors available, see <>. [float] -==== Finding rules +=== Finding rules The *Rules* tab lists all rules in the current space, including summary information about their execution frequency, tags, and type. @@ -36,23 +36,28 @@ image::images/rules-filter-by-action-type.png[Filtering the rule list by type of [float] [[create-edit-rules]] -==== Creating and editing rules +=== Creating and editing rules -Many rules must be created within the context of a {kib} app like <>, <>, or <>, but others are generic. Generic rule types can be created in the *Rules* management UI by clicking the *Create* button. This will launch a flyout that guides you through selecting a rule type and configuring its properties. Refer to <> for details on what types of rules are available and how to configure them. +Many rules must be created within the context of a {kib} app like <>, <>, or <>, but others are generic. Generic rule types can be created in the *Rules* management UI by clicking the *Create* button. This will launch a flyout that guides you through selecting a rule type and configuring its properties. Refer to <> for details on what types of rules are available and how to configure them. After a rule is created, you can re-open the flyout and change a rule's properties by clicking the *Edit* button shown on each row of the rule listing. [float] [[controlling-rules]] -==== Controlling rules +=== Controlling rules The rule listing allows you to quickly mute/unmute, disable/enable, and delete individual rules by clicking the action button. [role="screenshot"] -image:management/alerting/images/individual-mute-disable.png[The actions button allows an individual rule to be muted, disabled, or deleted] +image:images/individual-mute-disable.png[The actions button allows an individual rule to be muted, disabled, or deleted] These operations can also be performed in bulk by multi-selecting rules and clicking the *Manage rules* button: [role="screenshot"] -image:management/alerting/images/bulk-mute-disable.png[The Manage rules button lets you mute/unmute, enable/disable, and delete in bulk] +image:images/bulk-mute-disable.png[The Manage rules button lets you mute/unmute, enable/disable, and delete in bulk] + +[float] +=== Required permissions + +Access to rules is granted based on your privileges to alerting-enabled features. See <> for more information. diff --git a/docs/user/alerting/rule-types.asciidoc b/docs/user/alerting/stack-rules.asciidoc similarity index 58% rename from docs/user/alerting/rule-types.asciidoc rename to docs/user/alerting/stack-rules.asciidoc index 44a22c548757c..483834c78806e 100644 --- a/docs/user/alerting/rule-types.asciidoc +++ b/docs/user/alerting/stack-rules.asciidoc @@ -1,14 +1,11 @@ [role="xpack"] -[[rule-types]] -== Rules +[[stack-rules]] +== Stack rule types Kibana provides two types of rules: * Stack rules, which are built into {kib} -* Domain-specific rules, which are registered by {kib} apps. - -[float] -==== Standard stack rules +* <>, which are registered by {kib} apps. {kib} provides two stack rules: @@ -18,17 +15,6 @@ Kibana provides two types of rules: Users require the `all` privilege to access the *Stack Rules* feature and create and edit rules. See <> for more information. -[float] -==== Domain-specific rules - -For domain-specific rules, refer to the documentation for that app. -{kib} supports these rules: - -* {observability-guide}/create-alerts.html[Observability rules] -* {security-guide}/prebuilt-rules.html[Security rules] -* <> -* {ml-docs}/ml-configuring-alerts.html[{ml-cap} rules] beta:[] - [NOTE] ============================================== Some rule types are subscription features, while others are free features. @@ -39,4 +25,3 @@ see {subscriptions}[the subscription page]. include::stack-rules/index-threshold.asciidoc[] include::stack-rules/es-query.asciidoc[] -include::map-rules/geo-rule-types.asciidoc[] diff --git a/docs/user/index.asciidoc b/docs/user/index.asciidoc index 81ded1e54d8fd..47d86004fdc66 100644 --- a/docs/user/index.asciidoc +++ b/docs/user/index.asciidoc @@ -29,6 +29,8 @@ include::ml/index.asciidoc[] include::graph/index.asciidoc[] +include::alerting/index.asciidoc[] + include::{kib-repo-dir}/observability/index.asciidoc[] include::{kib-repo-dir}/apm/index.asciidoc[] @@ -45,8 +47,6 @@ include::{kib-repo-dir}/fleet/fleet.asciidoc[] include::reporting/index.asciidoc[] -include::alerting/index.asciidoc[] - include::api.asciidoc[] include::plugins.asciidoc[] diff --git a/docs/user/management.asciidoc b/docs/user/management.asciidoc index 7c73a80362eb6..83e18734f65d4 100644 --- a/docs/user/management.asciidoc +++ b/docs/user/management.asciidoc @@ -78,9 +78,9 @@ You can add and remove remote clusters, and check their connectivity. [cols="50, 50"] |=== -| <> -| Centrally manage your rules across {kib}. Create and manage reusable -connectors for triggering actions. +| <> +| Centrally <> across {kib}. Create and <> for triggering actions. | <> | Monitor the generation of reports—PDF, PNG, and CSV—and download reports that you previously generated. @@ -182,16 +182,10 @@ next major version of {es}, and then reindex, if needed. include::{kib-repo-dir}/management/advanced-options.asciidoc[] -include::{kib-repo-dir}/management/alerting/rules-and-connectors-intro.asciidoc[] - -include::{kib-repo-dir}/management/alerting/rule-management.asciidoc[] - -include::{kib-repo-dir}/management/alerting/rule-details.asciidoc[] - -include::{kib-repo-dir}/management/alerting/connector-management.asciidoc[] - include::{kib-repo-dir}/management/managing-beats.asciidoc[] +include::{kib-repo-dir}/management/action-types.asciidoc[] + include::{kib-repo-dir}/management/managing-fields.asciidoc[] include::{kib-repo-dir}/management/managing-licenses.asciidoc[] @@ -202,14 +196,14 @@ include::{kib-repo-dir}/management/rollups/create_and_manage_rollups.asciidoc[] include::{kib-repo-dir}/management/managing-saved-objects.asciidoc[] -include::{kib-repo-dir}/management/managing-tags.asciidoc[] - include::security/index.asciidoc[] include::{kib-repo-dir}/management/snapshot-restore/index.asciidoc[] include::{kib-repo-dir}/spaces/index.asciidoc[] +include::{kib-repo-dir}/management/managing-tags.asciidoc[] + include::{kib-repo-dir}/management/upgrade-assistant/index.asciidoc[] include::{kib-repo-dir}/management/watcher-ui/index.asciidoc[] diff --git a/docs/user/monitoring/kibana-alerts.asciidoc b/docs/user/monitoring/kibana-alerts.asciidoc index 2944921edd2ee..58bf419d8d54a 100644 --- a/docs/user/monitoring/kibana-alerts.asciidoc +++ b/docs/user/monitoring/kibana-alerts.asciidoc @@ -20,7 +20,7 @@ analyze past performance. You can also modify active alerts. image::user/monitoring/images/monitoring-kibana-alerts.png["Kibana alerts in the Stack Monitoring app"] To review and modify all the available alerts, use -<> in *{stack-manage-app}*. +<> in *{stack-manage-app}*. [discrete] [[kibana-alerts-cpu-threshold]] diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 1696db23d2278..0ecfc152197d3 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -249,10 +249,10 @@ export class DocLinksService { guide: `${ELASTIC_WEBSITE_URL}guide/en/observability/${DOC_LINK_VERSION}/index.html`, }, alerting: { - guide: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/managing-alerts-and-actions.html`, + guide: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/alert-management.html`, actionTypes: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/action-types.html`, emailAction: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/email-action-type.html`, - emailActionConfig: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/email-action-type.html#configuring-email`, + emailActionConfig: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/email-action-type.html`, generalSettings: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/alert-action-settings-kb.html#general-alert-action-settings`, indexAction: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/index-action-type.html`, esQuery: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/rule-type-es-query.html`, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/home.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/home.test.tsx index 3d71d5404da2b..0e1c27c1e6768 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/home.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/home.test.tsx @@ -37,7 +37,7 @@ describe('home', () => { const documentationLink = wrapper.find('[data-test-subj="documentationLink"]'); expect(documentationLink.exists()).toBeTruthy(); expect(documentationLink.first().prop('href')).toEqual( - 'https://www.elastic.co/guide/en/kibana/mocked-test-branch/managing-alerts-and-actions.html' + 'https://www.elastic.co/guide/en/kibana/mocked-test-branch/alert-management.html' ); }); }); From 44eda0fa736bb3d552c22b1e66e465aded8c38fe Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 20 Apr 2021 01:32:39 +0100 Subject: [PATCH 66/82] [SecuritySolution] Timeline http endpoints (#95036) * add notes and pinned events routes * add api endpoints on client side * add apis * fix get all timelines * add decodeResponseFavoriteTimeline * rm apolloClient * fix unit tests * remove unused routes * update cypress task * fix integration tests * clean up type dependency * fix types * update snapshot * remove graphql types dependency * fix types * remove graphql queries * remove unused i18n * fix types * fix delete timelines * fix types and rewrite timeline integration tests * add readme * fix unit test * fix unit test * update package.json * rm x-pack/yarn.lock * fix tests * update yarn.lock * update yarn.lock * rm unused dependency * fix types * fix unit test * update query params for getAllTimelines * fix integration test * wrap JSON.stringify with try/catch * fix lint error * fix type * wrap JSON.stringify with try/catch * fix unit test * review * review * review Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 21 - .../security_solution/common/constants.ts | 5 + .../common/graphql/root/schema.gql.ts | 19 - .../common/graphql/shared/schema.gql.ts | 92 - .../security_solution/index.ts | 6 + .../common/search_strategy/timeline/index.ts | 147 +- .../common/types/timeline/index.ts | 245 +- .../common/types/timeline/note/index.ts | 62 + .../types/timeline/pinned_event/index.ts | 25 + .../cypress/tasks/api_calls/notes.ts | 15 +- .../cypress/tasks/api_calls/timelines.ts | 20 +- .../security_solution/public/app/app.tsx | 44 +- .../security_solution/public/app/index.tsx | 9 +- .../security_solution/public/app/types.ts | 3 +- .../user_action_markdown.test.tsx | 6 - .../index.test.tsx | 17 +- .../error_toast_dispatcher/index.test.tsx | 17 +- .../components/event_details/columns.tsx | 3 +- .../components/event_details/helpers.tsx | 3 +- .../components/generic_downloader/index.tsx | 3 +- .../common/components/inspect/index.test.tsx | 25 +- .../get_criteria_from_network_type.test.ts | 2 +- .../get_criteria_from_network_type.ts | 2 +- .../ml/criteria/network_to_criteria.test.ts | 2 +- .../ml/criteria/network_to_criteria.ts | 2 +- .../get_anomalies_network_table_columns.tsx | 2 +- .../ml/tables/network_equality.test.ts | 2 +- .../public/common/components/ml/types.ts | 2 +- .../components/paginated_table/helpers.ts | 2 +- .../components/paginated_table/index.test.tsx | 2 +- .../components/sourcerer/index.test.tsx | 29 +- .../components/stat_items/index.test.tsx | 9 +- .../super_date_picker/index.test.tsx | 17 +- .../common/components/top_n/index.test.tsx | 9 +- .../url_state/initialize_redux_by_url.tsx | 2 - .../common/components/url_state/types.ts | 3 - .../components/url_state/use_url_state.tsx | 3 - .../anomalies_query_tab_body/types.ts | 2 +- .../anomalies_query_tab_body/utils.ts | 2 +- .../common/containers/errors/index.test.tsx | 108 - .../public/common/containers/errors/index.tsx | 57 - .../common/containers/errors/translations.ts | 22 - .../public/common/containers/helpers.ts | 3 - .../common/containers/query_template.tsx | 87 - .../containers/query_template_paginated.tsx | 103 - .../containers/sourcerer/index.test.tsx | 25 +- .../public/common/lib/compose/helpers.test.ts | 40 - .../public/common/lib/compose/helpers.ts | 26 - .../common/lib/compose/kibana_compose.tsx | 37 - .../public/common/lib/lib.ts | 39 - .../mock/endpoint/app_context_render.tsx | 14 +- .../public/common/mock/test_providers.tsx | 31 +- .../public/common/mock/timeline_results.ts | 3316 ++++--- .../public/common/store/store.ts | 3 - .../public/common/utils/apollo_context.ts | 20 - .../public/common/utils/route/types.ts | 2 +- .../utils/timeline/use_timeline_click.tsx | 5 +- .../components/alerts_table/actions.test.tsx | 31 +- .../components/alerts_table/actions.tsx | 22 +- .../components/alerts_table/helpers.ts | 2 +- .../investigate_in_timeline_action.tsx | 5 - .../components/alerts_table/types.ts | 5 +- .../detection_engine.test.tsx | 9 +- .../rules/details/index.test.tsx | 9 +- .../public/graphql/introspection.json | 7647 ----------------- .../security_solution/public/graphql/types.ts | 2435 ------ .../authentications_table/index.test.tsx | 17 +- .../components/hosts_table/index.test.tsx | 46 +- .../public/hosts/pages/hosts.test.tsx | 9 +- .../public/hosts/store/model.ts | 4 +- .../public/lazy_application_dependencies.tsx | 3 +- .../network/components/details/index.test.tsx | 19 +- .../point_tool_tip_content.test.tsx | 2 +- .../map_tool_tip/point_tool_tip_content.tsx | 2 +- .../flow_direction_select.test.tsx | 3 +- .../flow_controls/flow_direction_select.tsx | 3 +- .../flow_controls/flow_target_select.test.tsx | 3 +- .../flow_controls/flow_target_select.tsx | 3 +- .../index.test.tsx | 2 +- .../flow_target_select_connected/index.tsx | 2 +- .../components/kpi_network/index.test.tsx | 17 +- .../network_dns_table/index.test.tsx | 46 +- .../is_ptr_included.test.tsx | 3 +- .../network_http_table/index.test.tsx | 46 +- .../index.test.tsx | 58 +- .../network_top_n_flow_table/index.test.tsx | 50 +- .../components/tls_table/index.test.tsx | 46 +- .../components/users_table/index.test.tsx | 54 +- .../public/network/containers/tls/index.tsx | 2 +- .../public/network/containers/users/index.tsx | 2 +- .../network/pages/details/index.test.tsx | 19 +- .../public/network/pages/details/index.tsx | 7 +- .../public/network/pages/index.tsx | 2 +- .../public/network/pages/network.test.tsx | 9 +- .../components/overview_host/index.test.tsx | 17 +- .../overview_network/index.test.tsx | 17 +- .../components/recent_timelines/index.tsx | 11 +- .../overview/components/sidebar/sidebar.tsx | 7 +- .../security_solution/public/plugin.tsx | 27 +- .../components/flyout/index.test.tsx | 2 - .../components/open_timeline/helpers.test.ts | 39 +- .../components/open_timeline/helpers.ts | 101 +- .../components/open_timeline/index.test.tsx | 406 +- .../components/open_timeline/index.tsx | 22 +- .../open_timeline_modal/index.test.tsx | 21 +- .../open_timeline_modal_button.test.tsx | 19 +- .../components/open_timeline/types.ts | 2 +- .../host_details/expandable_host.test.tsx | 18 +- .../components/side_panel/index.test.tsx | 49 +- .../body/column_headers/column_header.tsx | 2 +- .../body/column_headers/header/helpers.ts | 2 +- .../body/column_headers/header/index.test.tsx | 2 +- .../body/column_headers/index.test.tsx | 2 +- .../components/timeline/body/sort/index.ts | 2 +- .../body/sort/sort_indicator.test.tsx | 2 +- .../timeline/body/sort/sort_indicator.tsx | 2 +- .../pinned_tab_content/index.test.tsx | 2 +- .../timeline/properties/helpers.tsx | 3 - .../properties/new_template_timeline.test.tsx | 9 +- .../timeline/query_tab_content/index.test.tsx | 2 +- .../selectable_timeline/index.test.tsx | 4 +- .../timeline/selectable_timeline/index.tsx | 3 +- .../containers/all/index.gql_query.ts | 81 - .../public/timelines/containers/all/index.tsx | 113 +- .../public/timelines/containers/api.ts | 172 +- .../containers/delete/persist.gql_query.ts | 14 - .../containers/favorite/persist.gql_query.ts | 35 - .../public/timelines/containers/index.tsx | 2 +- .../public/timelines/containers/notes/api.ts | 35 + .../containers/notes/persist.gql_query.ts | 29 - .../containers/one/index.gql_query.ts | 157 - .../timelines/containers/persist.gql_query.ts | 114 - .../timelines/containers/pinned_event/api.ts | 31 + .../pinned_event/persist.gql_query.ts | 28 - .../timelines/store/timeline/defaults.ts | 2 +- .../timelines/store/timeline/epic.test.ts | 2 +- .../public/timelines/store/timeline/epic.ts | 25 +- .../timelines/store/timeline/epic_favorite.ts | 27 +- .../timeline/epic_local_storage.test.tsx | 19 +- .../timelines/store/timeline/epic_note.ts | 30 +- .../store/timeline/epic_pinned_event.ts | 32 +- .../public/timelines/store/timeline/model.ts | 2 +- .../timelines/store/timeline/reducer.test.ts | 2 +- .../store/timeline/refetch_queries.ts | 25 - .../public/timelines/store/timeline/types.ts | 2 - .../plugins/security_solution/public/types.ts | 3 +- .../scripts/combined_schema.ts | 18 - .../scripts/generate_types_from_graphql.js | 146 - .../server/graphql/ecs/index.ts | 9 - .../server/graphql/ecs/resolvers.ts | 107 - .../server/graphql/ecs/schema.gql.ts | 468 - .../server/graphql/hosts/schema.gql.ts | 124 - .../security_solution/server/graphql/index.ts | 36 - .../server/graphql/note/index.ts | 9 - .../server/graphql/note/resolvers.ts | 93 - .../server/graphql/note/schema.gql.ts | 82 - .../server/graphql/pinned_event/index.ts | 9 - .../server/graphql/pinned_event/resolvers.ts | 59 - .../server/graphql/pinned_event/schema.gql.ts | 41 - .../server/graphql/scalar_date/index.ts | 9 - .../graphql/scalar_date/resolvers.test.ts | 56 - .../server/graphql/scalar_date/resolvers.ts | 33 - .../server/graphql/scalar_to_any/index.ts | 9 - .../server/graphql/scalar_to_any/resolvers.ts | 61 - .../graphql/scalar_to_any/schema.gql.ts | 12 - .../graphql/scalar_to_boolean_array/index.ts | 9 - .../scalar_to_boolean_array/resolvers.test.ts | 119 - .../scalar_to_boolean_array/resolvers.ts | 76 - .../scalar_to_boolean_array/schema.gql.ts | 12 - .../graphql/scalar_to_date_array/index.ts | 9 - .../scalar_to_date_array/resolvers.test.ts | 94 - .../graphql/scalar_to_date_array/resolvers.ts | 70 - .../scalar_to_date_array/schema.gql.ts | 12 - .../graphql/scalar_to_number_array/index.ts | 9 - .../scalar_to_number_array/resolvers.test.ts | 76 - .../scalar_to_number_array/resolvers.ts | 74 - .../scalar_to_number_array/schema.gql.ts | 12 - .../server/graphql/source_status/index.ts | 9 - .../graphql/source_status/resolvers.test.ts | 50 - .../server/graphql/source_status/resolvers.ts | 99 - .../graphql/source_status/schema.gql.ts | 43 - .../server/graphql/sources/index.ts | 9 - .../server/graphql/sources/resolvers.ts | 72 - .../server/graphql/sources/schema.gql.ts | 51 - .../server/graphql/timeline/index.ts | 9 - .../server/graphql/timeline/resolvers.ts | 85 - .../server/graphql/timeline/schema.gql.ts | 352 - .../security_solution/server/graphql/types.ts | 5706 ------------ .../security_solution/server/init_server.ts | 44 - .../server/lib/compose/kibana.ts | 2 +- .../delete_timeline_by_timeline_id.sh | 4 +- .../timelines/find_timeline_by_filter.sh | 5 +- .../scripts/timelines/get_all_timelines.sh | 2 +- .../lib/framework/kibana_framework_adapter.ts | 85 +- .../server/lib/framework/types.ts | 8 +- .../timeline/__mocks__/request_responses.ts | 8 +- .../server/lib/timeline/routes/README.md | 812 ++ .../lib/timeline/routes/notes}/index.ts | 2 +- .../lib/timeline/routes/notes/persist_note.ts | 69 + .../timeline/routes/pinned_events}/index.ts | 2 +- .../pinned_events/persist_pinned_event.ts | 65 + .../timelines/create_timelines/helpers.ts | 4 +- .../timelines/delete_timelines/index.ts | 51 + .../timelines/get_timeline/index.test.ts | 15 +- .../routes/timelines/get_timeline/index.ts | 41 +- .../timelines/get_timelines/index.test.ts | 58 + .../routes/timelines/get_timelines/index.ts | 103 + .../create_timelines_stream_from_ndjson.ts | 6 +- .../timelines/import_timelines/helpers.ts | 1 + .../timelines/import_timelines/types.ts | 2 +- .../lib/timeline/routes/timelines/index.ts | 14 + .../timelines/patch_timelines/index.test.ts | 16 +- .../routes/timelines/patch_timelines/index.ts | 2 +- .../timelines/persist_favorite/index.ts | 74 + .../notes/get_overridable_note.ts | 8 +- .../lib/timeline/saved_object/notes/index.ts | 10 +- .../saved_object/notes/persist_notes.ts | 2 +- .../saved_object/notes/saved_object.ts | 8 +- .../saved_object/pinned_events/index.ts | 7 +- .../saved_object/timelines/index.test.ts | 8 +- .../timeline/saved_object/timelines/index.ts | 33 +- .../lib/timeline/schemas/notes/index.ts | 11 + .../timeline/schemas/pinned_events/index.ts | 9 + .../timelines/delete_timelines_schema.ts} | 8 +- ...by_id_schema.ts => get_timeline_schema.ts} | 4 +- .../schemas/timelines/get_timelines_schema.ts | 41 + .../lib/timeline/schemas/timelines/index.ts | 3 +- .../timelines/persist_favorite_schema.ts | 18 + .../server/lib/timeline/utils/common.ts | 35 +- .../security_solution/server/plugin.ts | 4 +- .../security_solution/server/routes/index.ts | 28 +- .../utils/build_query/create_options.test.ts | 176 - .../utils/build_query/create_options.ts | 88 - .../server/utils/serialized_query.ts | 8 +- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../security_solution/feature_controls.ts | 203 - .../apis/security_solution/index.js | 3 +- .../saved_objects/helpers.ts | 44 + .../security_solution/saved_objects/notes.ts | 77 +- .../saved_objects/pinned_events.ts | 38 +- .../saved_objects/timeline.ts | 318 +- .../apis/security_solution/timeline.ts | 157 +- x-pack/test/api_integration/services/index.ts | 7 +- .../security_solution_graphql_client.ts | 57 - yarn.lock | 919 +- 246 files changed, 4719 insertions(+), 24790 deletions(-) delete mode 100644 x-pack/plugins/security_solution/common/graphql/root/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/common/graphql/shared/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/public/common/containers/errors/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/common/containers/errors/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/common/containers/errors/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/common/containers/query_template.tsx delete mode 100644 x-pack/plugins/security_solution/public/common/containers/query_template_paginated.tsx delete mode 100644 x-pack/plugins/security_solution/public/common/lib/compose/helpers.test.ts delete mode 100644 x-pack/plugins/security_solution/public/common/lib/compose/helpers.ts delete mode 100644 x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx delete mode 100644 x-pack/plugins/security_solution/public/common/lib/lib.ts delete mode 100644 x-pack/plugins/security_solution/public/common/utils/apollo_context.ts delete mode 100644 x-pack/plugins/security_solution/public/graphql/introspection.json delete mode 100644 x-pack/plugins/security_solution/public/graphql/types.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/delete/persist.gql_query.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/favorite/persist.gql_query.ts create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/notes/api.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/notes/persist.gql_query.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/one/index.gql_query.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/persist.gql_query.ts create mode 100644 x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/containers/pinned_event/persist.gql_query.ts delete mode 100644 x-pack/plugins/security_solution/public/timelines/store/timeline/refetch_queries.ts delete mode 100644 x-pack/plugins/security_solution/scripts/combined_schema.ts delete mode 100644 x-pack/plugins/security_solution/scripts/generate_types_from_graphql.js delete mode 100644 x-pack/plugins/security_solution/server/graphql/ecs/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/ecs/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/ecs/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/hosts/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/note/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/note/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/note/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/pinned_event/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/pinned_event/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/pinned_event/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_date/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.test.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_any/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_any/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_any/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.test.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.test.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.test.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/source_status/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/source_status/resolvers.test.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/source_status/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/source_status/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/sources/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/sources/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/sources/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/timeline/index.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/timeline/resolvers.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/timeline/schema.gql.ts delete mode 100644 x-pack/plugins/security_solution/server/graphql/types.ts delete mode 100644 x-pack/plugins/security_solution/server/init_server.ts rename x-pack/plugins/security_solution/{common/graphql/root => server/lib/timeline/routes/notes}/index.ts (83%) create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts rename x-pack/plugins/security_solution/{common/graphql/shared => server/lib/timeline/routes/pinned_events}/index.ts (79%) create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/index.ts create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts rename x-pack/plugins/security_solution/server/{graphql/scalar_date/schema.gql.ts => lib/timeline/schemas/timelines/delete_timelines_schema.ts} (68%) rename x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/{get_timeline_by_id_schema.ts => get_timeline_schema.ts} (70%) create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timelines_schema.ts create mode 100644 x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/persist_favorite_schema.ts delete mode 100644 x-pack/plugins/security_solution/server/utils/build_query/create_options.test.ts delete mode 100644 x-pack/plugins/security_solution/server/utils/build_query/create_options.ts delete mode 100644 x-pack/test/api_integration/apis/security_solution/feature_controls.ts create mode 100644 x-pack/test/api_integration/apis/security_solution/saved_objects/helpers.ts delete mode 100644 x-pack/test/api_integration/services/security_solution_graphql_client.ts diff --git a/package.json b/package.json index 4f49ecd7373e2..23241a37ffe47 100644 --- a/package.json +++ b/package.json @@ -176,17 +176,6 @@ "angular-sortable-view": "^0.0.17", "angular-ui-ace": "0.2.3", "antlr4ts": "^0.5.0-alpha.3", - "apollo-cache-inmemory": "1.6.2", - "apollo-client": "^2.3.8", - "apollo-link": "^1.2.3", - "apollo-link-error": "^1.1.7", - "apollo-link-http": "^1.5.16", - "apollo-link-http-common": "^0.2.15", - "apollo-link-schema": "^1.1.0", - "apollo-link-state": "^0.4.1", - "apollo-server-core": "^1.3.6", - "apollo-server-errors": "^2.0.2", - "apollo-server-hapi": "^1.3.6", "archiver": "^5.2.0", "axios": "^0.21.1", "base64-js": "^1.3.1", @@ -243,9 +232,7 @@ "glob-all": "^3.2.1", "globby": "^11.0.3", "graphql": "^0.13.2", - "graphql-fields": "^1.0.2", "graphql-tag": "^2.10.3", - "graphql-tools": "^3.0.2", "handlebars": "4.7.7", "he": "^1.2.0", "history": "^4.9.0", @@ -333,7 +320,6 @@ "re2": "^1.15.4", "react": "^16.12.0", "react-ace": "^5.9.0", - "react-apollo": "^2.1.4", "react-beautiful-dnd": "^13.0.0", "react-color": "^2.13.8", "react-datetime": "^2.14.0", @@ -728,13 +714,6 @@ "form-data": "^4.0.0", "geckodriver": "^1.22.2", "glob-watcher": "5.0.3", - "graphql-code-generator": "^0.18.2", - "graphql-codegen-add": "^0.18.2", - "graphql-codegen-introspection": "^0.18.2", - "graphql-codegen-typescript-client": "^0.18.2", - "graphql-codegen-typescript-common": "^0.18.2", - "graphql-codegen-typescript-resolvers": "^0.18.2", - "graphql-codegen-typescript-server": "^0.18.2", "grunt": "1.3.0", "grunt-available-tasks": "^0.6.3", "grunt-peg": "^2.0.1", diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 4c62179f9ed54..2b584b196a738 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -136,11 +136,16 @@ export const DETECTION_ENGINE_RULES_STATUS_URL = `${DETECTION_ENGINE_RULES_URL}/ export const DETECTION_ENGINE_PREPACKAGED_RULES_STATUS_URL = `${DETECTION_ENGINE_RULES_URL}/prepackaged/_status`; export const TIMELINE_URL = '/api/timeline'; +export const TIMELINES_URL = '/api/timelines'; +export const TIMELINE_FAVORITE_URL = '/api/timeline/_favorite'; export const TIMELINE_DRAFT_URL = `${TIMELINE_URL}/_draft`; export const TIMELINE_EXPORT_URL = `${TIMELINE_URL}/_export`; export const TIMELINE_IMPORT_URL = `${TIMELINE_URL}/_import`; export const TIMELINE_PREPACKAGED_URL = `${TIMELINE_URL}/_prepackaged`; +export const NOTE_URL = '/api/note'; +export const PINNED_EVENT_URL = '/api/pinned_event'; + /** * Default signals index key for kibana.dev.yml */ diff --git a/x-pack/plugins/security_solution/common/graphql/root/schema.gql.ts b/x-pack/plugins/security_solution/common/graphql/root/schema.gql.ts deleted file mode 100644 index 16fdeb7ec6c75..0000000000000 --- a/x-pack/plugins/security_solution/common/graphql/root/schema.gql.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const rootSchema = gql` - schema { - query: Query - mutation: Mutation - } - - type Query - - type Mutation -`; diff --git a/x-pack/plugins/security_solution/common/graphql/shared/schema.gql.ts b/x-pack/plugins/security_solution/common/graphql/shared/schema.gql.ts deleted file mode 100644 index 86416cf354498..0000000000000 --- a/x-pack/plugins/security_solution/common/graphql/shared/schema.gql.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const sharedSchema = gql` - input TimerangeInput { - "The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan." - interval: String! - "The end of the timerange" - to: String! - "The beginning of the timerange" - from: String! - } - - input docValueFieldsInput { - field: String! - format: String! - } - - type CursorType { - value: String - tiebreaker: String - } - - input PaginationInput { - "The limit parameter allows you to configure the maximum amount of items to be returned" - limit: Float! - "The cursor parameter defines the next result you want to fetch" - cursor: String - "The tiebreaker parameter allow to be more precise to fetch the next item" - tiebreaker: String - } - - input PaginationInputPaginated { - "The activePage parameter defines the page of results you want to fetch" - activePage: Float! - "The cursorStart parameter defines the start of the results to be displayed" - cursorStart: Float! - "The fakePossibleCount parameter determines the total count in order to show 5 additional pages" - fakePossibleCount: Float! - "The querySize parameter is the number of items to be returned" - querySize: Float! - } - - enum Direction { - asc - desc - } - - enum FlowTarget { - client - destination - server - source - } - - enum FlowTargetSourceDest { - destination - source - } - - enum FlowDirection { - uniDirectional - biDirectional - } - - input SortField { - sortFieldId: String! - direction: Direction! - } - - type PageInfo { - endCursor: CursorType - hasNextPage: Boolean - } - - type Inspect { - dsl: [String!]! - response: [String!]! - } - - type PageInfoPaginated { - activePage: Float! - fakeTotalCount: Float! - showMorePagesIndicator: Boolean! - } -`; diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts index 2160ed6170e29..ae2cff20717f3 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts @@ -192,3 +192,9 @@ export type StrategyRequestType = T extends HostsQu : T extends typeof MatrixHistogramQuery ? MatrixHistogramRequestOptions : never; + +export interface DocValueFieldsInput { + field: string; + + format: string; +} diff --git a/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts b/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts index 504e71cd8cefb..9c2c23eb334a3 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts @@ -17,7 +17,14 @@ import { TimelineEventsLastEventTimeStrategyResponse, TimelineKpiStrategyResponse, } from './events'; -import { DocValueFields, PaginationInputPaginated, TimerangeInput, SortField } from '../common'; +import { + DocValueFields, + PaginationInputPaginated, + TimerangeInput, + SortField, + Maybe, +} from '../common'; +import { DataProviderType, TimelineType, TimelineStatus } from '../../types/timeline'; export * from './events'; @@ -64,3 +71,141 @@ export type TimelineStrategyRequestType< : T extends TimelineEventsQueries.lastEventTime ? TimelineEventsLastEventTimeRequestOptions : never; + +export interface ColumnHeaderInput { + aggregatable?: Maybe; + category?: Maybe; + columnHeaderType?: Maybe; + description?: Maybe; + example?: Maybe; + indexes?: Maybe; + id?: Maybe; + name?: Maybe; + placeholder?: Maybe; + searchable?: Maybe; + type?: Maybe; +} + +export interface QueryMatchInput { + field?: Maybe; + + displayField?: Maybe; + + value?: Maybe; + + displayValue?: Maybe; + + operator?: Maybe; +} + +export interface DataProviderInput { + id?: Maybe; + name?: Maybe; + enabled?: Maybe; + excluded?: Maybe; + kqlQuery?: Maybe; + queryMatch?: Maybe; + and?: Maybe; + type?: Maybe; +} + +export interface EqlOptionsInput { + eventCategoryField?: Maybe; + tiebreakerField?: Maybe; + timestampField?: Maybe; + query?: Maybe; + size?: Maybe; +} + +export interface FilterMetaTimelineInput { + alias?: Maybe; + controlledBy?: Maybe; + disabled?: Maybe; + field?: Maybe; + formattedValue?: Maybe; + index?: Maybe; + key?: Maybe; + negate?: Maybe; + params?: Maybe; + type?: Maybe; + value?: Maybe; +} + +export interface FilterTimelineInput { + exists?: Maybe; + meta?: Maybe; + match_all?: Maybe; + missing?: Maybe; + query?: Maybe; + range?: Maybe; + script?: Maybe; +} + +export interface SerializedFilterQueryInput { + filterQuery?: Maybe; +} + +export interface SerializedKueryQueryInput { + kuery?: Maybe; + serializedQuery?: Maybe; +} + +export interface KueryFilterQueryInput { + kind?: Maybe; + expression?: Maybe; +} + +export interface DateRangePickerInput { + start?: Maybe; + end?: Maybe; +} + +export interface SortTimelineInput { + columnId?: Maybe; + sortDirection?: Maybe; +} + +export enum RowRendererId { + alerts = 'alerts', + auditd = 'auditd', + auditd_file = 'auditd_file', + library = 'library', + netflow = 'netflow', + plain = 'plain', + registry = 'registry', + suricata = 'suricata', + system = 'system', + system_dns = 'system_dns', + system_endgame_process = 'system_endgame_process', + system_file = 'system_file', + system_fim = 'system_fim', + system_security_event = 'system_security_event', + system_socket = 'system_socket', + zeek = 'zeek', +} + +export interface TimelineInput { + columns?: Maybe; + dataProviders?: Maybe; + description?: Maybe; + eqlOptions?: Maybe; + eventType?: Maybe; + excludedRowRendererIds?: Maybe; + filters?: Maybe; + kqlMode?: Maybe; + kqlQuery?: Maybe; + indexNames?: Maybe; + title?: Maybe; + templateTimelineId?: Maybe; + templateTimelineVersion?: Maybe; + timelineType?: Maybe; + dateRange?: Maybe; + savedQueryId?: Maybe; + sort?: Maybe; + status?: Maybe; +} + +export enum FlowDirection { + uniDirectional = 'uniDirectional', + biDirectional = 'biDirectional', +} diff --git a/x-pack/plugins/security_solution/common/types/timeline/index.ts b/x-pack/plugins/security_solution/common/types/timeline/index.ts index 9def70048410a..5b6c9c532ba7c 100644 --- a/x-pack/plugins/security_solution/common/types/timeline/index.ts +++ b/x-pack/plugins/security_solution/common/types/timeline/index.ts @@ -8,8 +8,12 @@ import * as runtimeTypes from 'io-ts'; import { stringEnum, unionWithNullType } from '../../utility_types'; -import { NoteSavedObject, NoteSavedObjectToReturnRuntimeType } from './note'; -import { PinnedEventToReturnSavedObjectRuntimeType, PinnedEventSavedObject } from './pinned_event'; +import { NoteResult, NoteSavedObject, NoteSavedObjectToReturnRuntimeType } from './note'; +import { + PinnedEventToReturnSavedObjectRuntimeType, + PinnedEventSavedObject, + PinnedEvent, +} from './pinned_event'; import { success, success_count as successCount, @@ -17,6 +21,7 @@ import { import { FlowTarget } from '../../search_strategy/security_solution/network'; import { PositiveInteger } from '../../detection_engine/schemas/types'; import { errorSchema } from '../../detection_engine/schemas/response/error_schema'; +import { Direction, Maybe } from '../../search_strategy'; /* * ColumnHeader Types @@ -167,6 +172,8 @@ const SavedSortRuntimeType = runtimeTypes.union([ SavedSortObject, ]); +export type Sort = runtimeTypes.TypeOf; + /* * Timeline Statuses */ @@ -346,6 +353,14 @@ export type TimelineSavedObject = runtimeTypes.TypeOf< typeof TimelineSavedToReturnObjectRuntimeType >; +export const SingleTimelineResponseType = runtimeTypes.type({ + data: runtimeTypes.type({ + getOneTimeline: TimelineSavedToReturnObjectRuntimeType, + }), +}); + +export type SingleTimelineResponse = runtimeTypes.TypeOf; + /** * All Timeline Saved object type with metadata */ @@ -476,3 +491,229 @@ export type TimelineExpandedDetailType = export type TimelineExpandedDetail = { [tab in TimelineTabs]?: TimelineExpandedDetailType; }; + +export const pageInfoTimeline = runtimeTypes.type({ + pageIndex: runtimeTypes.number, + pageSize: runtimeTypes.number, +}); + +export enum SortFieldTimeline { + title = 'title', + description = 'description', + updated = 'updated', + created = 'created', +} + +export const sortFieldTimeline = runtimeTypes.union([ + runtimeTypes.literal(SortFieldTimeline.title), + runtimeTypes.literal(SortFieldTimeline.description), + runtimeTypes.literal(SortFieldTimeline.updated), + runtimeTypes.literal(SortFieldTimeline.created), +]); + +export const direction = runtimeTypes.union([ + runtimeTypes.literal(Direction.asc), + runtimeTypes.literal(Direction.desc), +]); + +export const sortTimeline = runtimeTypes.type({ + sortField: sortFieldTimeline, + sortOrder: direction, +}); + +const favoriteTimelineResult = runtimeTypes.partial({ + fullName: unionWithNullType(runtimeTypes.string), + userName: unionWithNullType(runtimeTypes.string), + favoriteDate: unionWithNullType(runtimeTypes.number), +}); + +export type FavoriteTimelineResult = runtimeTypes.TypeOf; + +export const responseFavoriteTimeline = runtimeTypes.partial({ + savedObjectId: runtimeTypes.string, + version: runtimeTypes.string, + code: unionWithNullType(runtimeTypes.number), + message: unionWithNullType(runtimeTypes.string), + templateTimelineId: unionWithNullType(runtimeTypes.string), + templateTimelineVersion: unionWithNullType(runtimeTypes.number), + timelineType: unionWithNullType(TimelineTypeLiteralRt), + favorite: unionWithNullType(runtimeTypes.array(favoriteTimelineResult)), +}); + +export type ResponseFavoriteTimeline = runtimeTypes.TypeOf; + +export const getTimelinesArgs = runtimeTypes.partial({ + onlyUserFavorite: unionWithNullType(runtimeTypes.boolean), + pageInfo: unionWithNullType(pageInfoTimeline), + search: unionWithNullType(runtimeTypes.string), + sort: unionWithNullType(sortTimeline), + status: unionWithNullType(TimelineStatusLiteralRt), + timelineType: unionWithNullType(TimelineTypeLiteralRt), +}); + +export type GetTimelinesArgs = runtimeTypes.TypeOf; + +const responseTimelines = runtimeTypes.type({ + timeline: runtimeTypes.array(TimelineSavedToReturnObjectRuntimeType), + totalCount: runtimeTypes.number, +}); + +export type ResponseTimelines = runtimeTypes.TypeOf; + +export const allTimelinesResponse = runtimeTypes.intersection([ + responseTimelines, + runtimeTypes.type({ + defaultTimelineCount: runtimeTypes.number, + templateTimelineCount: runtimeTypes.number, + elasticTemplateTimelineCount: runtimeTypes.number, + customTemplateTimelineCount: runtimeTypes.number, + favoriteCount: runtimeTypes.number, + }), +]); + +export type AllTimelinesResponse = runtimeTypes.TypeOf; + +export interface PageInfoTimeline { + pageIndex: number; + + pageSize: number; +} + +export interface ColumnHeaderResult { + aggregatable?: Maybe; + category?: Maybe; + columnHeaderType?: Maybe; + description?: Maybe; + example?: Maybe; + indexes?: Maybe; + id?: Maybe; + name?: Maybe; + placeholder?: Maybe; + searchable?: Maybe; + type?: Maybe; +} + +export interface DataProviderResult { + id?: Maybe; + name?: Maybe; + enabled?: Maybe; + excluded?: Maybe; + kqlQuery?: Maybe; + queryMatch?: Maybe; + type?: Maybe; + and?: Maybe; +} + +export interface QueryMatchResult { + field?: Maybe; + displayField?: Maybe; + value?: Maybe; + displayValue?: Maybe; + operator?: Maybe; +} + +export interface DateRangePickerResult { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + start?: Maybe; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + end?: Maybe; +} + +export interface EqlOptionsResult { + eventCategoryField?: Maybe; + tiebreakerField?: Maybe; + timestampField?: Maybe; + query?: Maybe; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + size?: Maybe; +} + +export interface FilterTimelineResult { + exists?: Maybe; + meta?: Maybe; + match_all?: Maybe; + missing?: Maybe; + query?: Maybe; + range?: Maybe; + script?: Maybe; +} + +export interface FilterMetaTimelineResult { + alias?: Maybe; + controlledBy?: Maybe; + disabled?: Maybe; + field?: Maybe; + formattedValue?: Maybe; + index?: Maybe; + key?: Maybe; + negate?: Maybe; + params?: Maybe; + type?: Maybe; + value?: Maybe; +} + +export interface SerializedFilterQueryResult { + filterQuery?: Maybe; +} + +export interface SerializedKueryQueryResult { + kuery?: Maybe; + serializedQuery?: Maybe; +} + +export interface KueryFilterQueryResult { + kind?: Maybe; + expression?: Maybe; +} + +export interface TimelineResult { + columns?: Maybe; + created?: Maybe; + createdBy?: Maybe; + dataProviders?: Maybe; + dateRange?: Maybe; + description?: Maybe; + eqlOptions?: Maybe; + eventIdToNoteIds?: Maybe; + eventType?: Maybe; + excludedRowRendererIds?: Maybe; + favorite?: Maybe; + filters?: Maybe; + kqlMode?: Maybe; + kqlQuery?: Maybe; + indexNames?: Maybe; + notes?: Maybe; + noteIds?: Maybe; + pinnedEventIds?: Maybe; + pinnedEventsSaveObject?: Maybe; + savedQueryId?: Maybe; + savedObjectId: string; + sort?: Maybe; + status?: Maybe; + title?: Maybe; + templateTimelineId?: Maybe; + templateTimelineVersion?: Maybe; + timelineType?: Maybe; + updated?: Maybe; + updatedBy?: Maybe; + version: string; +} + +export interface ResponseTimeline { + code?: Maybe; + message?: Maybe; + timeline: TimelineResult; +} +export interface SortTimeline { + sortField: SortFieldTimeline; + sortOrder: Direction; +} + +export interface GetAllTimelineVariables { + pageInfo: PageInfoTimeline; + search?: Maybe; + sort?: Maybe; + onlyUserFavorite?: Maybe; + timelineType?: Maybe; + status?: Maybe; +} diff --git a/x-pack/plugins/security_solution/common/types/timeline/note/index.ts b/x-pack/plugins/security_solution/common/types/timeline/note/index.ts index 1a97a59444a56..074e4132efdff 100644 --- a/x-pack/plugins/security_solution/common/types/timeline/note/index.ts +++ b/x-pack/plugins/security_solution/common/types/timeline/note/index.ts @@ -8,6 +8,7 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import * as runtimeTypes from 'io-ts'; +import { Direction, Maybe } from '../../../search_strategy/common'; import { unionWithNullType } from '../../../utility_types'; @@ -63,3 +64,64 @@ export const NoteSavedObjectToReturnRuntimeType = runtimeTypes.intersection([ export interface NoteSavedObject extends runtimeTypes.TypeOf {} + +export enum SortFieldNote { + updatedBy = 'updatedBy', + updated = 'updated', +} + +export const pageInfoNoteRt = runtimeTypes.type({ + pageIndex: runtimeTypes.number, + pageSize: runtimeTypes.number, +}); + +export type PageInfoNote = runtimeTypes.TypeOf; + +export const sortNoteRt = runtimeTypes.type({ + sortField: runtimeTypes.union([ + runtimeTypes.literal(SortFieldNote.updatedBy), + runtimeTypes.literal(SortFieldNote.updated), + ]), + sortOrder: runtimeTypes.union([ + runtimeTypes.literal(Direction.asc), + runtimeTypes.literal(Direction.desc), + ]), +}); + +export type SortNote = runtimeTypes.TypeOf; + +export interface NoteResult { + eventId?: Maybe; + + note?: Maybe; + + timelineId?: Maybe; + + noteId: string; + + created?: Maybe; + + createdBy?: Maybe; + + timelineVersion?: Maybe; + + updated?: Maybe; + + updatedBy?: Maybe; + + version?: Maybe; +} + +export interface ResponseNotes { + notes: NoteResult[]; + + totalCount?: Maybe; +} + +export interface ResponseNote { + code?: Maybe; + + message?: Maybe; + + note: NoteResult; +} diff --git a/x-pack/plugins/security_solution/common/types/timeline/pinned_event/index.ts b/x-pack/plugins/security_solution/common/types/timeline/pinned_event/index.ts index ba6ac673aa7d4..dbb19df7a6b05 100644 --- a/x-pack/plugins/security_solution/common/types/timeline/pinned_event/index.ts +++ b/x-pack/plugins/security_solution/common/types/timeline/pinned_event/index.ts @@ -8,6 +8,7 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import * as runtimeTypes from 'io-ts'; +import { Maybe } from '../../../search_strategy/common'; import { unionWithNullType } from '../../../utility_types'; @@ -58,3 +59,27 @@ export const PinnedEventToReturnSavedObjectRuntimeType = runtimeTypes.intersecti export interface PinnedEventSavedObject extends runtimeTypes.TypeOf {} + +export interface PinnedEvent { + code?: Maybe; + + message?: Maybe; + + pinnedEventId: string; + + eventId?: Maybe; + + timelineId?: Maybe; + + timelineVersion?: Maybe; + + created?: Maybe; + + createdBy?: Maybe; + + updated?: Maybe; + + updatedBy?: Maybe; + + version?: Maybe; +} diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/notes.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/notes.ts index 0fc1a86395605..83651a0cbfd0b 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/api_calls/notes.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/notes.ts @@ -7,17 +7,12 @@ export const addNoteToTimeline = (note: string, timelineId: string) => cy.request({ - method: 'POST', - url: '/api/solutions/security/graphql', + method: 'PATCH', + url: '/api/note', body: { - operationName: 'PersistTimelineNoteMutation', - variables: { - noteId: null, - version: null, - note: { note, timelineId }, - }, - query: - 'mutation PersistTimelineNoteMutation($noteId: ID, $version: String, $note: NoteInput!) {\n persistNote(noteId: $noteId, version: $version, note: $note) {\n code\n message\n note {\n eventId\n note\n timelineId\n timelineVersion\n noteId\n created\n createdBy\n updated\n updatedBy\n version\n __typename\n }\n __typename\n }\n}\n', + noteId: null, + version: null, + note: { note, timelineId }, }, headers: { 'kbn-xsrf': 'cypress-creds' }, }); diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/timelines.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/timelines.ts index 4cfd1e7f89986..453c2db8afd65 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/api_calls/timelines.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/timelines.ts @@ -98,13 +98,9 @@ export const createTimelineTemplate = (timeline: CompleteTimeline) => export const deleteTimeline = (timelineId: string) => { cy.request({ method: 'POST', - url: 'api/solutions/security/graphql', + url: 'api/timeline', body: { - operationName: 'DeleteTimelineMutation', - variables: { - id: [timelineId], - }, - query: 'mutation DeleteTimelineMutation($id: [ID!]!) {\n deleteTimeline(id: $id)\n}\n', + id: [timelineId], }, headers: { 'kbn-xsrf': 'delete-signals' }, }); @@ -112,15 +108,7 @@ export const deleteTimeline = (timelineId: string) => { export const getTimelineById = (timelineId: string) => cy.request({ - method: 'POST', - url: 'api/solutions/security/graphql', - body: { - operationName: 'GetOneTimeline', - variables: { - id: timelineId, - }, - query: - 'query GetOneTimeline($id: ID!, $timelineType: TimelineType) {\n getOneTimeline(id: $id, timelineType: $timelineType) {\n savedObjectId\n columns {\n aggregatable\n category\n columnHeaderType\n description\n example\n indexes\n id\n name\n searchable\n type\n __typename\n }\n dataProviders {\n id\n name\n enabled\n excluded\n kqlQuery\n type\n queryMatch {\n field\n displayField\n value\n displayValue\n operator\n __typename\n }\n and {\n id\n name\n enabled\n excluded\n kqlQuery\n type\n queryMatch {\n field\n displayField\n value\n displayValue\n operator\n __typename\n }\n __typename\n }\n __typename\n }\n dateRange {\n start\n end\n __typename\n }\n description\n eventType\n eventIdToNoteIds {\n eventId\n note\n timelineId\n noteId\n created\n createdBy\n timelineVersion\n updated\n updatedBy\n version\n __typename\n }\n excludedRowRendererIds\n favorite {\n fullName\n userName\n favoriteDate\n __typename\n }\n filters {\n meta {\n alias\n controlledBy\n disabled\n field\n formattedValue\n index\n key\n negate\n params\n type\n value\n __typename\n }\n query\n exists\n match_all\n missing\n range\n script\n __typename\n }\n kqlMode\n kqlQuery {\n filterQuery {\n kuery {\n kind\n expression\n __typename\n }\n serializedQuery\n __typename\n }\n __typename\n }\n indexNames\n notes {\n eventId\n note\n timelineId\n timelineVersion\n noteId\n created\n createdBy\n updated\n updatedBy\n version\n __typename\n }\n noteIds\n pinnedEventIds\n pinnedEventsSaveObject {\n pinnedEventId\n eventId\n timelineId\n created\n createdBy\n updated\n updatedBy\n version\n __typename\n }\n status\n title\n timelineType\n templateTimelineId\n templateTimelineVersion\n savedQueryId\n sort\n created\n createdBy\n updated\n updatedBy\n version\n __typename\n }\n}\n', - }, + method: 'GET', + url: `api/timeline?id=${timelineId}`, headers: { 'kbn-xsrf': 'timeline-by-id' }, }); diff --git a/x-pack/plugins/security_solution/public/app/app.tsx b/x-pack/plugins/security_solution/public/app/app.tsx index 451e29543fa03..0917354894834 100644 --- a/x-pack/plugins/security_solution/public/app/app.tsx +++ b/x-pack/plugins/security_solution/public/app/app.tsx @@ -7,7 +7,6 @@ import { History } from 'history'; import React, { memo, FC } from 'react'; -import { ApolloProvider } from 'react-apollo'; import { Store, Action } from 'redux'; import { Provider as ReduxStoreProvider } from 'react-redux'; @@ -19,30 +18,22 @@ import { DEFAULT_DARK_MODE, APP_NAME } from '../../common/constants'; import { ErrorToastDispatcher } from '../common/components/error_toast_dispatcher'; import { MlCapabilitiesProvider } from '../common/components/ml/permissions/ml_capabilities_provider'; import { GlobalToaster, ManageGlobalToaster } from '../common/components/toasters'; -import { AppFrontendLibs } from '../common/lib/lib'; import { KibanaContextProvider, useKibana, useUiSetting$ } from '../common/lib/kibana'; import { State } from '../common/store'; -import { ApolloClientContext } from '../common/utils/apollo_context'; import { ManageGlobalTimeline } from '../timelines/components/manage_timeline'; import { StartServices } from '../types'; import { PageRouter } from './routes'; import { EuiThemeProvider } from '../../../../../src/plugins/kibana_react/common'; -interface StartAppComponent extends AppFrontendLibs { +interface StartAppComponent { children: React.ReactNode; history: History; onAppLeave: (handler: AppLeaveHandler) => void; store: Store; } -const StartAppComponent: FC = ({ - children, - apolloClient, - history, - onAppLeave, - store, -}) => { +const StartAppComponent: FC = ({ children, history, onAppLeave, store }) => { const { i18n } = useKibana().services; const [darkMode] = useUiSetting$(DEFAULT_DARK_MODE); @@ -52,21 +43,17 @@ const StartAppComponent: FC = ({ - - - - - - - {children} - - - - - - - - + + + + + {children} + + + + + + @@ -77,7 +64,7 @@ const StartAppComponent: FC = ({ const StartApp = memo(StartAppComponent); -interface SecurityAppComponentProps extends AppFrontendLibs { +interface SecurityAppComponentProps { children: React.ReactNode; history: History; onAppLeave: (handler: AppLeaveHandler) => void; @@ -87,7 +74,6 @@ interface SecurityAppComponentProps extends AppFrontendLibs { const SecurityAppComponent: React.FC = ({ children, - apolloClient, history, onAppLeave, services, @@ -99,7 +85,7 @@ const SecurityAppComponent: React.FC = ({ ...services, }} > - + {children} diff --git a/x-pack/plugins/security_solution/public/app/index.tsx b/x-pack/plugins/security_solution/public/app/index.tsx index dadba699bd243..1e304c2686960 100644 --- a/x-pack/plugins/security_solution/public/app/index.tsx +++ b/x-pack/plugins/security_solution/public/app/index.tsx @@ -12,7 +12,6 @@ import { SecurityApp } from './app'; import { RenderAppProps } from './types'; export const renderApp = ({ - apolloClient, element, history, onAppLeave, @@ -21,13 +20,7 @@ export const renderApp = ({ SubPluginRoutes, }: RenderAppProps): (() => void) => { render( - + , element diff --git a/x-pack/plugins/security_solution/public/app/types.ts b/x-pack/plugins/security_solution/public/app/types.ts index 95e64fe37d333..a617c6f14b9c4 100644 --- a/x-pack/plugins/security_solution/public/app/types.ts +++ b/x-pack/plugins/security_solution/public/app/types.ts @@ -19,12 +19,11 @@ import { import { AppMountParameters, AppSearchDeepLink } from '../../../../../src/core/public'; import { StartServices } from '../types'; -import { AppFrontendLibs } from '../common/lib/lib'; /** * The React properties used to render `SecurityApp` as well as the `element` to render it into. */ -export interface RenderAppProps extends AppFrontendLibs, AppMountParameters { +export interface RenderAppProps extends AppMountParameters { services: StartServices; store: Store; SubPluginRoutes: React.FC; diff --git a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx index 597566639a8d7..0b3915c3d38d4 100644 --- a/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/user_action_tree/user_action_markdown.test.tsx @@ -11,9 +11,6 @@ import { Router, mockHistory } from '../__mock__/router'; import { UserActionMarkdown } from './user_action_markdown'; import { TestProviders } from '../../../common/mock'; import * as timelineHelpers from '../../../timelines/components/open_timeline/helpers'; -import { useApolloClient } from '../../../common/utils/apollo_context'; -const mockUseApolloClient = useApolloClient as jest.Mock; -jest.mock('../../../common/utils/apollo_context'); const onChangeEditable = jest.fn(); const onSaveContent = jest.fn(); @@ -30,7 +27,6 @@ const defaultProps = { describe('UserActionMarkdown ', () => { const queryTimelineByIdSpy = jest.spyOn(timelineHelpers, 'queryTimelineById'); beforeEach(() => { - mockUseApolloClient.mockClear(); jest.resetAllMocks(); }); @@ -49,7 +45,6 @@ describe('UserActionMarkdown ', () => { .simulate('click'); expect(queryTimelineByIdSpy).toBeCalledWith({ - apolloClient: mockUseApolloClient(), graphEventId: '', timelineId, updateIsLoading: expect.any(Function), @@ -79,7 +74,6 @@ describe('UserActionMarkdown ', () => { .first() .simulate('click'); expect(queryTimelineByIdSpy).toBeCalledWith({ - apolloClient: mockUseApolloClient(), graphEventId: '', timelineId, updateIsLoading: expect.any(Function), diff --git a/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx index 1b812c6e81e82..66b8c00879b1c 100644 --- a/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/add_filter_to_global_search_bar/index.test.tsx @@ -9,7 +9,6 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; import { waitFor } from '@testing-library/react'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -37,23 +36,11 @@ jest.mock('../../lib/kibana', () => ({ describe('AddFilterToGlobalSearchBar Component', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { jest.useFakeTimers(); - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); mockAddFilters.mockClear(); }); diff --git a/x-pack/plugins/security_solution/public/common/components/error_toast_dispatcher/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/error_toast_dispatcher/index.test.tsx index b58ecbdd3349d..98be87c737d58 100644 --- a/x-pack/plugins/security_solution/public/common/components/error_toast_dispatcher/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/error_toast_dispatcher/index.test.tsx @@ -10,7 +10,6 @@ import React from 'react'; import { Provider } from 'react-redux'; import { - apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, @@ -24,22 +23,10 @@ import { State } from '../../store/types'; describe('Error Toast Dispatcher', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx index a62b652492c5f..836a67441ef8a 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx @@ -21,7 +21,6 @@ import styled from 'styled-components'; import { onFocusReFocusDraggable } from '../accessibility/helpers'; import { BrowserFields } from '../../containers/source'; -import { ToStringArray } from '../../../graphql/types'; import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { DragEffects } from '../drag_and_drop/draggable_wrapper'; import { DroppableWrapper } from '../drag_and_drop/droppable_wrapper'; @@ -175,7 +174,7 @@ export const getColumns = ({ name: i18n.VALUE, sortable: true, truncateText: false, - render: (values: ToStringArray | null | undefined, data: EventFieldsData) => ( + render: (values: string[] | null | undefined, data: EventFieldsData) => ( Promise; +}: ExportDocumentsProps) => Promise; export interface GenericDownloaderProps { filename: string; diff --git a/x-pack/plugins/security_solution/public/common/components/inspect/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/inspect/index.test.tsx index 2a7b7811a2de8..6f3e28469a949 100644 --- a/x-pack/plugins/security_solution/public/common/components/inspect/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/inspect/index.test.tsx @@ -11,7 +11,6 @@ import React from 'react'; import { TestProviders, mockGlobalState, - apolloClientObservable, SUB_PLUGINS_REDUCER, kibanaObservable, createSecuritySolutionStorageMock, @@ -35,25 +34,13 @@ describe('Inspect Button', () => { state: state.inputs, }; - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); describe('Render', () => { beforeEach(() => { const myState = cloneDeep(state); myState.inputs = upsertQuery(newQuery); - store = createStore( - myState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('Eui Empty Button', () => { const wrapper = mount( @@ -157,13 +144,7 @@ describe('Inspect Button', () => { response: ['my response'], }; myState.inputs = upsertQuery(myQuery); - store = createStore( - myState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('Open Inspect Modal', () => { const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts index e2b5a131a7954..e5d395561cc0a 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts @@ -7,7 +7,7 @@ import { getCriteriaFromNetworkType } from './get_criteria_from_network_type'; import { NetworkType } from '../../../../network/store/model'; -import { FlowTarget } from '../../../../graphql/types'; +import { FlowTarget } from '../../../../../common/search_strategy'; describe('get_criteria_from_network_type', () => { test('returns network names from criteria if the network type is details and it is source', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.ts b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.ts index 0bc42690f67bd..84fd7bd9d42d8 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/criteria/get_criteria_from_network_type.ts @@ -7,7 +7,7 @@ import { CriteriaFields } from '../types'; import { NetworkType } from '../../../../network/store/model'; -import { FlowTarget } from '../../../../graphql/types'; +import { FlowTarget } from '../../../../../common/search_strategy'; export const getCriteriaFromNetworkType = ( type: NetworkType, diff --git a/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.test.ts index 16e4150845b70..f9122038e989e 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { FlowTarget } from '../../../../graphql/types'; +import { FlowTarget } from '../../../../../common/search_strategy'; import { CriteriaFields } from '../types'; import { networkToCriteria } from './network_to_criteria'; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.ts b/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.ts index 72828be7e4877..10a2606a7545e 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/criteria/network_to_criteria.ts @@ -5,8 +5,8 @@ * 2.0. */ +import { FlowTarget } from '../../../../../common/search_strategy'; import { CriteriaFields } from '../types'; -import { FlowTarget } from '../../../../graphql/types'; export const networkToCriteria = (ip: string, flowTarget: FlowTarget): CriteriaFields[] => { if (flowTarget === FlowTarget.source) { diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx index a2741331756ac..bc383ccefa453 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx @@ -24,7 +24,7 @@ import { ExplorerLink } from '../links/create_explorer_link'; import { FormattedRelativePreferenceDate } from '../../formatted_date'; import { NetworkType } from '../../../../network/store/model'; import { escapeDataProviderId } from '../../drag_and_drop/helpers'; -import { FlowTarget } from '../../../../graphql/types'; +import { FlowTarget } from '../../../../../common/search_strategy'; export const getAnomaliesNetworkTableColumns = ( startDate: string, diff --git a/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.test.ts b/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.test.ts index 4ab2b8cf44a0e..dd85d9fedab01 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/tables/network_equality.test.ts @@ -8,7 +8,7 @@ import { networkEquality } from './network_equality'; import { AnomaliesNetworkTableProps } from '../types'; import { NetworkType } from '../../../../network/store/model'; -import { FlowTarget } from '../../../../graphql/types'; +import { FlowTarget } from '../../../../../common/search_strategy'; describe('network_equality', () => { test('it returns true if start and end date are equal', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/ml/types.ts b/x-pack/plugins/security_solution/public/common/components/ml/types.ts index 51da87e571e52..494c8a522ffac 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/ml/types.ts @@ -6,10 +6,10 @@ */ import { Influencer } from '../../../../../ml/public'; +import { FlowTarget } from '../../../../common/search_strategy'; import { HostsType } from '../../../hosts/store/model'; import { NetworkType } from '../../../network/store/model'; -import { FlowTarget } from '../../../graphql/types'; export interface Source { job_id: string; diff --git a/x-pack/plugins/security_solution/public/common/components/paginated_table/helpers.ts b/x-pack/plugins/security_solution/public/common/components/paginated_table/helpers.ts index 8c8f8d0acebc0..1e7b1c749c004 100644 --- a/x-pack/plugins/security_solution/public/common/components/paginated_table/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/components/paginated_table/helpers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { PaginationInputPaginated } from '../../../graphql/types'; +import { PaginationInputPaginated } from '../../../../common/search_strategy'; export const generateTablePaginationOptions = ( activePage: number, diff --git a/x-pack/plugins/security_solution/public/common/components/paginated_table/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/paginated_table/index.test.tsx index 3439bb0a7ddb3..64c3584bc668c 100644 --- a/x-pack/plugins/security_solution/public/common/components/paginated_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/paginated_table/index.test.tsx @@ -9,12 +9,12 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../common/constants'; -import { Direction } from '../../../graphql/types'; import { BasicTableProps, PaginatedTable } from './index'; import { getHostsColumns, mockData, rowItems, sortedHosts } from './index.mock'; import { ThemeProvider } from 'styled-components'; import { getMockTheme } from '../../lib/kibana/kibana_react.mock'; +import { Direction } from '../../../../common/search_strategy'; jest.mock('react', () => { const r = jest.requireActual('react'); diff --git a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx index 3729f9dcdf68b..e8f382a5050d8 100644 --- a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx @@ -12,7 +12,6 @@ import { Sourcerer } from './index'; import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; import { sourcererActions, sourcererModel } from '../../store/sourcerer'; import { - apolloClientObservable, createSecuritySolutionStorageMock, kibanaObservable, mockGlobalState, @@ -53,22 +52,10 @@ describe('Sourcerer component', () => { }); const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); // Using props callback instead of simulating clicks, @@ -100,13 +87,7 @@ describe('Sourcerer component', () => { }, }; - store = createStore( - state2, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state2, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const wrapper = mount( @@ -154,7 +135,6 @@ describe('Sourcerer component', () => { }, }, SUB_PLUGINS_REDUCER, - apolloClientObservable, kibanaObservable, storage ); @@ -185,7 +165,6 @@ describe('Sourcerer component', () => { }, }, SUB_PLUGINS_REDUCER, - apolloClientObservable, kibanaObservable, storage ); @@ -209,7 +188,6 @@ describe('Sourcerer component', () => { }, }, SUB_PLUGINS_REDUCER, - apolloClientObservable, kibanaObservable, storage ); @@ -251,7 +229,6 @@ describe('Sourcerer component', () => { }, }, SUB_PLUGINS_REDUCER, - apolloClientObservable, kibanaObservable, storage ); diff --git a/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx index 4c4cc1f838a50..e2961de91c448 100644 --- a/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/stat_items/index.test.tsx @@ -31,7 +31,6 @@ import { mockNarrowDateRange, } from '../../../network/components/kpi_network/mock'; import { - apolloClientObservable, createSecuritySolutionStorageMock, kibanaObservable, mockGlobalState, @@ -60,13 +59,7 @@ describe('Stat Items Component', () => { const mockTheme = getMockTheme({ eui: { euiColorMediumShade: '#ece' } }); const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - const store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); describe.each([ [ diff --git a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.test.tsx index 5af5b81c75cd6..7cc0b80b51f80 100644 --- a/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/super_date_picker/index.test.tsx @@ -12,7 +12,6 @@ import { Provider as ReduxStoreProvider } from 'react-redux'; import { DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../../common/constants'; import { useUiSetting$ } from '../../lib/kibana'; import { - apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, @@ -83,23 +82,11 @@ describe('SIEM Super Date Picker', () => { describe('#SuperDatePicker', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { jest.clearAllMocks(); - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); mockUseUiSetting$.mockImplementation((key, defaultValue) => { const useUiSetting$Mock = createUseUiSetting$Mock(); diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx index 0b5e07488ff2a..005602738f376 100644 --- a/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.test.tsx @@ -11,7 +11,6 @@ import { waitFor } from '@testing-library/react'; import '../../mock/match_media'; import { mockBrowserFields } from '../../containers/source/mock'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -157,13 +156,7 @@ const state: State = { }; const { storage } = createSecuritySolutionStorageMock(); -const store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage -); +const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); let testProps = { browserFields: mockBrowserFields, diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx index 56a6dd089cf05..a2d5076031328 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx @@ -29,7 +29,6 @@ import { SecurityPageName } from '../../../../common/constants'; export const dispatchSetInitialStateFromUrl = ( dispatch: Dispatch ): DispatchSetInitialStateFromUrl => ({ - apolloClient, detailName, filterManager, indexPattern, @@ -99,7 +98,6 @@ export const dispatchSetInitialStateFromUrl = ( if (timeline != null && timeline.id !== '') { queryTimelineById({ activeTimelineTab: timeline.activeTab, - apolloClient, duplicate: false, graphEventId: timeline.graphEventId, timelineId: timeline.id, diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/types.ts b/x-pack/plugins/security_solution/public/common/components/url_state/types.ts index 8e41514d416ec..1a8d512d211e6 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/url_state/types.ts @@ -5,7 +5,6 @@ * 2.0. */ -import ApolloClient from 'apollo-client'; import * as H from 'history'; import { ActionCreator } from 'typescript-fsa'; import { @@ -148,7 +147,6 @@ export interface UrlStateToRedux { } export interface SetInitialStateFromUrl { - apolloClient: ApolloClient | ApolloClient<{}> | undefined; detailName: string | undefined; filterManager: FilterManager; indexPattern: IIndexPattern | undefined; @@ -160,7 +158,6 @@ export interface SetInitialStateFromUrl { } export type DispatchSetInitialStateFromUrl = ({ - apolloClient, detailName, indexPattern, pageName, diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx index 84f74434cbcd0..7785fa6af2569 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx @@ -10,7 +10,6 @@ import { useEffect, useRef, useState } from 'react'; import deepEqual from 'fast-deep-equal'; import { useKibana } from '../../lib/kibana'; -import { useApolloClient } from '../../utils/apollo_context'; import { CONSTANTS, UrlStateType } from './constants'; import { getQueryStringFromLocation, @@ -70,7 +69,6 @@ export const useUrlStateHooks = ({ urlState, }: UrlStateContainerPropTypes) => { const [isInitializing, setIsInitializing] = useState(true); - const apolloClient = useApolloClient(); const { filterManager, savedQueries } = useKibana().services.data.query; const prevProps = usePrevious({ pathName, pageName, urlState }); @@ -161,7 +159,6 @@ export const useUrlStateHooks = ({ }); setInitialStateFromUrl({ - apolloClient, detailName, filterManager, indexPattern, diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts index a50894ad278f3..2d3bb00501da5 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/types.ts @@ -9,9 +9,9 @@ import { ESTermQuery } from '../../../../../common/typed_json'; import { NarrowDateRange } from '../../../components/ml/types'; import { UpdateDateRange } from '../../../components/charts/common'; import { GlobalTimeArgs } from '../../use_global_time'; -import { FlowTarget } from '../../../../graphql/types'; import { HostsType } from '../../../../hosts/store/model'; import { NetworkType } from '../../../../network/store//model'; +import { FlowTarget } from '../../../../../common/search_strategy'; interface QueryTabBodyProps { type: HostsType | NetworkType; diff --git a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts index ed0be60f22516..9a9b5b13137e6 100644 --- a/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts +++ b/x-pack/plugins/security_solution/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts @@ -8,9 +8,9 @@ import deepmerge from 'deepmerge'; import { MlSummaryJob } from '../../../../../../ml/public'; +import { FlowTarget } from '../../../../../common/search_strategy'; import { ESTermQuery } from '../../../../../common/typed_json'; import { createFilter } from '../../helpers'; -import { FlowTarget } from '../../../../graphql/types'; export const getAnomaliesFilterQuery = ( filterQuery: string | ESTermQuery | undefined, diff --git a/x-pack/plugins/security_solution/public/common/containers/errors/index.test.tsx b/x-pack/plugins/security_solution/public/common/containers/errors/index.test.tsx deleted file mode 100644 index 822c936206333..0000000000000 --- a/x-pack/plugins/security_solution/public/common/containers/errors/index.test.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { reTryOneTimeOnErrorHandler, errorLinkHandler } from '.'; -import { ServerError } from 'apollo-link-http-common'; -import { Operation } from 'apollo-link'; -import { GraphQLError } from 'graphql'; -import * as store from '../../store'; -import { onError } from 'apollo-link-error'; - -const mockDispatch = jest.fn(); -jest.mock('apollo-link-error'); -jest.mock('../../store'); -(store.getStore as jest.Mock).mockReturnValue({ dispatch: mockDispatch }); - -describe('errorLinkHandler', () => { - const mockGraphQLErrors: GraphQLError = { - message: 'GraphQLError', - } as GraphQLError; - const mockNetworkError: ServerError = { - result: {}, - statusCode: 503, - name: '', - message: 'error', - response: { - ok: false, - } as Response, - }; - const mockOperation: Operation = {} as Operation; - const mockForward = jest.fn(); - - afterEach(() => { - mockDispatch.mockClear(); - }); - - test('it should display error if graphQLErrors exist', () => { - errorLinkHandler({ - graphQLErrors: [mockGraphQLErrors], - operation: mockOperation, - forward: mockForward, - }); - - expect(store.getStore).toBeCalled(); - expect(mockDispatch.mock.calls.length).toBe(1); - }); - - test('it should display error if networkError exist', () => { - errorLinkHandler({ - networkError: mockNetworkError, - operation: mockOperation, - forward: mockForward, - }); - - expect(store.getStore).toBeCalled(); - expect(mockDispatch.mock.calls.length).toBe(1); - }); -}); - -describe('errorLink', () => { - test('onError should be called with errorLinkHandler', () => { - expect(onError).toHaveBeenCalledWith(errorLinkHandler); - }); -}); - -describe('reTryOneTimeOnErrorHandler', () => { - const mockNetworkError: ServerError = { - result: {}, - statusCode: 503, - name: '', - message: 'error', - response: { - ok: false, - } as Response, - }; - const mockOperation: Operation = {} as Operation; - const mockForward = jest.fn(); - - afterEach(() => { - mockForward.mockClear(); - }); - test('it should retry only if network status code is 503', () => { - reTryOneTimeOnErrorHandler({ - networkError: mockNetworkError, - operation: mockOperation, - forward: mockForward, - }); - expect(mockForward).toBeCalledWith(mockOperation); - }); - - test('it should not retry if other error happens', () => { - reTryOneTimeOnErrorHandler({ - networkError: { ...mockNetworkError, statusCode: 500 }, - operation: mockOperation, - forward: mockForward, - }); - expect(mockForward).not.toBeCalled(); - }); -}); - -describe('reTryOneTimeOnErrorLink', () => { - test('onError should be called with reTryOneTimeOnErrorHandler', () => { - expect(onError).toHaveBeenCalledWith(reTryOneTimeOnErrorHandler); - }); -}); diff --git a/x-pack/plugins/security_solution/public/common/containers/errors/index.tsx b/x-pack/plugins/security_solution/public/common/containers/errors/index.tsx deleted file mode 100644 index f1b3a1b0c4352..0000000000000 --- a/x-pack/plugins/security_solution/public/common/containers/errors/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { onError, ErrorLink } from 'apollo-link-error'; -import { get, throttle, noop } from 'lodash/fp'; - -import uuid from 'uuid'; - -import * as i18n from './translations'; - -import { getStore } from '../../store'; -import { appActions } from '../../store/actions'; - -export const errorLinkHandler: ErrorLink.ErrorHandler = ({ graphQLErrors, networkError }) => { - const store = getStore(); - const dispatch = throttle(50, store != null ? store.dispatch : noop); - - if (graphQLErrors != null && store != null) { - dispatch( - appActions.addError({ - id: uuid.v4(), - title: i18n.DATA_FETCH_FAILURE, - message: graphQLErrors.map(({ message }) => message), - }) - ); - } - - if (networkError != null && store != null) { - dispatch( - appActions.addError({ - id: uuid.v4(), - title: i18n.NETWORK_FAILURE, - message: [networkError.message], - }) - ); - } -}; -export const errorLink = onError(errorLinkHandler); - -export const reTryOneTimeOnErrorHandler: ErrorLink.ErrorHandler = ({ - networkError, - operation, - forward, -}) => { - if (networkError != null) { - const statusCode = get('statusCode', networkError); - if (statusCode != null && statusCode === 503) { - return forward(operation); - } - } -}; - -export const reTryOneTimeOnErrorLink = onError(reTryOneTimeOnErrorHandler); diff --git a/x-pack/plugins/security_solution/public/common/containers/errors/translations.ts b/x-pack/plugins/security_solution/public/common/containers/errors/translations.ts deleted file mode 100644 index bec8c98951f28..0000000000000 --- a/x-pack/plugins/security_solution/public/common/containers/errors/translations.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const DATA_FETCH_FAILURE = i18n.translate( - 'xpack.securitySolution.containers.errors.dataFetchFailureTitle', - { - defaultMessage: 'Data Fetch Failure', - } -); - -export const NETWORK_FAILURE = i18n.translate( - 'xpack.securitySolution.containers.errors.networkFailureTitle', - { - defaultMessage: 'Network Failure', - } -); diff --git a/x-pack/plugins/security_solution/public/common/containers/helpers.ts b/x-pack/plugins/security_solution/public/common/containers/helpers.ts index efc50f4e4d948..f46147ceabf7c 100644 --- a/x-pack/plugins/security_solution/public/common/containers/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/containers/helpers.ts @@ -5,12 +5,9 @@ * 2.0. */ -import { FetchPolicy } from 'apollo-client'; import { isString } from 'lodash/fp'; import { ESQuery } from '../../../common/typed_json'; export const createFilter = (filterQuery: ESQuery | string | undefined) => isString(filterQuery) ? filterQuery : JSON.stringify(filterQuery); - -export const getDefaultFetchPolicy = (): FetchPolicy => 'cache-and-network'; diff --git a/x-pack/plugins/security_solution/public/common/containers/query_template.tsx b/x-pack/plugins/security_solution/public/common/containers/query_template.tsx deleted file mode 100644 index e8c7d2e0ef436..0000000000000 --- a/x-pack/plugins/security_solution/public/common/containers/query_template.tsx +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ApolloQueryResult } from 'apollo-client'; -import React from 'react'; -import { FetchMoreOptions, FetchMoreQueryOptions, OperationVariables } from 'react-apollo'; - -import { ESQuery } from '../../../common/typed_json'; -import { DocValueFields } from './source'; - -export { DocValueFields }; - -export interface QueryTemplateProps { - indexNames: string[]; - docValueFields?: DocValueFields[]; - id?: string; - endDate?: string; - filterQuery?: ESQuery | string; - skip?: boolean; - sourceId: string; - startDate?: string; -} -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type FetchMoreOptionsArgs = FetchMoreQueryOptions & - FetchMoreOptions; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type PromiseApolloQueryResult = Promise>; - -export class QueryTemplate< - T extends QueryTemplateProps, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - TData = any, - TVariables = OperationVariables -> extends React.PureComponent { - private fetchMore!: ( - fetchMoreOptions: FetchMoreOptionsArgs - ) => PromiseApolloQueryResult; - - private fetchMoreOptions!: ( - newCursor: string, - tiebreaker?: string - ) => FetchMoreOptionsArgs; - - private refetch!: (variables?: TVariables) => Promise>; - - private executeBeforeFetchMore!: ({ id }: { id?: string }) => void; - - private executeBeforeRefetch!: ({ id }: { id?: string }) => void; - - public setExecuteBeforeFetchMore = (val: ({ id }: { id?: string }) => void) => { - this.executeBeforeFetchMore = val; - }; - public setExecuteBeforeRefetch = (val: ({ id }: { id?: string }) => void) => { - this.executeBeforeRefetch = val; - }; - - public setFetchMore = ( - val: (fetchMoreOptions: FetchMoreOptionsArgs) => PromiseApolloQueryResult - ) => { - this.fetchMore = val; - }; - - public setFetchMoreOptions = ( - val: (newCursor: string, tiebreaker?: string) => FetchMoreOptionsArgs - ) => { - this.fetchMoreOptions = val; - }; - - public setRefetch = (val: (variables?: TVariables) => Promise>) => { - this.refetch = val; - }; - - public wrappedLoadMore = (newCursor: string, tiebreaker?: string) => { - this.executeBeforeFetchMore({ id: this.props.id }); - return this.fetchMore(this.fetchMoreOptions(newCursor, tiebreaker)); - }; - - public wrappedRefetch = (variables?: TVariables) => { - this.executeBeforeRefetch({ id: this.props.id }); - return this.refetch(variables); - }; -} diff --git a/x-pack/plugins/security_solution/public/common/containers/query_template_paginated.tsx b/x-pack/plugins/security_solution/public/common/containers/query_template_paginated.tsx deleted file mode 100644 index 0dc8aa9abf38f..0000000000000 --- a/x-pack/plugins/security_solution/public/common/containers/query_template_paginated.tsx +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ApolloQueryResult, NetworkStatus } from 'apollo-client'; -import memoizeOne from 'memoize-one'; -import React from 'react'; -import { FetchMoreOptions, FetchMoreQueryOptions, OperationVariables } from 'react-apollo'; -import deepEqual from 'fast-deep-equal'; - -import { ESQuery } from '../../../common/typed_json'; -import { inputsModel } from '../store/model'; -import { generateTablePaginationOptions } from '../components/paginated_table/helpers'; -import { DocValueFields } from './source'; - -export { DocValueFields }; - -export interface QueryTemplatePaginatedProps { - docValueFields?: DocValueFields[]; - id?: string; - endDate?: string; - filterQuery?: ESQuery | string; - skip?: boolean; - sourceId: string; - startDate?: string; -} -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type FetchMoreOptionsArgs = FetchMoreQueryOptions & - FetchMoreOptions; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type PromiseApolloQueryResult = Promise>; - -export class QueryTemplatePaginated< - T extends QueryTemplatePaginatedProps, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - TData = any, - TVariables = OperationVariables -> extends React.PureComponent { - private queryVariables: TVariables | null = null; - private myLoading: boolean = false; - private fetchMore!: ( - fetchMoreOptions: FetchMoreOptionsArgs - ) => PromiseApolloQueryResult; - - private fetchMoreOptions!: (newActivePage: number) => FetchMoreOptionsArgs; - - public memoizedRefetchQuery: ( - variables: TVariables, - limit: number, - refetch: (variables?: TVariables) => Promise> - ) => inputsModel.Refetch; - - constructor(props: T) { - super(props); - this.memoizedRefetchQuery = memoizeOne(this.refetchQuery); - } - - public setFetchMore = ( - val: (fetchMoreOptions: FetchMoreOptionsArgs) => PromiseApolloQueryResult - ) => { - this.fetchMore = val; - }; - - public setFetchMoreOptions = ( - val: (newActivePage: number) => FetchMoreOptionsArgs - ) => { - this.fetchMoreOptions = val; - }; - - public wrappedLoadMore = (newActivePage: number) => { - return this.fetchMore(this.fetchMoreOptions(newActivePage)); - }; - - public refetchQuery = ( - variables: TVariables, - limit: number, - refetch: (variables?: TVariables) => Promise> - ): inputsModel.Refetch => () => { - refetch({ ...variables, pagination: generateTablePaginationOptions(0, limit) }); - }; - - public setPrevVariables(vars: TVariables) { - this.queryVariables = vars; - } - - public isItAValidLoading(loading: boolean, variables: TVariables, networkStatus: NetworkStatus) { - if ( - !this.myLoading && - (!deepEqual(variables, this.queryVariables) || networkStatus === NetworkStatus.refetch) && - loading - ) { - this.myLoading = true; - } else if (this.myLoading && !loading) { - this.myLoading = false; - } - this.setPrevVariables(variables); - return this.myLoading; - } -} diff --git a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx index 7a20c98a8d4bf..542369fdf5aa3 100644 --- a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx @@ -12,7 +12,7 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { Provider } from 'react-redux'; import { useInitSourcerer } from '.'; -import { mockPatterns, mockSource } from './mocks'; +import { mockPatterns } from './mocks'; // import { SourcererScopeName } from '../../store/sourcerer/model'; import { RouteSpyState } from '../../utils/route/types'; import { SecurityPageName } from '../../../../common/constants'; @@ -22,14 +22,12 @@ import { initialState as userInfoState, } from '../../../detections/components/user_info'; import { - apolloClientObservable, createSecuritySolutionStorageMock, kibanaObservable, mockGlobalState, SUB_PLUGINS_REDUCER, } from '../../mock'; import { SourcererScopeName } from '../../store/sourcerer/model'; -const mockSourceDefaults = mockSource; const mockRouteSpy: RouteSpyState = { pageName: SecurityPageName.overview, @@ -81,11 +79,6 @@ jest.mock('../../lib/kibana', () => ({ }), useUiSetting$: jest.fn().mockImplementation(() => [mockPatterns]), })); -jest.mock('../../utils/apollo_context', () => ({ - useApolloClient: jest.fn().mockReturnValue({ - query: jest.fn().mockImplementation(() => Promise.resolve(mockSourceDefaults)), - }), -})); describe('Sourcerer Hooks', () => { const state: State = { @@ -112,24 +105,12 @@ describe('Sourcerer Hooks', () => { }, }; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { jest.clearAllMocks(); jest.restoreAllMocks(); - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); mockUseUserInfo.mockImplementation(() => userInfoState); }); it('initializes loading default and timeline index patterns', async () => { diff --git a/x-pack/plugins/security_solution/public/common/lib/compose/helpers.test.ts b/x-pack/plugins/security_solution/public/common/lib/compose/helpers.test.ts deleted file mode 100644 index 8465e343d2a41..0000000000000 --- a/x-pack/plugins/security_solution/public/common/lib/compose/helpers.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; -import { errorLink, reTryOneTimeOnErrorLink } from '../../containers/errors'; -import { getLinks } from './helpers'; -import { withClientState } from 'apollo-link-state'; -import * as apolloLinkHttp from 'apollo-link-http'; -import introspectionQueryResultData from '../../../graphql/introspection.json'; - -jest.mock('apollo-cache-inmemory'); -jest.mock('apollo-link-http'); -jest.mock('apollo-link-state'); -jest.mock('../../containers/errors'); -const mockWithClientState = 'mockWithClientState'; -const mockHttpLink = { mockHttpLink: 'mockHttpLink' }; - -(withClientState as jest.Mock).mockReturnValue(mockWithClientState); -(apolloLinkHttp.createHttpLink as jest.Mock).mockImplementation(() => mockHttpLink); - -describe('getLinks helper', () => { - test('It should return links in correct order', () => { - const mockCache = new InMemoryCache({ - dataIdFromObject: () => null, - fragmentMatcher: new IntrospectionFragmentMatcher({ - // @ts-expect-error apollo-cache-inmemory types don't match actual introspection data - introspectionQueryResultData, - }), - }); - const links = getLinks(mockCache, 'basePath'); - expect(links[0]).toEqual(errorLink); - expect(links[1]).toEqual(reTryOneTimeOnErrorLink); - expect(links[2]).toEqual(mockWithClientState); - expect(links[3]).toEqual(mockHttpLink); - }); -}); diff --git a/x-pack/plugins/security_solution/public/common/lib/compose/helpers.ts b/x-pack/plugins/security_solution/public/common/lib/compose/helpers.ts deleted file mode 100644 index d9833844d843f..0000000000000 --- a/x-pack/plugins/security_solution/public/common/lib/compose/helpers.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { createHttpLink } from 'apollo-link-http'; -import { withClientState } from 'apollo-link-state'; -import { InMemoryCache } from 'apollo-cache-inmemory'; - -import { errorLink, reTryOneTimeOnErrorLink } from '../../containers/errors'; - -export const getLinks = (cache: InMemoryCache, basePath: string) => [ - errorLink, - reTryOneTimeOnErrorLink, - withClientState({ - cache, - resolvers: {}, - }), - createHttpLink({ - credentials: 'same-origin', - headers: { 'kbn-xsrf': 'true' }, - uri: `${basePath}/api/solutions/security/graphql`, - }), -]; diff --git a/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx b/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx deleted file mode 100644 index 74a31ac58c6c5..0000000000000 --- a/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; -import { ApolloLink } from 'apollo-link'; - -import introspectionQueryResultData from '../../../graphql/introspection.json'; -import { AppFrontendLibs } from '../lib'; -import { getLinks } from './helpers'; -import { CoreStart } from '../../../../../../../src/core/public'; - -export function composeLibs(core: CoreStart): AppFrontendLibs { - const cache = new InMemoryCache({ - dataIdFromObject: () => null, - fragmentMatcher: new IntrospectionFragmentMatcher({ - // @ts-expect-error apollo-cache-inmemory types don't match actual introspection data - introspectionQueryResultData, - }), - }); - const basePath = core.http.basePath.get(); - - const apolloClient = new ApolloClient({ - connectToDevTools: process.env.NODE_ENV !== 'production', - cache, - link: ApolloLink.from(getLinks(cache, basePath)), - }); - - const libs: AppFrontendLibs = { - apolloClient, - }; - return libs; -} diff --git a/x-pack/plugins/security_solution/public/common/lib/lib.ts b/x-pack/plugins/security_solution/public/common/lib/lib.ts deleted file mode 100644 index 7919ef78fff0b..0000000000000 --- a/x-pack/plugins/security_solution/public/common/lib/lib.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { NormalizedCacheObject } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; - -export interface AppFrontendLibs { - apolloClient: AppApolloClient; -} - -export type AppTimezoneProvider = () => string; - -export type AppApolloClient = ApolloClient; - -export interface AppFrameworkAdapter { - appState?: object; - bytesFormat?: string; - dateFormat?: string; - dateFormatTz?: string; - darkMode?: boolean; - indexPattern?: string; - anomalyScore?: number; - scaledDateFormat?: string; - timezone?: string; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - setUISettings(key: string, value: any): void; -} - -export interface AppKibanaUIConfig { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - get(key: string): any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - set(key: string, value: any): Promise; -} diff --git a/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx b/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx index 6f0f719c867d2..2d3a01f820b44 100644 --- a/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx +++ b/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx @@ -14,7 +14,7 @@ import { coreMock } from '../../../../../../../src/core/public/mocks'; import { StartPlugins } from '../../../types'; import { depsStartMock } from './dependencies_start_mock'; import { MiddlewareActionSpyHelper, createSpyMiddleware } from '../../store/test_utils'; -import { apolloClientObservable, kibanaObservable } from '../test_providers'; +import { kibanaObservable } from '../test_providers'; import { createStore, State } from '../../store'; import { AppRootProvider } from './app_root_provider'; import { managementMiddlewareFactory } from '../../../management/store/middleware'; @@ -58,14 +58,10 @@ export const createAppRootMockRenderer = (): AppContextTestRender => { const middlewareSpy = createSpyMiddleware(); const { storage } = createSecuritySolutionStorageMock(); - const store = createStore( - mockGlobalState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage, - [...managementMiddlewareFactory(coreStart, depsStart), middlewareSpy.actionSpyMiddleware] - ); + const store = createStore(mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, storage, [ + ...managementMiddlewareFactory(coreStart, depsStart), + middlewareSpy.actionSpyMiddleware, + ]); const MockKibanaContextProvider = createKibanaContextProviderMock(); diff --git a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx index 5baec99274823..90526e84a2262 100644 --- a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx @@ -7,11 +7,8 @@ import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; import { I18nProvider } from '@kbn/i18n/react'; -import { InMemoryCache as Cache } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; -import { ApolloLink } from 'apollo-link'; + import React from 'react'; -import { ApolloProvider } from 'react-apollo'; import { DragDropContext, DropResult, ResponderProvided } from 'react-beautiful-dnd'; import { Provider as ReduxStoreProvider } from 'react-redux'; import { Store } from 'redux'; @@ -36,12 +33,6 @@ interface Props { onDragEnd?: (result: DropResult, provided: ResponderProvided) => void; } -export const apolloClient = new ApolloClient({ - cache: new Cache(), - link: new ApolloLink((o, f) => (f ? f(o) : null)), -}); - -export const apolloClientObservable = new BehaviorSubject(apolloClient); export const kibanaObservable = new BehaviorSubject(createStartServicesMock()); Object.defineProperty(window, 'localStorage', { @@ -54,24 +45,16 @@ const { storage } = createSecuritySolutionStorageMock(); /** A utility for wrapping children in the providers required to run most tests */ const TestProvidersComponent: React.FC = ({ children, - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ), + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage), onDragEnd = jest.fn(), }) => ( - - - ({ eui: euiDarkVars, darkMode: true })}> - {children} - - - + + ({ eui: euiDarkVars, darkMode: true })}> + {children} + + ); diff --git a/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts b/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts index 5aef3b97c81b7..c02c47d45f732 100644 --- a/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts +++ b/x-pack/plugins/security_solution/public/common/mock/timeline_results.ts @@ -12,1736 +12,1606 @@ import { TimelineType, TimelineStatus, TimelineTabs, + TimelineResult, } from '../../../common/types/timeline'; import { OpenTimelineResult } from '../../timelines/components/open_timeline/types'; -import { GetAllTimeline, SortFieldTimeline, TimelineResult, Direction } from '../../graphql/types'; -import { TimelineEventsDetailsItem } from '../../../common/search_strategy'; -import { allTimelinesQuery } from '../../timelines/containers/all/index.gql_query'; +import { Direction, TimelineEventsDetailsItem } from '../../../common/search_strategy'; import { CreateTimelineProps } from '../../detections/components/alerts_table/types'; import { TimelineModel } from '../../timelines/store/timeline/model'; import { timelineDefaults } from '../../timelines/store/timeline/defaults'; -export interface MockedProvidedQuery { - request: { - query: GetAllTimeline.Query; - variables: GetAllTimeline.Variables; - }; - result: { - data: { - getAllTimeline: { - totalCount: number; - timeline: TimelineResult[]; - }; - }; - }; -} -/** Mocks results of a query run by the `OpenTimeline` component */ -export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [ - { - request: { - query: (allTimelinesQuery as unknown) as GetAllTimeline.Query, - variables: { - onlyUserFavorite: false, - pageInfo: { - pageIndex: 1, - pageSize: 10, - }, - search: '', - sort: { - sortField: 'updated' as SortFieldTimeline, - sortOrder: 'desc' as Direction, +export const mockOpenTimelineQueryResults = { + totalCount: 11, + timeline: [ + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811609', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, }, - }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 1', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', }, - result: { - data: { - getAllTimeline: { - totalCount: 11, - timeline: [ - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811609', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 1', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f91', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 2', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f92', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 2', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f9', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 3', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f93', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 4', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f94', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 5', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f95', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 6', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f96', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 7', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f97', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 7', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f98', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 7', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f99', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 7', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f910', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 7', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - { - savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f911', - description: 'hhw4', - favorite: [ - { - fullName: null, - userName: 'elastic', - favoriteDate: 1558390951234, - }, - ], - eventIdToNoteIds: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - timelineVersion: null, - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - ], - notes: [ - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'test pinned event 2', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', - created: 1558404484133, - createdBy: 'elastic', - updated: 1558404484133, - updatedBy: 'elastic', - version: 'WzEzOSwxXQ==', - }, - { - eventId: 'ZF0W12oB9v5HJNSHwY6L', - note: 'Test pinned 1', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404474317, - createdBy: 'elastic', - updated: 1558404474317, - updatedBy: 'elastic', - version: 'WzEzNywxXQ==', - }, - { - eventId: '4l0W12oB9v5HJNSHY4wv', - note: 'again', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', - created: 1558404491600, - createdBy: 'elastic', - updated: 1558404491600, - updatedBy: 'elastic', - version: 'WzE0MSwxXQ==', - }, - { - eventId: null, - note: 'Hello world', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', - created: 1558404450688, - createdBy: 'elastic', - updated: 1558404450688, - updatedBy: 'elastic', - version: 'WzEzMywxXQ==', - }, - { - eventId: null, - note: 'here I am', - timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', - timelineVersion: null, - noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', - created: 1558404458065, - createdBy: 'elastic', - updated: 1558404458065, - updatedBy: 'elastic', - version: 'WzEzNCwxXQ==', - }, - ], - noteIds: [ - '308783f0-7b6d-11e9-980a-e5349fc014ef', - '34ec1690-7b6d-11e9-980a-e5349fc014ef', - ], - pinnedEventIds: [ - 'Wl0W12oB9v5HJNSHb400', - '410W12oB9v5HJNSHY4wv', - 'ZF0W12oB9v5HJNSHwY6L', - ], - title: 'test 7', - timelineType: TimelineType.default, - templateTimelineId: null, - templateTimelineVersion: null, - created: 1558386787614, - createdBy: 'elastic', - updated: 1558390951234, - updatedBy: 'elastic', - version: 'WzEyOCwxXQ==', - }, - ], + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f91', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, }, - }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 2', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', }, - }, -]; + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f92', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 2', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f9', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 3', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f93', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 4', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f94', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 5', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f95', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 6', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f96', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 7', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f97', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 7', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f98', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 7', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f99', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 7', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f910', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 7', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + { + savedObjectId: '10849df0-7b44-11e9-a608-ab3d811602f911', + description: 'hhw4', + favorite: [ + { + fullName: null, + userName: 'elastic', + favoriteDate: 1558390951234, + }, + ], + eventIdToNoteIds: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + timelineVersion: null, + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + ], + notes: [ + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'test pinned event 2', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '44763500-7b6d-11e9-980a-e5349fc014ef', + created: 1558404484133, + createdBy: 'elastic', + updated: 1558404484133, + updatedBy: 'elastic', + version: 'WzEzOSwxXQ==', + }, + { + eventId: 'ZF0W12oB9v5HJNSHwY6L', + note: 'Test pinned 1', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '3e9d51e0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404474317, + createdBy: 'elastic', + updated: 1558404474317, + updatedBy: 'elastic', + version: 'WzEzNywxXQ==', + }, + { + eventId: '4l0W12oB9v5HJNSHY4wv', + note: 'again', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '48eaf440-7b6d-11e9-980a-e5349fc014ef', + created: 1558404491600, + createdBy: 'elastic', + updated: 1558404491600, + updatedBy: 'elastic', + version: 'WzE0MSwxXQ==', + }, + { + eventId: null, + note: 'Hello world', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '308783f0-7b6d-11e9-980a-e5349fc014ef', + created: 1558404450688, + createdBy: 'elastic', + updated: 1558404450688, + updatedBy: 'elastic', + version: 'WzEzMywxXQ==', + }, + { + eventId: null, + note: 'here I am', + timelineId: '10849df0-7b44-11e9-a608-ab3d811602f9', + timelineVersion: null, + noteId: '34ec1690-7b6d-11e9-980a-e5349fc014ef', + created: 1558404458065, + createdBy: 'elastic', + updated: 1558404458065, + updatedBy: 'elastic', + version: 'WzEzNCwxXQ==', + }, + ], + noteIds: ['308783f0-7b6d-11e9-980a-e5349fc014ef', '34ec1690-7b6d-11e9-980a-e5349fc014ef'], + pinnedEventIds: ['Wl0W12oB9v5HJNSHb400', '410W12oB9v5HJNSHY4wv', 'ZF0W12oB9v5HJNSHwY6L'], + title: 'test 7', + timelineType: TimelineType.default, + templateTimelineId: null, + templateTimelineVersion: null, + created: 1558386787614, + createdBy: 'elastic', + updated: 1558390951234, + updatedBy: 'elastic', + version: 'WzEyOCwxXQ==', + }, + ], +}; /** Mocks results of a query run by the `OpenTimeline` component */ export const mockTimelineResults: OpenTimelineResult[] = [ @@ -2170,7 +2040,7 @@ export const mockTimelineModel: TimelineModel = { version: '1', }; -export const mockTimelineResult: TimelineResult = { +export const mockGetOneTimelineResult: TimelineResult = { savedObjectId: 'ef579e40-jibber-jabber', columns: timelineDefaults.columns.filter((column) => column.id !== 'event.action'), dateRange: { start: '2020-03-18T13:46:38.929Z', end: '2020-03-18T13:52:38.929Z' }, @@ -2193,13 +2063,13 @@ export const mockTimelineResult: TimelineResult = { templateTimelineId: null, templateTimelineVersion: null, savedQueryId: null, - sort: [{ columnId: '@timestamp', columnType: 'number', sortDirection: 'desc' }], + sort: [{ columnId: '@timestamp', columnType: 'number', sortDirection: Direction.desc }], version: '1', }; -export const mockTimelineApolloResult = { +export const mockTimelineResult = { data: { - getOneTimeline: mockTimelineResult, + getOneTimeline: mockGetOneTimelineResult, }, loading: false, networkStatus: 7, diff --git a/x-pack/plugins/security_solution/public/common/store/store.ts b/x-pack/plugins/security_solution/public/common/store/store.ts index efd97891f1573..e253ae1bbaf98 100644 --- a/x-pack/plugins/security_solution/public/common/store/store.ts +++ b/x-pack/plugins/security_solution/public/common/store/store.ts @@ -26,7 +26,6 @@ import { timelineSelectors } from '../../timelines/store/timeline'; import { inputsSelectors } from './inputs'; import { SubPluginsInitReducer, createReducer } from './reducer'; import { createRootEpic } from './epic'; -import { AppApolloClient } from '../lib/lib'; import { AppAction } from './actions'; import { Immutable } from '../../../common/endpoint/types'; import { State } from './types'; @@ -52,7 +51,6 @@ let store: Store | null = null; export const createStore = ( state: PreloadedState, pluginsReducer: SubPluginsInitReducer, - apolloClient: Observable, kibana: Observable, storage: Storage, additionalMiddleware?: Array>>> @@ -60,7 +58,6 @@ export const createStore = ( const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; const middlewareDependencies: TimelineEpicDependencies = { - apolloClient$: apolloClient, kibana$: kibana, selectAllTimelineQuery: inputsSelectors.globalQueryByIdSelector, selectNotesByIdSelector: appSelectors.selectNotesByIdSelector, diff --git a/x-pack/plugins/security_solution/public/common/utils/apollo_context.ts b/x-pack/plugins/security_solution/public/common/utils/apollo_context.ts deleted file mode 100644 index c53d9903cd8d5..0000000000000 --- a/x-pack/plugins/security_solution/public/common/utils/apollo_context.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ApolloClient } from 'apollo-client'; -import { createContext, useContext } from 'react'; - -/** - * This is a temporary provider and hook for use with hooks until react-apollo - * has upgraded to the new-style `createContext` api. - */ - -export const ApolloClientContext = createContext | undefined>(undefined); - -export const useApolloClient = () => { - return useContext(ApolloClientContext); -}; diff --git a/x-pack/plugins/security_solution/public/common/utils/route/types.ts b/x-pack/plugins/security_solution/public/common/utils/route/types.ts index 7305fc3121085..189e68d1c55bb 100644 --- a/x-pack/plugins/security_solution/public/common/utils/route/types.ts +++ b/x-pack/plugins/security_solution/public/common/utils/route/types.ts @@ -14,7 +14,7 @@ import { TimelineType } from '../../../../common/types/timeline'; import { HostsTableType } from '../../../hosts/store/model'; import { NetworkRouteType } from '../../../network/pages/navigation/types'; import { AdministrationSubTab as AdministrationType } from '../../../management/types'; -import { FlowTarget } from '../../../graphql/types'; +import { FlowTarget } from '../../../../common/search_strategy'; export type SiemRouteType = HostsTableType | NetworkRouteType | TimelineType | AdministrationType; export interface RouteSpyState { diff --git a/x-pack/plugins/security_solution/public/common/utils/timeline/use_timeline_click.tsx b/x-pack/plugins/security_solution/public/common/utils/timeline/use_timeline_click.tsx index 4289ccfbc61fa..2756ba2a696e1 100644 --- a/x-pack/plugins/security_solution/public/common/utils/timeline/use_timeline_click.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/timeline/use_timeline_click.tsx @@ -7,7 +7,6 @@ import { useCallback } from 'react'; import { useDispatch } from 'react-redux'; -import { useApolloClient } from '../../../common/utils/apollo_context'; import { dispatchUpdateTimeline, queryTimelineById, @@ -16,12 +15,10 @@ import { updateIsLoading as dispatchUpdateIsLoading } from '../../../timelines/s export const useTimelineClick = () => { const dispatch = useDispatch(); - const apolloClient = useApolloClient(); const handleTimelineClick = useCallback( (timelineId: string, graphEventId?: string) => { queryTimelineById({ - apolloClient, graphEventId, timelineId, updateIsLoading: ({ @@ -34,7 +31,7 @@ export const useTimelineClick = () => { updateTimeline: dispatchUpdateTimeline(dispatch), }); }, - [apolloClient, dispatch] + [dispatch] ); return handleTimelineClick; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx index 6eccba954a175..d5b64a8fe27fc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.test.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import { get } from 'lodash/fp'; import sinon from 'sinon'; import moment from 'moment'; @@ -13,9 +12,7 @@ import { sendAlertToTimelineAction, determineToAndFrom } from './actions'; import { mockEcsDataWithAlert, defaultTimelineProps, - apolloClient, - mockTimelineApolloResult, - mockTimelineDetailsApollo, + mockTimelineResult, mockTimelineDetails, } from '../../../common/mock/'; import { CreateTimeline, UpdateTimelineLoading } from './types'; @@ -28,8 +25,11 @@ import { } from '../../../../common/types/timeline'; import { ISearchStart } from '../../../../../../../src/plugins/data/public'; import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; +import { getTimelineTemplate } from '../../../timelines/containers/api'; -jest.mock('apollo-client'); +jest.mock('../../../timelines/containers/api', () => ({ + getTimelineTemplate: jest.fn(), +})); describe('alert actions', () => { const anchor = '2020-03-01T17:59:46.349Z'; @@ -60,13 +60,7 @@ describe('alert actions', () => { searchSource: {} as ISearchStart['searchSource'], }; - jest.spyOn(apolloClient, 'query').mockImplementation((obj) => { - const id = get('variables.id', obj); - if (id != null) { - return Promise.resolve(mockTimelineApolloResult); - } - return Promise.resolve(mockTimelineDetailsApollo); - }); + (getTimelineTemplate as jest.Mock).mockResolvedValue(mockTimelineResult); clock = sinon.useFakeTimers(unix); }); @@ -79,7 +73,6 @@ describe('alert actions', () => { describe('timeline id is NOT empty string and apollo client exists', () => { test('it invokes updateTimelineIsLoading to set to true', async () => { await sendAlertToTimelineAction({ - apolloClient, createTimeline, ecsData: mockEcsDataWithAlert, nonEcsData: [], @@ -96,7 +89,6 @@ describe('alert actions', () => { test('it invokes createTimeline with designated timeline template if "timelineTemplate" exists', async () => { await sendAlertToTimelineAction({ - apolloClient, createTimeline, ecsData: mockEcsDataWithAlert, nonEcsData: [], @@ -236,8 +228,8 @@ describe('alert actions', () => { }); test('it invokes createTimeline with kqlQuery.filterQuery.kuery.kind as "kuery" if not specified in returned timeline template', async () => { - const mockTimelineApolloResultModified = { - ...mockTimelineApolloResult, + const mockTimelineResultModified = { + ...mockTimelineResult, kqlQuery: { filterQuery: { kuery: { @@ -246,10 +238,9 @@ describe('alert actions', () => { }, }, }; - jest.spyOn(apolloClient, 'query').mockResolvedValue(mockTimelineApolloResultModified); + (getTimelineTemplate as jest.Mock).mockResolvedValue(mockTimelineResultModified); await sendAlertToTimelineAction({ - apolloClient, createTimeline, ecsData: mockEcsDataWithAlert, nonEcsData: [], @@ -263,12 +254,11 @@ describe('alert actions', () => { }); test('it invokes createTimeline with default timeline if apolloClient throws', async () => { - jest.spyOn(apolloClient, 'query').mockImplementation(() => { + (getTimelineTemplate as jest.Mock).mockImplementation(() => { throw new Error('Test error'); }); await sendAlertToTimelineAction({ - apolloClient, createTimeline, ecsData: mockEcsDataWithAlert, nonEcsData: [], @@ -303,7 +293,6 @@ describe('alert actions', () => { }; await sendAlertToTimelineAction({ - apolloClient, createTimeline, ecsData: ecsDataMock, nonEcsData: [], diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx index 4dd40eb2ddaee..e5cefca66d0fd 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx @@ -13,7 +13,12 @@ import moment from 'moment'; import { i18n } from '@kbn/i18n'; import type { Filter } from '../../../../../../../src/plugins/data/common/es_query/filters'; -import { TimelineId, TimelineStatus, TimelineType } from '../../../../common/types/timeline'; +import { + TimelineId, + TimelineResult, + TimelineStatus, + TimelineType, +} from '../../../../common/types/timeline'; import { updateAlertStatus } from '../../containers/detection_engine/alerts/api'; import { SendAlertToTimelineActionProps, @@ -21,7 +26,6 @@ import { UpdateAlertStatusActionProps, } from './types'; import { Ecs } from '../../../../common/ecs'; -import { GetOneTimeline, TimelineResult } from '../../../graphql/types'; import { TimelineNonEcsData, TimelineEventsDetailsItem, @@ -29,7 +33,6 @@ import { TimelineEventsDetailsStrategyResponse, TimelineEventsQueries, } from '../../../../common/search_strategy/timeline'; -import { oneTimelineQuery } from '../../../timelines/containers/one/index.gql_query'; import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; import { omitTypenameInTimeline, @@ -47,6 +50,7 @@ import { QueryOperator, } from '../../../timelines/components/timeline/data_providers/data_provider'; import { esFilters } from '../../../../../../../src/plugins/data/public'; +import { getTimelineTemplate } from '../../../timelines/containers/api'; export const getUpdateAlertsQuery = (eventIds: Readonly) => { return { @@ -362,7 +366,6 @@ export const buildEqlDataProviderOrFilter = ( }; export const sendAlertToTimelineAction = async ({ - apolloClient, createTimeline, ecsData: ecs, nonEcsData, @@ -381,18 +384,11 @@ export const sendAlertToTimelineAction = async ({ const { to, from } = determineToAndFrom({ ecs }); // For now we do not want to populate the template timeline if we have alertIds - if (!isEmpty(timelineId) && apolloClient != null && isEmpty(alertIds)) { + if (!isEmpty(timelineId) && isEmpty(alertIds)) { try { updateTimelineIsLoading({ id: TimelineId.active, isLoading: true }); const [responseTimeline, eventDataResp] = await Promise.all([ - apolloClient.query({ - query: oneTimelineQuery, - fetchPolicy: 'no-cache', - variables: { - id: timelineId, - timelineType: TimelineType.template, - }, - }), + getTimelineTemplate(timelineId), searchStrategyClient .search( { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/helpers.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/helpers.ts index 98cb939ca2656..69cf6ac43d4a7 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/helpers.ts @@ -18,7 +18,7 @@ import { DataProvidersAnd, } from '../../../timelines/components/timeline/data_providers/data_provider'; import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; -import { TimelineType } from '../../../graphql/types'; +import { TimelineType } from '../../../../common/types/timeline'; interface FindValueToChangeInQuery { field: string; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx index 2f0fee980c218..3bf30d57d4a8a 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx @@ -13,7 +13,6 @@ import { TimelineId } from '../../../../../common/types/timeline'; import { Ecs } from '../../../../../common/ecs'; import { TimelineNonEcsData } from '../../../../../common/search_strategy/timeline'; import { timelineActions } from '../../../../timelines/store/timeline'; -import { useApolloClient } from '../../../../common/utils/apollo_context'; import { sendAlertToTimelineAction } from '../actions'; import { dispatchUpdateTimeline } from '../../../../timelines/components/open_timeline/helpers'; import { ActionIconItem } from '../../../../timelines/components/timeline/body/actions/action_icon_item'; @@ -42,7 +41,6 @@ const InvestigateInTimelineActionComponent: React.FC dispatch(timelineActions.updateIsLoading(payload)), @@ -74,7 +72,6 @@ const InvestigateInTimelineActionComponent: React.FC; createTimeline: CreateTimeline; ecsData: Ecs | Ecs[]; nonEcsData: TimelineNonEcsData[]; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx index d9fc3a60cb717..6bca9bf2756bb 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx @@ -11,7 +11,6 @@ import { useParams } from 'react-router-dom'; import { waitFor } from '@testing-library/react'; import '../../../common/mock/match_media'; import { - apolloClientObservable, createSecuritySolutionStorageMock, kibanaObservable, mockGlobalState, @@ -62,13 +61,7 @@ const state: State = { }; const { storage } = createSecuritySolutionStorageMock(); -const store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage -); +const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); describe('DetectionEnginePageComponent', () => { beforeAll(() => { diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.test.tsx index c9468005960a6..b1c7bf8aa41e4 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.test.tsx @@ -11,7 +11,6 @@ import { waitFor } from '@testing-library/react'; import '../../../../../common/mock/match_media'; import { - apolloClientObservable, createSecuritySolutionStorageMock, kibanaObservable, mockGlobalState, @@ -60,13 +59,7 @@ const state: State = { ...mockGlobalState, }; const { storage } = createSecuritySolutionStorageMock(); -const store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage -); +const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); describe('RuleDetailsPageComponent', () => { beforeAll(() => { diff --git a/x-pack/plugins/security_solution/public/graphql/introspection.json b/x-pack/plugins/security_solution/public/graphql/introspection.json deleted file mode 100644 index 752173ded5163..0000000000000 --- a/x-pack/plugins/security_solution/public/graphql/introspection.json +++ /dev/null @@ -1,7647 +0,0 @@ -{ - "__schema": { - "queryType": { "name": "Query" }, - "mutationType": { "name": "Mutation" }, - "subscriptionType": null, - "types": [ - { - "kind": "OBJECT", - "name": "Query", - "description": "", - "fields": [ - { - "name": "getNote", - "description": "", - "args": [ - { - "name": "id", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "getNotesByTimelineId", - "description": "", - "args": [ - { - "name": "timelineId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "getNotesByEventId", - "description": "", - "args": [ - { - "name": "eventId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "getAllNotes", - "description": "", - "args": [ - { - "name": "pageInfo", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "PageInfoNote", "ofType": null }, - "defaultValue": null - }, - { - "name": "search", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "sort", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "SortNote", "ofType": null }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ResponseNotes", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "getAllPinnedEventsByTimelineId", - "description": "", - "args": [ - { - "name": "timelineId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "PinnedEvent", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "source", - "description": "Get a security data source by id", - "args": [ - { - "name": "id", - "description": "The id of the source", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "Source", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "allSources", - "description": "Get a list of all security data sources", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "Source", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "getOneTimeline", - "description": "", - "args": [ - { - "name": "id", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "timelineType", - "description": "", - "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "TimelineResult", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "getAllTimeline", - "description": "", - "args": [ - { - "name": "pageInfo", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "PageInfoTimeline", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "search", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "sort", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "SortTimeline", "ofType": null }, - "defaultValue": null - }, - { - "name": "onlyUserFavorite", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "timelineType", - "description": "", - "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null }, - "defaultValue": null - }, - { - "name": "status", - "description": "", - "type": { "kind": "ENUM", "name": "TimelineStatus", "ofType": null }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ResponseTimelines", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ID", - "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "NoteResult", - "description": "", - "fields": [ - { - "name": "eventId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "note", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timelineId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "noteId", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "created", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "createdBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timelineVersion", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updated", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updatedBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "String", - "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Float", - "description": "The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point). ", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "PageInfoNote", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "pageIndex", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "pageSize", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "SortNote", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "sortField", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "SortFieldNote", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "sortOrder", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "Direction", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "SortFieldNote", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "updatedBy", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "updated", "description": "", "isDeprecated": false, "deprecationReason": null } - ], - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "Direction", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { "name": "asc", "description": "", "isDeprecated": false, "deprecationReason": null }, - { "name": "desc", "description": "", "isDeprecated": false, "deprecationReason": null } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ResponseNotes", - "description": "", - "fields": [ - { - "name": "notes", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "totalCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "PinnedEvent", - "description": "", - "fields": [ - { - "name": "code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "pinnedEventId", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "eventId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timelineId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timelineVersion", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "created", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "createdBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updated", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updatedBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Source", - "description": "", - "fields": [ - { - "name": "id", - "description": "The id of the source", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "configuration", - "description": "The raw configuration of the source", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "SourceConfiguration", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "status", - "description": "The status of the source", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "SourceStatus", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SourceConfiguration", - "description": "A set of configuration options for a security data source", - "fields": [ - { - "name": "fields", - "description": "The field mapping to use for this source", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "SourceFields", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SourceFields", - "description": "A mapping of semantic fields to their document counterparts", - "fields": [ - { - "name": "container", - "description": "The field to identify a container by", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "host", - "description": "The fields to identify a host by", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message", - "description": "The fields that may contain the log event message. The first field found win.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "pod", - "description": "The field to identify a pod by", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tiebreaker", - "description": "The field to use as a tiebreaker for log events that have identical timestamps", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timestamp", - "description": "The field to use as a timestamp for metrics and logs", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SourceStatus", - "description": "The status of an infrastructure data source", - "fields": [ - { - "name": "indicesExist", - "description": "Whether the configured alias or wildcard pattern resolve to any auditbeat indices", - "args": [ - { - "name": "defaultIndex", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "indexFields", - "description": "The list of fields defined in the index mappings", - "args": [ - { - "name": "defaultIndex", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Boolean", - "description": "The `Boolean` scalar type represents `true` or `false`.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "TimelineType", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "default", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "template", - "description": "", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "TimelineResult", - "description": "", - "fields": [ - { - "name": "columns", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ColumnHeaderResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "created", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "createdBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dataProviders", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "DataProviderResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dateRange", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "DateRangePickerResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "eqlOptions", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "EqlOptionsResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "eventIdToNoteIds", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "eventType", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "excludedRowRendererIds", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "RowRendererId", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "favorite", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "FavoriteTimelineResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "filters", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "FilterTimelineResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "kqlMode", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "kqlQuery", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SerializedFilterQueryResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "indexNames", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "notes", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "noteIds", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "pinnedEventIds", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "pinnedEventsSaveObject", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "PinnedEvent", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "savedQueryId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "savedObjectId", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sort", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "status", - "description": "", - "args": [], - "type": { "kind": "ENUM", "name": "TimelineStatus", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "templateTimelineId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "templateTimelineVersion", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timelineType", - "description": "", - "args": [], - "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updated", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updatedBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ColumnHeaderResult", - "description": "", - "fields": [ - { - "name": "aggregatable", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "category", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "columnHeaderType", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "example", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "indexes", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "placeholder", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "searchable", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "DataProviderResult", - "description": "", - "fields": [ - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "enabled", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "excluded", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "kqlQuery", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "queryMatch", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "QueryMatchResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "ENUM", "name": "DataProviderType", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "and", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "DataProviderResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "QueryMatchResult", - "description": "", - "fields": [ - { - "name": "field", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "displayField", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "value", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "displayValue", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "operator", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "DataProviderType", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "default", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "template", - "description": "", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "DateRangePickerResult", - "description": "", - "fields": [ - { - "name": "start", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "end", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToAny", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "EqlOptionsResult", - "description": "", - "fields": [ - { - "name": "eventCategoryField", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tiebreakerField", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timestampField", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "query", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "size", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "RowRendererId", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { "name": "alerts", "description": "", "isDeprecated": false, "deprecationReason": null }, - { "name": "auditd", "description": "", "isDeprecated": false, "deprecationReason": null }, - { - "name": "auditd_file", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "library", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "netflow", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "plain", "description": "", "isDeprecated": false, "deprecationReason": null }, - { - "name": "registry", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "suricata", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "system", "description": "", "isDeprecated": false, "deprecationReason": null }, - { - "name": "system_dns", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "system_endgame_process", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "system_file", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "system_fim", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "system_security_event", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "system_socket", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "threat_match", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "zeek", "description": "", "isDeprecated": false, "deprecationReason": null } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "FavoriteTimelineResult", - "description": "", - "fields": [ - { - "name": "fullName", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "userName", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "favoriteDate", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "FilterTimelineResult", - "description": "", - "fields": [ - { - "name": "exists", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "meta", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "FilterMetaTimelineResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "match_all", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "missing", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "query", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "range", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "script", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "FilterMetaTimelineResult", - "description": "", - "fields": [ - { - "name": "alias", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "controlledBy", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "disabled", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "field", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "formattedValue", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "index", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "key", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "negate", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "params", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "value", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SerializedFilterQueryResult", - "description": "", - "fields": [ - { - "name": "filterQuery", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SerializedKueryQueryResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SerializedKueryQueryResult", - "description": "", - "fields": [ - { - "name": "kuery", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "KueryFilterQueryResult", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "serializedQuery", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "KueryFilterQueryResult", - "description": "", - "fields": [ - { - "name": "kind", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "expression", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "TimelineStatus", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { "name": "active", "description": "", "isDeprecated": false, "deprecationReason": null }, - { "name": "draft", "description": "", "isDeprecated": false, "deprecationReason": null }, - { - "name": "immutable", - "description": "", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Int", - "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. ", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "PageInfoTimeline", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "pageIndex", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "pageSize", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "SortTimeline", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "sortField", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "SortFieldTimeline", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "sortOrder", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "Direction", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "SortFieldTimeline", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { "name": "title", "description": "", "isDeprecated": false, "deprecationReason": null }, - { - "name": "description", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updated", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "created", "description": "", "isDeprecated": false, "deprecationReason": null } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ResponseTimelines", - "description": "", - "fields": [ - { - "name": "timeline", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { "kind": "OBJECT", "name": "TimelineResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "totalCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "defaultTimelineCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "templateTimelineCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "elasticTemplateTimelineCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "customTemplateTimelineCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "favoriteCount", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Mutation", - "description": "", - "fields": [ - { - "name": "persistNote", - "description": "Persists a note", - "args": [ - { - "name": "noteId", - "description": "", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "defaultValue": null - }, - { - "name": "version", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "note", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "NoteInput", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ResponseNote", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deleteNote", - "description": "", - "args": [ - { - "name": "id", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - } - } - }, - "defaultValue": null - } - ], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deleteNoteByTimelineId", - "description": "", - "args": [ - { - "name": "timelineId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "version", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "persistPinnedEventOnTimeline", - "description": "Persists a pinned event in a timeline", - "args": [ - { - "name": "pinnedEventId", - "description": "", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "defaultValue": null - }, - { - "name": "eventId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "timelineId", - "description": "", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "defaultValue": null - } - ], - "type": { "kind": "OBJECT", "name": "PinnedEvent", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deletePinnedEventOnTimeline", - "description": "Remove a pinned events in a timeline", - "args": [ - { - "name": "id", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - } - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deleteAllPinnedEventsOnTimeline", - "description": "Remove all pinned events in a timeline", - "args": [ - { - "name": "timelineId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "persistTimeline", - "description": "Persists a timeline", - "args": [ - { - "name": "id", - "description": "", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "defaultValue": null - }, - { - "name": "version", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "timeline", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "TimelineInput", "ofType": null } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ResponseTimeline", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "persistFavorite", - "description": "", - "args": [ - { - "name": "timelineId", - "description": "", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, - "defaultValue": null - }, - { - "name": "templateTimelineId", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "templateTimelineVersion", - "description": "", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, - "defaultValue": null - }, - { - "name": "timelineType", - "description": "", - "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ResponseFavoriteTimeline", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deleteTimeline", - "description": "", - "args": [ - { - "name": "id", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "ID", "ofType": null } - } - } - }, - "defaultValue": null - } - ], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "NoteInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "eventId", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "note", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "timelineId", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ResponseNote", - "description": "", - "fields": [ - { - "name": "code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "note", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "NoteResult", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "TimelineInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "columns", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "ColumnHeaderInput", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "dataProviders", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "DataProviderInput", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "description", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "eqlOptions", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "EqlOptionsInput", "ofType": null }, - "defaultValue": null - }, - { - "name": "eventType", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "excludedRowRendererIds", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "RowRendererId", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "filters", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "FilterTimelineInput", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "kqlMode", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "kqlQuery", - "description": "", - "type": { - "kind": "INPUT_OBJECT", - "name": "SerializedFilterQueryInput", - "ofType": null - }, - "defaultValue": null - }, - { - "name": "indexNames", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "title", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "templateTimelineId", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "templateTimelineVersion", - "description": "", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, - "defaultValue": null - }, - { - "name": "timelineType", - "description": "", - "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null }, - "defaultValue": null - }, - { - "name": "dateRange", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "DateRangePickerInput", "ofType": null }, - "defaultValue": null - }, - { - "name": "savedQueryId", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "sort", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "SortTimelineInput", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "status", - "description": "", - "type": { "kind": "ENUM", "name": "TimelineStatus", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "ColumnHeaderInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "aggregatable", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "category", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "columnHeaderType", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "description", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "example", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "indexes", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "id", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "name", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "placeholder", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "searchable", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "type", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "DataProviderInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "id", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "name", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "enabled", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "excluded", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "kqlQuery", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "queryMatch", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "QueryMatchInput", "ofType": null }, - "defaultValue": null - }, - { - "name": "and", - "description": "", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "INPUT_OBJECT", "name": "DataProviderInput", "ofType": null } - } - }, - "defaultValue": null - }, - { - "name": "type", - "description": "", - "type": { "kind": "ENUM", "name": "DataProviderType", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "QueryMatchInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "field", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "displayField", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "value", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "displayValue", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "operator", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "EqlOptionsInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "eventCategoryField", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "tiebreakerField", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "timestampField", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "query", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "size", - "description": "", - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "FilterTimelineInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "exists", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "meta", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "FilterMetaTimelineInput", "ofType": null }, - "defaultValue": null - }, - { - "name": "match_all", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "missing", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "query", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "range", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "script", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "FilterMetaTimelineInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "alias", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "controlledBy", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "disabled", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "field", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "formattedValue", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "index", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "key", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "negate", - "description": "", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": null - }, - { - "name": "params", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "type", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "value", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "SerializedFilterQueryInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "filterQuery", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "SerializedKueryQueryInput", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "SerializedKueryQueryInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "kuery", - "description": "", - "type": { "kind": "INPUT_OBJECT", "name": "KueryFilterQueryInput", "ofType": null }, - "defaultValue": null - }, - { - "name": "serializedQuery", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "KueryFilterQueryInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "kind", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "expression", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "DateRangePickerInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "start", - "description": "", - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "defaultValue": null - }, - { - "name": "end", - "description": "", - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "SortTimelineInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "columnId", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "sortDirection", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ResponseTimeline", - "description": "", - "fields": [ - { - "name": "code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timeline", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "TimelineResult", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ResponseFavoriteTimeline", - "description": "", - "fields": [ - { - "name": "code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "savedObjectId", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "templateTimelineId", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "templateTimelineVersion", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timelineType", - "description": "", - "args": [], - "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "favorite", - "description": "", - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "FavoriteTimelineResult", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Schema", - "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.", - "fields": [ - { - "name": "types", - "description": "A list of all types supported by this server.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Type", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "queryType", - "description": "The type that query operations will be rooted at.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Type", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mutationType", - "description": "If this server supports mutation, the type that mutation operations will be rooted at.", - "args": [], - "type": { "kind": "OBJECT", "name": "__Type", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "subscriptionType", - "description": "If this server support subscription, the type that subscription operations will be rooted at.", - "args": [], - "type": { "kind": "OBJECT", "name": "__Type", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "directives", - "description": "A list of all directives supported by this server.", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Directive", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Type", - "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.", - "fields": [ - { - "name": "kind", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "__TypeKind", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "fields", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": "false" - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Field", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "interfaces", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Type", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "possibleTypes", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Type", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "enumValues", - "description": null, - "args": [ - { - "name": "includeDeprecated", - "description": null, - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "defaultValue": "false" - } - ], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__EnumValue", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "inputFields", - "description": null, - "args": [], - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__InputValue", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ofType", - "description": null, - "args": [], - "type": { "kind": "OBJECT", "name": "__Type", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "__TypeKind", - "description": "An enum describing what kind of type a given `__Type` is.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "SCALAR", - "description": "Indicates this type is a scalar.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "OBJECT", - "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INTERFACE", - "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "UNION", - "description": "Indicates this type is a union. `possibleTypes` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ENUM", - "description": "Indicates this type is an enum. `enumValues` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INPUT_OBJECT", - "description": "Indicates this type is an input object. `inputFields` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "LIST", - "description": "Indicates this type is a list. `ofType` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "NON_NULL", - "description": "Indicates this type is a non-null. `ofType` is a valid field.", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Field", - "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.", - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "args", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__InputValue", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Type", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isDeprecated", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deprecationReason", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__InputValue", - "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.", - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__Type", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "defaultValue", - "description": "A GraphQL-formatted string representing the default value for this input value.", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__EnumValue", - "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.", - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "isDeprecated", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "deprecationReason", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "__Directive", - "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", - "fields": [ - { - "name": "name", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": null, - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "locations", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "__DirectiveLocation", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "args", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "__InputValue", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "onOperation", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": true, - "deprecationReason": "Use `locations`." - }, - { - "name": "onFragment", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": true, - "deprecationReason": "Use `locations`." - }, - { - "name": "onField", - "description": null, - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": true, - "deprecationReason": "Use `locations`." - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "__DirectiveLocation", - "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "QUERY", - "description": "Location adjacent to a query operation.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "MUTATION", - "description": "Location adjacent to a mutation operation.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SUBSCRIPTION", - "description": "Location adjacent to a subscription operation.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FIELD", - "description": "Location adjacent to a field.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FRAGMENT_DEFINITION", - "description": "Location adjacent to a fragment definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FRAGMENT_SPREAD", - "description": "Location adjacent to a fragment spread.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INLINE_FRAGMENT", - "description": "Location adjacent to an inline fragment.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SCHEMA", - "description": "Location adjacent to a schema definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "SCALAR", - "description": "Location adjacent to a scalar definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "OBJECT", - "description": "Location adjacent to an object type definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "FIELD_DEFINITION", - "description": "Location adjacent to a field definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ARGUMENT_DEFINITION", - "description": "Location adjacent to an argument definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INTERFACE", - "description": "Location adjacent to an interface definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "UNION", - "description": "Location adjacent to a union definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ENUM", - "description": "Location adjacent to an enum definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ENUM_VALUE", - "description": "Location adjacent to an enum value definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INPUT_OBJECT", - "description": "Location adjacent to an input object type definition.", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "INPUT_FIELD_DEFINITION", - "description": "Location adjacent to an input object field definition.", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToStringArray", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToStringArrayNoNullable", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "EventEcsFields", - "description": "", - "fields": [ - { - "name": "action", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "category", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "created", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToDateArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dataset", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "duration", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "end", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToDateArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "hash", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "kind", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "module", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "original", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "outcome", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "risk_score", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "risk_score_norm", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "severity", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "start", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToDateArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timezone", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToDateArray", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToNumberArray", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Location", - "description": "", - "fields": [ - { - "name": "lon", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "lat", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "GeoEcsFields", - "description": "", - "fields": [ - { - "name": "city_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "continent_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "country_iso_code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "country_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "location", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "Location", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "region_iso_code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "region_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "PrimarySecondary", - "description": "", - "fields": [ - { - "name": "primary", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "secondary", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Summary", - "description": "", - "fields": [ - { - "name": "actor", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "PrimarySecondary", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "object", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "PrimarySecondary", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "how", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message_type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sequence", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "AgentEcsField", - "description": "", - "fields": [ - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "AuditdData", - "description": "", - "fields": [ - { - "name": "acct", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "terminal", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "op", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "AuditdEcsFields", - "description": "", - "fields": [ - { - "name": "result", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "session", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "data", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "AuditdData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "summary", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "Summary", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sequence", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "OsEcsFields", - "description": "", - "fields": [ - { - "name": "platform", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "full", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "family", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "kernel", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "HostEcsFields", - "description": "", - "fields": [ - { - "name": "architecture", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ip", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mac", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "os", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "OsEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Thread", - "description": "", - "fields": [ - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "start", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ProcessHashData", - "description": "", - "fields": [ - { - "name": "md5", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sha1", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sha256", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ProcessEcsFields", - "description": "", - "fields": [ - { - "name": "hash", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ProcessHashData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "pid", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ppid", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "args", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "entity_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "executable", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "title", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "thread", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "Thread", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "working_directory", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SourceEcsFields", - "description": "", - "fields": [ - { - "name": "bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ip", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "port", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "domain", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "geo", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "GeoEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "packets", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "DestinationEcsFields", - "description": "", - "fields": [ - { - "name": "bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ip", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "port", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "domain", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "geo", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "GeoEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "packets", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "DnsQuestionData", - "description": "", - "fields": [ - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "DnsEcsFields", - "description": "", - "fields": [ - { - "name": "question", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "DnsQuestionData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "resolved_ip", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "response_code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "EndgameEcsFields", - "description": "", - "fields": [ - { - "name": "exit_code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "file_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "file_path", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "logon_type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "parent_process_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "pid", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "process_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "subject_domain_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "subject_logon_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "subject_user_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "target_domain_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "target_logon_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "target_user_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SuricataAlertData", - "description": "", - "fields": [ - { - "name": "signature", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "signature_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SuricataEveData", - "description": "", - "fields": [ - { - "name": "alert", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SuricataAlertData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "flow_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "proto", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SuricataEcsFields", - "description": "", - "fields": [ - { - "name": "eve", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SuricataEveData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "TlsJa3Data", - "description": "", - "fields": [ - { - "name": "hash", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "FingerprintData", - "description": "", - "fields": [ - { - "name": "sha1", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "TlsClientCertificateData", - "description": "", - "fields": [ - { - "name": "fingerprint", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "FingerprintData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "TlsServerCertificateData", - "description": "", - "fields": [ - { - "name": "fingerprint", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "FingerprintData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "TlsFingerprintsData", - "description": "", - "fields": [ - { - "name": "ja3", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "TlsJa3Data", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "TlsEcsFields", - "description": "", - "fields": [ - { - "name": "client_certificate", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "TlsClientCertificateData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "fingerprints", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "TlsFingerprintsData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "server_certificate", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "TlsServerCertificateData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekConnectionData", - "description": "", - "fields": [ - { - "name": "local_resp", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "local_orig", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "missed_bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "state", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "history", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToBooleanArray", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekNoticeData", - "description": "", - "fields": [ - { - "name": "suppress_for", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "msg", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "note", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sub", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dst", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dropped", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "peer_descr", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekDnsData", - "description": "", - "fields": [ - { - "name": "AA", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "qclass_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "RD", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "qtype_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "rejected", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "qtype", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "query", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "trans_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "qclass", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "RA", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "TC", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "FileFields", - "description": "", - "fields": [ - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "path", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "target_path", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "extension", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "device", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "inode", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "uid", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "owner", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "gid", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "group", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mode", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "size", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mtime", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToDateArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ctime", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToDateArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekHttpData", - "description": "", - "fields": [ - { - "name": "resp_mime_types", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "trans_depth", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "status_msg", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "resp_fuids", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tags", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "HttpBodyData", - "description": "", - "fields": [ - { - "name": "content", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "HttpRequestData", - "description": "", - "fields": [ - { - "name": "method", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "body", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "HttpBodyData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "referrer", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "HttpResponseData", - "description": "", - "fields": [ - { - "name": "status_code", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "body", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "HttpBodyData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "HttpEcsFields", - "description": "", - "fields": [ - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "request", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "HttpRequestData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "response", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "HttpResponseData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "UrlEcsFields", - "description": "", - "fields": [ - { - "name": "domain", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "original", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "username", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "password", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekFileData", - "description": "", - "fields": [ - { - "name": "session_ids", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timedout", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "local_orig", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tx_host", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "source", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "is_orig", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "overflow_bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "sha1", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "duration", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "depth", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "analyzers", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "mime_type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "rx_host", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "total_bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "fuid", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "seen_bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "missing_bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "md5", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekSslData", - "description": "", - "fields": [ - { - "name": "cipher", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "established", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "resumed", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ZeekEcsFields", - "description": "", - "fields": [ - { - "name": "session_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "connection", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekConnectionData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "notice", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekNoticeData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dns", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekDnsData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "http", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekHttpData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "files", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekFileData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "ssl", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekSslData", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "UserEcsFields", - "description": "", - "fields": [ - { - "name": "domain", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "full_name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "email", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "hash", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "group", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "WinlogEcsFields", - "description": "", - "fields": [ - { - "name": "event_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "NetworkEcsField", - "description": "", - "fields": [ - { - "name": "bytes", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "community_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "direction", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "packets", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "protocol", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "transport", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "PackageEcsFields", - "description": "", - "fields": [ - { - "name": "arch", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "entity_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "size", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "summary", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "AuditEcsFields", - "description": "", - "fields": [ - { - "name": "package", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "PackageEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SshEcsFields", - "description": "", - "fields": [ - { - "name": "method", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "signature", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "AuthEcsFields", - "description": "", - "fields": [ - { - "name": "ssh", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SshEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SystemEcsField", - "description": "", - "fields": [ - { - "name": "audit", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "AuditEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "auth", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "AuthEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "RuleField", - "description": "", - "fields": [ - { - "name": "id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "rule_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "false_positives", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "saved_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timeline_id", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timeline_title", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "max_signals", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToNumberArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "risk_score", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "output_index", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "from", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "immutable", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "index", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "interval", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "language", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "query", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "references", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "severity", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tags", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "threat", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "size", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "to", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "enabled", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToBooleanArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "filters", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "created_at", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updated_at", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "created_by", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "updated_by", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "version", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "note", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "threshold", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "exceptions_list", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToAny", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "SignalField", - "description": "", - "fields": [ - { - "name": "rule", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "RuleField", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "original_time", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "status", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "RuleEcsField", - "description": "", - "fields": [ - { - "name": "reference", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "ECS", - "description": "", - "fields": [ - { - "name": "_id", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "_index", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "agent", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "AgentEcsField", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "auditd", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "AuditdEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "destination", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "DestinationEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "dns", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "DnsEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "endgame", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "EndgameEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "event", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "EventEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "geo", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "GeoEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "host", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "HostEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "network", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "NetworkEcsField", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "rule", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "RuleEcsField", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "signal", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SignalField", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "source", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SourceEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "suricata", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SuricataEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tls", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "TlsEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "zeek", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ZeekEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "http", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "HttpEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "url", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "UrlEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "timestamp", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Date", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "message", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArray", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "user", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "UserEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "winlog", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "WinlogEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "process", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "ProcessEcsFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "file", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "FileFields", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "system", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "SystemEcsField", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "Date", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "EcsEdges", - "description": "", - "fields": [ - { - "name": "node", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "ECS", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "cursor", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "OBJECT", "name": "CursorType", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "CursorType", - "description": "", - "fields": [ - { - "name": "value", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "tiebreaker", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "SCALAR", - "name": "ToIFieldSubTypeNonNullable", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "IndexField", - "description": "A descriptor of a field in an index", - "fields": [ - { - "name": "category", - "description": "Where the field belong", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "example", - "description": "Example of field's value", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "indexes", - "description": "whether the field's belong to an alias index", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "The name of the field", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "type", - "description": "The type of the field's values as recognized by Kibana", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "searchable", - "description": "Whether the field's values can be efficiently searched for", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "aggregatable", - "description": "Whether the field's values can be aggregated", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "description", - "description": "Description of the field", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "format", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "esTypes", - "description": "the elastic type as mapped in the index", - "args": [], - "type": { "kind": "SCALAR", "name": "ToStringArrayNoNullable", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "subType", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "ToIFieldSubTypeNonNullable", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "TimerangeInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "interval", - "description": "The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan.", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "to", - "description": "The end of the timerange", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "from", - "description": "The beginning of the timerange", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "docValueFieldsInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "field", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "format", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "PaginationInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "limit", - "description": "The limit parameter allows you to configure the maximum amount of items to be returned", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "cursor", - "description": "The cursor parameter defines the next result you want to fetch", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "tiebreaker", - "description": "The tiebreaker parameter allow to be more precise to fetch the next item", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "PaginationInputPaginated", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "activePage", - "description": "The activePage parameter defines the page of results you want to fetch", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "cursorStart", - "description": "The cursorStart parameter defines the start of the results to be displayed", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "fakePossibleCount", - "description": "The fakePossibleCount parameter determines the total count in order to show 5 additional pages", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "querySize", - "description": "The querySize parameter is the number of items to be returned", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "FlowTarget", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { "name": "client", "description": "", "isDeprecated": false, "deprecationReason": null }, - { - "name": "destination", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "server", "description": "", "isDeprecated": false, "deprecationReason": null }, - { "name": "source", "description": "", "isDeprecated": false, "deprecationReason": null } - ], - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "FlowTargetSourceDest", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "destination", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { "name": "source", "description": "", "isDeprecated": false, "deprecationReason": null } - ], - "possibleTypes": null - }, - { - "kind": "ENUM", - "name": "FlowDirection", - "description": "", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ - { - "name": "uniDirectional", - "description": "", - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "biDirectional", - "description": "", - "isDeprecated": false, - "deprecationReason": null - } - ], - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "SortField", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "sortFieldId", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - }, - "defaultValue": null - }, - { - "name": "direction", - "description": "", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "ENUM", "name": "Direction", "ofType": null } - }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "PageInfo", - "description": "", - "fields": [ - { - "name": "endCursor", - "description": "", - "args": [], - "type": { "kind": "OBJECT", "name": "CursorType", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "hasNextPage", - "description": "", - "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "Inspect", - "description": "", - "fields": [ - { - "name": "dsl", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "response", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "String", "ofType": null } - } - } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "PageInfoPaginated", - "description": "", - "fields": [ - { - "name": "activePage", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "fakeTotalCount", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Float", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "showMorePagesIndicator", - "description": "", - "args": [], - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "isDeprecated": false, - "deprecationReason": null - } - ], - "inputFields": null, - "interfaces": [], - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "INPUT_OBJECT", - "name": "FavoriteTimelineInput", - "description": "", - "fields": null, - "inputFields": [ - { - "name": "fullName", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "userName", - "description": "", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - }, - { - "name": "favoriteDate", - "description": "", - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, - "defaultValue": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - } - ], - "directives": [ - { - "name": "skip", - "description": "Directs the executor to skip this field or fragment when the `if` argument is true.", - "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"], - "args": [ - { - "name": "if", - "description": "Skipped when true.", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "defaultValue": null - } - ] - }, - { - "name": "include", - "description": "Directs the executor to include this field or fragment only when the `if` argument is true.", - "locations": ["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"], - "args": [ - { - "name": "if", - "description": "Included when true.", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { "kind": "SCALAR", "name": "Boolean", "ofType": null } - }, - "defaultValue": null - } - ] - }, - { - "name": "deprecated", - "description": "Marks an element of a GraphQL schema as no longer supported.", - "locations": ["FIELD_DEFINITION", "ENUM_VALUE"], - "args": [ - { - "name": "reason", - "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": "\"No longer supported\"" - } - ] - } - ] - } -} diff --git a/x-pack/plugins/security_solution/public/graphql/types.ts b/x-pack/plugins/security_solution/public/graphql/types.ts deleted file mode 100644 index a41111c3e123a..0000000000000 --- a/x-pack/plugins/security_solution/public/graphql/types.ts +++ /dev/null @@ -1,2435 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export type Maybe = T | null; - -export interface PageInfoNote { - pageIndex: number; - - pageSize: number; -} - -export interface SortNote { - sortField: SortFieldNote; - - sortOrder: Direction; -} - -export interface PageInfoTimeline { - pageIndex: number; - - pageSize: number; -} - -export interface SortTimeline { - sortField: SortFieldTimeline; - - sortOrder: Direction; -} - -export interface NoteInput { - eventId?: Maybe; - - note?: Maybe; - - timelineId?: Maybe; -} - -export interface TimelineInput { - columns?: Maybe; - - dataProviders?: Maybe; - - description?: Maybe; - - eqlOptions?: Maybe; - - eventType?: Maybe; - - excludedRowRendererIds?: Maybe; - - filters?: Maybe; - - kqlMode?: Maybe; - - kqlQuery?: Maybe; - - indexNames?: Maybe; - - title?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - - dateRange?: Maybe; - - savedQueryId?: Maybe; - - sort?: Maybe; - - status?: Maybe; -} - -export interface ColumnHeaderInput { - aggregatable?: Maybe; - - category?: Maybe; - - columnHeaderType?: Maybe; - - description?: Maybe; - - example?: Maybe; - - indexes?: Maybe; - - id?: Maybe; - - name?: Maybe; - - placeholder?: Maybe; - - searchable?: Maybe; - - type?: Maybe; -} - -export interface DataProviderInput { - id?: Maybe; - - name?: Maybe; - - enabled?: Maybe; - - excluded?: Maybe; - - kqlQuery?: Maybe; - - queryMatch?: Maybe; - - and?: Maybe; - - type?: Maybe; -} - -export interface QueryMatchInput { - field?: Maybe; - - displayField?: Maybe; - - value?: Maybe; - - displayValue?: Maybe; - - operator?: Maybe; -} - -export interface EqlOptionsInput { - eventCategoryField?: Maybe; - - tiebreakerField?: Maybe; - - timestampField?: Maybe; - - query?: Maybe; - - size?: Maybe; -} - -export interface FilterTimelineInput { - exists?: Maybe; - - meta?: Maybe; - - match_all?: Maybe; - - missing?: Maybe; - - query?: Maybe; - - range?: Maybe; - - script?: Maybe; -} - -export interface FilterMetaTimelineInput { - alias?: Maybe; - - controlledBy?: Maybe; - - disabled?: Maybe; - - field?: Maybe; - - formattedValue?: Maybe; - - index?: Maybe; - - key?: Maybe; - - negate?: Maybe; - - params?: Maybe; - - type?: Maybe; - - value?: Maybe; -} - -export interface SerializedFilterQueryInput { - filterQuery?: Maybe; -} - -export interface SerializedKueryQueryInput { - kuery?: Maybe; - - serializedQuery?: Maybe; -} - -export interface KueryFilterQueryInput { - kind?: Maybe; - - expression?: Maybe; -} - -export interface DateRangePickerInput { - start?: Maybe; - - end?: Maybe; -} - -export interface SortTimelineInput { - columnId?: Maybe; - - sortDirection?: Maybe; -} - -export interface TimerangeInput { - /** The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan. */ - interval: string; - /** The end of the timerange */ - to: string; - /** The beginning of the timerange */ - from: string; -} - -export interface DocValueFieldsInput { - field: string; - - format: string; -} - -export interface PaginationInput { - /** The limit parameter allows you to configure the maximum amount of items to be returned */ - limit: number; - /** The cursor parameter defines the next result you want to fetch */ - cursor?: Maybe; - /** The tiebreaker parameter allow to be more precise to fetch the next item */ - tiebreaker?: Maybe; -} - -export interface PaginationInputPaginated { - /** The activePage parameter defines the page of results you want to fetch */ - activePage: number; - /** The cursorStart parameter defines the start of the results to be displayed */ - cursorStart: number; - /** The fakePossibleCount parameter determines the total count in order to show 5 additional pages */ - fakePossibleCount: number; - /** The querySize parameter is the number of items to be returned */ - querySize: number; -} - -export interface SortField { - sortFieldId: string; - - direction: Direction; -} - -export interface FavoriteTimelineInput { - fullName?: Maybe; - - userName?: Maybe; - - favoriteDate?: Maybe; -} - -export enum SortFieldNote { - updatedBy = 'updatedBy', - updated = 'updated', -} - -export enum Direction { - asc = 'asc', - desc = 'desc', -} - -export enum TimelineType { - default = 'default', - template = 'template', -} - -export enum DataProviderType { - default = 'default', - template = 'template', -} - -export enum RowRendererId { - alerts = 'alerts', - auditd = 'auditd', - auditd_file = 'auditd_file', - library = 'library', - netflow = 'netflow', - plain = 'plain', - registry = 'registry', - suricata = 'suricata', - system = 'system', - system_dns = 'system_dns', - system_endgame_process = 'system_endgame_process', - system_file = 'system_file', - system_fim = 'system_fim', - system_security_event = 'system_security_event', - system_socket = 'system_socket', - threat_match = 'threat_match', - zeek = 'zeek', -} - -export enum TimelineStatus { - active = 'active', - draft = 'draft', - immutable = 'immutable', -} - -export enum SortFieldTimeline { - title = 'title', - description = 'description', - updated = 'updated', - created = 'created', -} - -export enum FlowTarget { - client = 'client', - destination = 'destination', - server = 'server', - source = 'source', -} - -export enum FlowTargetSourceDest { - destination = 'destination', - source = 'source', -} - -export enum FlowDirection { - uniDirectional = 'uniDirectional', - biDirectional = 'biDirectional', -} - -export type ToAny = any; - -export type ToStringArray = string[]; - -export type ToStringArrayNoNullable = any; - -export type ToDateArray = string[]; - -export type ToNumberArray = number[]; - -export type ToBooleanArray = boolean[]; - -export type Date = string; - -export type ToIFieldSubTypeNonNullable = any; - -// ==================================================== -// Scalars -// ==================================================== - -// ==================================================== -// Types -// ==================================================== - -export interface Query { - getNote: NoteResult; - - getNotesByTimelineId: NoteResult[]; - - getNotesByEventId: NoteResult[]; - - getAllNotes: ResponseNotes; - - getAllPinnedEventsByTimelineId: PinnedEvent[]; - /** Get a security data source by id */ - source: Source; - /** Get a list of all security data sources */ - allSources: Source[]; - - getOneTimeline: TimelineResult; - - getAllTimeline: ResponseTimelines; -} - -export interface NoteResult { - eventId?: Maybe; - - note?: Maybe; - - timelineId?: Maybe; - - noteId: string; - - created?: Maybe; - - createdBy?: Maybe; - - timelineVersion?: Maybe; - - updated?: Maybe; - - updatedBy?: Maybe; - - version?: Maybe; -} - -export interface ResponseNotes { - notes: NoteResult[]; - - totalCount?: Maybe; -} - -export interface PinnedEvent { - code?: Maybe; - - message?: Maybe; - - pinnedEventId: string; - - eventId?: Maybe; - - timelineId?: Maybe; - - timelineVersion?: Maybe; - - created?: Maybe; - - createdBy?: Maybe; - - updated?: Maybe; - - updatedBy?: Maybe; - - version?: Maybe; -} - -export interface Source { - /** The id of the source */ - id: string; - /** The raw configuration of the source */ - configuration: SourceConfiguration; - /** The status of the source */ - status: SourceStatus; -} - -/** A set of configuration options for a security data source */ -export interface SourceConfiguration { - /** The field mapping to use for this source */ - fields: SourceFields; -} - -/** A mapping of semantic fields to their document counterparts */ -export interface SourceFields { - /** The field to identify a container by */ - container: string; - /** The fields to identify a host by */ - host: string; - /** The fields that may contain the log event message. The first field found win. */ - message: string[]; - /** The field to identify a pod by */ - pod: string; - /** The field to use as a tiebreaker for log events that have identical timestamps */ - tiebreaker: string; - /** The field to use as a timestamp for metrics and logs */ - timestamp: string; -} - -/** The status of an infrastructure data source */ -export interface SourceStatus { - /** Whether the configured alias or wildcard pattern resolve to any auditbeat indices */ - indicesExist: boolean; - /** The list of fields defined in the index mappings */ - indexFields: string[]; -} - -export interface TimelineResult { - columns?: Maybe; - - created?: Maybe; - - createdBy?: Maybe; - - dataProviders?: Maybe; - - dateRange?: Maybe; - - description?: Maybe; - - eqlOptions?: Maybe; - - eventIdToNoteIds?: Maybe; - - eventType?: Maybe; - - excludedRowRendererIds?: Maybe; - - favorite?: Maybe; - - filters?: Maybe; - - kqlMode?: Maybe; - - kqlQuery?: Maybe; - - indexNames?: Maybe; - - notes?: Maybe; - - noteIds?: Maybe; - - pinnedEventIds?: Maybe; - - pinnedEventsSaveObject?: Maybe; - - savedQueryId?: Maybe; - - savedObjectId: string; - - sort?: Maybe; - - status?: Maybe; - - title?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - - updated?: Maybe; - - updatedBy?: Maybe; - - version: string; -} - -export interface ColumnHeaderResult { - aggregatable?: Maybe; - - category?: Maybe; - - columnHeaderType?: Maybe; - - description?: Maybe; - - example?: Maybe; - - indexes?: Maybe; - - id?: Maybe; - - name?: Maybe; - - placeholder?: Maybe; - - searchable?: Maybe; - - type?: Maybe; -} - -export interface DataProviderResult { - id?: Maybe; - - name?: Maybe; - - enabled?: Maybe; - - excluded?: Maybe; - - kqlQuery?: Maybe; - - queryMatch?: Maybe; - - type?: Maybe; - - and?: Maybe; -} - -export interface QueryMatchResult { - field?: Maybe; - - displayField?: Maybe; - - value?: Maybe; - - displayValue?: Maybe; - - operator?: Maybe; -} - -export interface DateRangePickerResult { - start?: Maybe; - - end?: Maybe; -} - -export interface EqlOptionsResult { - eventCategoryField?: Maybe; - - tiebreakerField?: Maybe; - - timestampField?: Maybe; - - query?: Maybe; - - size?: Maybe; -} - -export interface FavoriteTimelineResult { - fullName?: Maybe; - - userName?: Maybe; - - favoriteDate?: Maybe; -} - -export interface FilterTimelineResult { - exists?: Maybe; - - meta?: Maybe; - - match_all?: Maybe; - - missing?: Maybe; - - query?: Maybe; - - range?: Maybe; - - script?: Maybe; -} - -export interface FilterMetaTimelineResult { - alias?: Maybe; - - controlledBy?: Maybe; - - disabled?: Maybe; - - field?: Maybe; - - formattedValue?: Maybe; - - index?: Maybe; - - key?: Maybe; - - negate?: Maybe; - - params?: Maybe; - - type?: Maybe; - - value?: Maybe; -} - -export interface SerializedFilterQueryResult { - filterQuery?: Maybe; -} - -export interface SerializedKueryQueryResult { - kuery?: Maybe; - - serializedQuery?: Maybe; -} - -export interface KueryFilterQueryResult { - kind?: Maybe; - - expression?: Maybe; -} - -export interface ResponseTimelines { - timeline: (Maybe)[]; - - totalCount?: Maybe; - - defaultTimelineCount?: Maybe; - - templateTimelineCount?: Maybe; - - elasticTemplateTimelineCount?: Maybe; - - customTemplateTimelineCount?: Maybe; - - favoriteCount?: Maybe; -} - -export interface Mutation { - /** Persists a note */ - persistNote: ResponseNote; - - deleteNote?: Maybe; - - deleteNoteByTimelineId?: Maybe; - /** Persists a pinned event in a timeline */ - persistPinnedEventOnTimeline?: Maybe; - /** Remove a pinned events in a timeline */ - deletePinnedEventOnTimeline: boolean; - /** Remove all pinned events in a timeline */ - deleteAllPinnedEventsOnTimeline: boolean; - /** Persists a timeline */ - persistTimeline: ResponseTimeline; - - persistFavorite: ResponseFavoriteTimeline; - - deleteTimeline: boolean; -} - -export interface ResponseNote { - code?: Maybe; - - message?: Maybe; - - note: NoteResult; -} - -export interface ResponseTimeline { - code?: Maybe; - - message?: Maybe; - - timeline: TimelineResult; -} - -export interface ResponseFavoriteTimeline { - code?: Maybe; - - message?: Maybe; - - savedObjectId: string; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - - version: string; - - favorite?: Maybe; -} - -export interface EventEcsFields { - action?: Maybe; - - category?: Maybe; - - code?: Maybe; - - created?: Maybe; - - dataset?: Maybe; - - duration?: Maybe; - - end?: Maybe; - - hash?: Maybe; - - id?: Maybe; - - kind?: Maybe; - - module?: Maybe; - - original?: Maybe; - - outcome?: Maybe; - - risk_score?: Maybe; - - risk_score_norm?: Maybe; - - severity?: Maybe; - - start?: Maybe; - - timezone?: Maybe; - - type?: Maybe; -} - -export interface Location { - lon?: Maybe; - - lat?: Maybe; -} - -export interface GeoEcsFields { - city_name?: Maybe; - - continent_name?: Maybe; - - country_iso_code?: Maybe; - - country_name?: Maybe; - - location?: Maybe; - - region_iso_code?: Maybe; - - region_name?: Maybe; -} - -export interface PrimarySecondary { - primary?: Maybe; - - secondary?: Maybe; - - type?: Maybe; -} - -export interface Summary { - actor?: Maybe; - - object?: Maybe; - - how?: Maybe; - - message_type?: Maybe; - - sequence?: Maybe; -} - -export interface AgentEcsField { - type?: Maybe; -} - -export interface AuditdData { - acct?: Maybe; - - terminal?: Maybe; - - op?: Maybe; -} - -export interface AuditdEcsFields { - result?: Maybe; - - session?: Maybe; - - data?: Maybe; - - summary?: Maybe

    ; - - sequence?: Maybe; -} - -export interface OsEcsFields { - platform?: Maybe; - - name?: Maybe; - - full?: Maybe; - - family?: Maybe; - - version?: Maybe; - - kernel?: Maybe; -} - -export interface HostEcsFields { - architecture?: Maybe; - - id?: Maybe; - - ip?: Maybe; - - mac?: Maybe; - - name?: Maybe; - - os?: Maybe; - - type?: Maybe; -} - -export interface Thread { - id?: Maybe; - - start?: Maybe; -} - -export interface ProcessHashData { - md5?: Maybe; - - sha1?: Maybe; - - sha256?: Maybe; -} - -export interface ProcessEcsFields { - hash?: Maybe; - - pid?: Maybe; - - name?: Maybe; - - ppid?: Maybe; - - args?: Maybe; - - entity_id?: Maybe; - - executable?: Maybe; - - title?: Maybe; - - thread?: Maybe; - - working_directory?: Maybe; -} - -export interface SourceEcsFields { - bytes?: Maybe; - - ip?: Maybe; - - port?: Maybe; - - domain?: Maybe; - - geo?: Maybe; - - packets?: Maybe; -} - -export interface DestinationEcsFields { - bytes?: Maybe; - - ip?: Maybe; - - port?: Maybe; - - domain?: Maybe; - - geo?: Maybe; - - packets?: Maybe; -} - -export interface DnsQuestionData { - name?: Maybe; - - type?: Maybe; -} - -export interface DnsEcsFields { - question?: Maybe; - - resolved_ip?: Maybe; - - response_code?: Maybe; -} - -export interface EndgameEcsFields { - exit_code?: Maybe; - - file_name?: Maybe; - - file_path?: Maybe; - - logon_type?: Maybe; - - parent_process_name?: Maybe; - - pid?: Maybe; - - process_name?: Maybe; - - subject_domain_name?: Maybe; - - subject_logon_id?: Maybe; - - subject_user_name?: Maybe; - - target_domain_name?: Maybe; - - target_logon_id?: Maybe; - - target_user_name?: Maybe; -} - -export interface SuricataAlertData { - signature?: Maybe; - - signature_id?: Maybe; -} - -export interface SuricataEveData { - alert?: Maybe; - - flow_id?: Maybe; - - proto?: Maybe; -} - -export interface SuricataEcsFields { - eve?: Maybe; -} - -export interface TlsJa3Data { - hash?: Maybe; -} - -export interface FingerprintData { - sha1?: Maybe; -} - -export interface TlsClientCertificateData { - fingerprint?: Maybe; -} - -export interface TlsServerCertificateData { - fingerprint?: Maybe; -} - -export interface TlsFingerprintsData { - ja3?: Maybe; -} - -export interface TlsEcsFields { - client_certificate?: Maybe; - - fingerprints?: Maybe; - - server_certificate?: Maybe; -} - -export interface ZeekConnectionData { - local_resp?: Maybe; - - local_orig?: Maybe; - - missed_bytes?: Maybe; - - state?: Maybe; - - history?: Maybe; -} - -export interface ZeekNoticeData { - suppress_for?: Maybe; - - msg?: Maybe; - - note?: Maybe; - - sub?: Maybe; - - dst?: Maybe; - - dropped?: Maybe; - - peer_descr?: Maybe; -} - -export interface ZeekDnsData { - AA?: Maybe; - - qclass_name?: Maybe; - - RD?: Maybe; - - qtype_name?: Maybe; - - rejected?: Maybe; - - qtype?: Maybe; - - query?: Maybe; - - trans_id?: Maybe; - - qclass?: Maybe; - - RA?: Maybe; - - TC?: Maybe; -} - -export interface FileFields { - name?: Maybe; - - path?: Maybe; - - target_path?: Maybe; - - extension?: Maybe; - - type?: Maybe; - - device?: Maybe; - - inode?: Maybe; - - uid?: Maybe; - - owner?: Maybe; - - gid?: Maybe; - - group?: Maybe; - - mode?: Maybe; - - size?: Maybe; - - mtime?: Maybe; - - ctime?: Maybe; -} - -export interface ZeekHttpData { - resp_mime_types?: Maybe; - - trans_depth?: Maybe; - - status_msg?: Maybe; - - resp_fuids?: Maybe; - - tags?: Maybe; -} - -export interface HttpBodyData { - content?: Maybe; - - bytes?: Maybe; -} - -export interface HttpRequestData { - method?: Maybe; - - body?: Maybe; - - referrer?: Maybe; - - bytes?: Maybe; -} - -export interface HttpResponseData { - status_code?: Maybe; - - body?: Maybe; - - bytes?: Maybe; -} - -export interface HttpEcsFields { - version?: Maybe; - - request?: Maybe; - - response?: Maybe; -} - -export interface UrlEcsFields { - domain?: Maybe; - - original?: Maybe; - - username?: Maybe; - - password?: Maybe; -} - -export interface ZeekFileData { - session_ids?: Maybe; - - timedout?: Maybe; - - local_orig?: Maybe; - - tx_host?: Maybe; - - source?: Maybe; - - is_orig?: Maybe; - - overflow_bytes?: Maybe; - - sha1?: Maybe; - - duration?: Maybe; - - depth?: Maybe; - - analyzers?: Maybe; - - mime_type?: Maybe; - - rx_host?: Maybe; - - total_bytes?: Maybe; - - fuid?: Maybe; - - seen_bytes?: Maybe; - - missing_bytes?: Maybe; - - md5?: Maybe; -} - -export interface ZeekSslData { - cipher?: Maybe; - - established?: Maybe; - - resumed?: Maybe; - - version?: Maybe; -} - -export interface ZeekEcsFields { - session_id?: Maybe; - - connection?: Maybe; - - notice?: Maybe; - - dns?: Maybe; - - http?: Maybe; - - files?: Maybe; - - ssl?: Maybe; -} - -export interface UserEcsFields { - domain?: Maybe; - - id?: Maybe; - - name?: Maybe; - - full_name?: Maybe; - - email?: Maybe; - - hash?: Maybe; - - group?: Maybe; -} - -export interface WinlogEcsFields { - event_id?: Maybe; -} - -export interface NetworkEcsField { - bytes?: Maybe; - - community_id?: Maybe; - - direction?: Maybe; - - packets?: Maybe; - - protocol?: Maybe; - - transport?: Maybe; -} - -export interface PackageEcsFields { - arch?: Maybe; - - entity_id?: Maybe; - - name?: Maybe; - - size?: Maybe; - - summary?: Maybe; - - version?: Maybe; -} - -export interface AuditEcsFields { - package?: Maybe; -} - -export interface SshEcsFields { - method?: Maybe; - - signature?: Maybe; -} - -export interface AuthEcsFields { - ssh?: Maybe; -} - -export interface SystemEcsField { - audit?: Maybe; - - auth?: Maybe; -} - -export interface RuleField { - id?: Maybe; - - rule_id?: Maybe; - - false_positives: string[]; - - saved_id?: Maybe; - - timeline_id?: Maybe; - - timeline_title?: Maybe; - - max_signals?: Maybe; - - risk_score?: Maybe; - - output_index?: Maybe; - - description?: Maybe; - - from?: Maybe; - - immutable?: Maybe; - - index?: Maybe; - - interval?: Maybe; - - language?: Maybe; - - query?: Maybe; - - references?: Maybe; - - severity?: Maybe; - - tags?: Maybe; - - threat?: Maybe; - - type?: Maybe; - - size?: Maybe; - - to?: Maybe; - - enabled?: Maybe; - - filters?: Maybe; - - created_at?: Maybe; - - updated_at?: Maybe; - - created_by?: Maybe; - - updated_by?: Maybe; - - version?: Maybe; - - note?: Maybe; - - threshold?: Maybe; - - exceptions_list?: Maybe; -} - -export interface SignalField { - rule?: Maybe; - - original_time?: Maybe; - - status?: Maybe; -} - -export interface RuleEcsField { - reference?: Maybe; -} - -export interface Ecs { - _id: string; - - _index?: Maybe; - - agent?: Maybe; - - auditd?: Maybe; - - destination?: Maybe; - - dns?: Maybe; - - endgame?: Maybe; - - event?: Maybe; - - geo?: Maybe; - - host?: Maybe; - - network?: Maybe; - - rule?: Maybe; - - signal?: Maybe; - - source?: Maybe; - - suricata?: Maybe; - - tls?: Maybe; - - zeek?: Maybe; - - http?: Maybe; - - url?: Maybe; - - timestamp?: Maybe; - - message?: Maybe; - - user?: Maybe; - - winlog?: Maybe; - - process?: Maybe; - - file?: Maybe; - - system?: Maybe; -} - -export interface EcsEdges { - node: Ecs; - - cursor: CursorType; -} - -export interface CursorType { - value?: Maybe; - - tiebreaker?: Maybe; -} - -/** A descriptor of a field in an index */ -export interface IndexField { - /** Where the field belong */ - category: string; - /** Example of field's value */ - example?: Maybe; - /** whether the field's belong to an alias index */ - indexes: (Maybe)[]; - /** The name of the field */ - name: string; - /** The type of the field's values as recognized by Kibana */ - type: string; - /** Whether the field's values can be efficiently searched for */ - searchable: boolean; - /** Whether the field's values can be aggregated */ - aggregatable: boolean; - /** Description of the field */ - description?: Maybe; - - format?: Maybe; - /** the elastic type as mapped in the index */ - esTypes?: Maybe; - - subType?: Maybe; -} - -export interface PageInfo { - endCursor?: Maybe; - - hasNextPage?: Maybe; -} - -export interface Inspect { - dsl: string[]; - - response: string[]; -} - -export interface PageInfoPaginated { - activePage: number; - - fakeTotalCount: number; - - showMorePagesIndicator: boolean; -} - -// ==================================================== -// Arguments -// ==================================================== - -export interface GetNoteQueryArgs { - id: string; -} -export interface GetNotesByTimelineIdQueryArgs { - timelineId: string; -} -export interface GetNotesByEventIdQueryArgs { - eventId: string; -} -export interface GetAllNotesQueryArgs { - pageInfo?: Maybe; - - search?: Maybe; - - sort?: Maybe; -} -export interface GetAllPinnedEventsByTimelineIdQueryArgs { - timelineId: string; -} -export interface SourceQueryArgs { - /** The id of the source */ - id: string; -} -export interface GetOneTimelineQueryArgs { - id: string; - - timelineType?: Maybe; -} -export interface GetAllTimelineQueryArgs { - pageInfo: PageInfoTimeline; - - search?: Maybe; - - sort?: Maybe; - - onlyUserFavorite?: Maybe; - - timelineType?: Maybe; - - status?: Maybe; -} -export interface IndicesExistSourceStatusArgs { - defaultIndex: string[]; -} -export interface IndexFieldsSourceStatusArgs { - defaultIndex: string[]; -} -export interface PersistNoteMutationArgs { - noteId?: Maybe; - - version?: Maybe; - - note: NoteInput; -} -export interface DeleteNoteMutationArgs { - id: string[]; -} -export interface DeleteNoteByTimelineIdMutationArgs { - timelineId: string; - - version?: Maybe; -} -export interface PersistPinnedEventOnTimelineMutationArgs { - pinnedEventId?: Maybe; - - eventId: string; - - timelineId?: Maybe; -} -export interface DeletePinnedEventOnTimelineMutationArgs { - id: string[]; -} -export interface DeleteAllPinnedEventsOnTimelineMutationArgs { - timelineId: string; -} -export interface PersistTimelineMutationArgs { - id?: Maybe; - - version?: Maybe; - - timeline: TimelineInput; -} -export interface PersistFavoriteMutationArgs { - timelineId?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; -} -export interface DeleteTimelineMutationArgs { - id: string[]; -} - -// ==================================================== -// Documents -// ==================================================== - -export namespace GetAllTimeline { - export type Variables = { - pageInfo: PageInfoTimeline; - search?: Maybe; - sort?: Maybe; - onlyUserFavorite?: Maybe; - timelineType?: Maybe; - status?: Maybe; - }; - - export type Query = { - __typename?: 'Query'; - - getAllTimeline: GetAllTimeline; - }; - - export type GetAllTimeline = { - __typename?: 'ResponseTimelines'; - - totalCount: Maybe; - - defaultTimelineCount: Maybe; - - templateTimelineCount: Maybe; - - elasticTemplateTimelineCount: Maybe; - - customTemplateTimelineCount: Maybe; - - favoriteCount: Maybe; - - timeline: (Maybe)[]; - }; - - export type Timeline = { - __typename?: 'TimelineResult'; - - savedObjectId: string; - - description: Maybe; - - favorite: Maybe; - - eventIdToNoteIds: Maybe; - - excludedRowRendererIds: Maybe; - - notes: Maybe; - - noteIds: Maybe; - - pinnedEventIds: Maybe; - - status: Maybe; - - title: Maybe; - - timelineType: Maybe; - - templateTimelineId: Maybe; - - templateTimelineVersion: Maybe; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: string; - }; - - export type Favorite = { - __typename?: 'FavoriteTimelineResult'; - - fullName: Maybe; - - userName: Maybe; - - favoriteDate: Maybe; - }; - - export type EventIdToNoteIds = { - __typename?: 'NoteResult'; - - eventId: Maybe; - - note: Maybe; - - timelineId: Maybe; - - noteId: string; - - created: Maybe; - - createdBy: Maybe; - - timelineVersion: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; - - export type Notes = { - __typename?: 'NoteResult'; - - eventId: Maybe; - - note: Maybe; - - timelineId: Maybe; - - timelineVersion: Maybe; - - noteId: string; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; -} - -export namespace DeleteTimelineMutation { - export type Variables = { - id: string[]; - }; - - export type Mutation = { - __typename?: 'Mutation'; - - deleteTimeline: boolean; - }; -} - -export namespace PersistTimelineFavoriteMutation { - export type Variables = { - timelineId?: Maybe; - templateTimelineId?: Maybe; - templateTimelineVersion?: Maybe; - timelineType: TimelineType; - }; - - export type Mutation = { - __typename?: 'Mutation'; - - persistFavorite: PersistFavorite; - }; - - export type PersistFavorite = { - __typename?: 'ResponseFavoriteTimeline'; - - savedObjectId: string; - - version: string; - - favorite: Maybe; - - templateTimelineId: Maybe; - - templateTimelineVersion: Maybe; - - timelineType: Maybe; - }; - - export type Favorite = { - __typename?: 'FavoriteTimelineResult'; - - fullName: Maybe; - - userName: Maybe; - - favoriteDate: Maybe; - }; -} - -export namespace PersistTimelineNoteMutation { - export type Variables = { - noteId?: Maybe; - version?: Maybe; - note: NoteInput; - }; - - export type Mutation = { - __typename?: 'Mutation'; - - persistNote: PersistNote; - }; - - export type PersistNote = { - __typename?: 'ResponseNote'; - - code: Maybe; - - message: Maybe; - - note: Note; - }; - - export type Note = { - __typename?: 'NoteResult'; - - eventId: Maybe; - - note: Maybe; - - timelineId: Maybe; - - timelineVersion: Maybe; - - noteId: string; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; -} - -export namespace GetOneTimeline { - export type Variables = { - id: string; - timelineType?: Maybe; - }; - - export type Query = { - __typename?: 'Query'; - - getOneTimeline: GetOneTimeline; - }; - - export type GetOneTimeline = { - __typename?: 'TimelineResult'; - - savedObjectId: string; - - columns: Maybe; - - dataProviders: Maybe; - - dateRange: Maybe; - - description: Maybe; - - eqlOptions: Maybe; - - eventType: Maybe; - - eventIdToNoteIds: Maybe; - - excludedRowRendererIds: Maybe; - - favorite: Maybe; - - filters: Maybe; - - kqlMode: Maybe; - - kqlQuery: Maybe; - - indexNames: Maybe; - - notes: Maybe; - - noteIds: Maybe; - - pinnedEventIds: Maybe; - - pinnedEventsSaveObject: Maybe; - - status: Maybe; - - title: Maybe; - - timelineType: Maybe; - - templateTimelineId: Maybe; - - templateTimelineVersion: Maybe; - - savedQueryId: Maybe; - - sort: Maybe; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: string; - }; - - export type Columns = { - __typename?: 'ColumnHeaderResult'; - - aggregatable: Maybe; - - category: Maybe; - - columnHeaderType: Maybe; - - description: Maybe; - - example: Maybe; - - indexes: Maybe; - - id: Maybe; - - name: Maybe; - - searchable: Maybe; - - type: Maybe; - }; - - export type DataProviders = { - __typename?: 'DataProviderResult'; - - id: Maybe; - - name: Maybe; - - enabled: Maybe; - - excluded: Maybe; - - kqlQuery: Maybe; - - type: Maybe; - - queryMatch: Maybe; - - and: Maybe; - }; - - export type QueryMatch = { - __typename?: 'QueryMatchResult'; - - field: Maybe; - - displayField: Maybe; - - value: Maybe; - - displayValue: Maybe; - - operator: Maybe; - }; - - export type And = { - __typename?: 'DataProviderResult'; - - id: Maybe; - - name: Maybe; - - enabled: Maybe; - - excluded: Maybe; - - kqlQuery: Maybe; - - type: Maybe; - - queryMatch: Maybe<_QueryMatch>; - }; - - export type _QueryMatch = { - __typename?: 'QueryMatchResult'; - - field: Maybe; - - displayField: Maybe; - - value: Maybe; - - displayValue: Maybe; - - operator: Maybe; - }; - - export type DateRange = { - __typename?: 'DateRangePickerResult'; - - start: Maybe; - - end: Maybe; - }; - - export type EqlOptions = { - __typename?: 'EqlOptionsResult'; - - eventCategoryField: Maybe; - - tiebreakerField: Maybe; - - timestampField: Maybe; - - query: Maybe; - - size: Maybe; - }; - - export type EventIdToNoteIds = { - __typename?: 'NoteResult'; - - eventId: Maybe; - - note: Maybe; - - timelineId: Maybe; - - noteId: string; - - created: Maybe; - - createdBy: Maybe; - - timelineVersion: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; - - export type Favorite = { - __typename?: 'FavoriteTimelineResult'; - - fullName: Maybe; - - userName: Maybe; - - favoriteDate: Maybe; - }; - - export type Filters = { - __typename?: 'FilterTimelineResult'; - - meta: Maybe; - - query: Maybe; - - exists: Maybe; - - match_all: Maybe; - - missing: Maybe; - - range: Maybe; - - script: Maybe; - }; - - export type Meta = { - __typename?: 'FilterMetaTimelineResult'; - - alias: Maybe; - - controlledBy: Maybe; - - disabled: Maybe; - - field: Maybe; - - formattedValue: Maybe; - - index: Maybe; - - key: Maybe; - - negate: Maybe; - - params: Maybe; - - type: Maybe; - - value: Maybe; - }; - - export type KqlQuery = { - __typename?: 'SerializedFilterQueryResult'; - - filterQuery: Maybe; - }; - - export type FilterQuery = { - __typename?: 'SerializedKueryQueryResult'; - - kuery: Maybe; - - serializedQuery: Maybe; - }; - - export type Kuery = { - __typename?: 'KueryFilterQueryResult'; - - kind: Maybe; - - expression: Maybe; - }; - - export type Notes = { - __typename?: 'NoteResult'; - - eventId: Maybe; - - note: Maybe; - - timelineId: Maybe; - - timelineVersion: Maybe; - - noteId: string; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; - - export type PinnedEventsSaveObject = { - __typename?: 'PinnedEvent'; - - pinnedEventId: string; - - eventId: Maybe; - - timelineId: Maybe; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; -} - -export namespace PersistTimelineMutation { - export type Variables = { - timelineId?: Maybe; - version?: Maybe; - timeline: TimelineInput; - }; - - export type Mutation = { - __typename?: 'Mutation'; - - persistTimeline: PersistTimeline; - }; - - export type PersistTimeline = { - __typename?: 'ResponseTimeline'; - - code: Maybe; - - message: Maybe; - - timeline: Timeline; - }; - - export type Timeline = { - __typename?: 'TimelineResult'; - - savedObjectId: string; - - version: string; - - columns: Maybe; - - dataProviders: Maybe; - - description: Maybe; - - eventType: Maybe; - - excludedRowRendererIds: Maybe; - - favorite: Maybe; - - filters: Maybe; - - kqlMode: Maybe; - - kqlQuery: Maybe; - - indexNames: Maybe; - - title: Maybe; - - dateRange: Maybe; - - savedQueryId: Maybe; - - sort: Maybe; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - }; - - export type Columns = { - __typename?: 'ColumnHeaderResult'; - - aggregatable: Maybe; - - category: Maybe; - - columnHeaderType: Maybe; - - description: Maybe; - - example: Maybe; - - indexes: Maybe; - - id: Maybe; - - name: Maybe; - - searchable: Maybe; - - type: Maybe; - }; - - export type DataProviders = { - __typename?: 'DataProviderResult'; - - id: Maybe; - - name: Maybe; - - enabled: Maybe; - - excluded: Maybe; - - kqlQuery: Maybe; - - type: Maybe; - - queryMatch: Maybe; - - and: Maybe; - }; - - export type QueryMatch = { - __typename?: 'QueryMatchResult'; - - field: Maybe; - - displayField: Maybe; - - value: Maybe; - - displayValue: Maybe; - - operator: Maybe; - }; - - export type And = { - __typename?: 'DataProviderResult'; - - id: Maybe; - - name: Maybe; - - enabled: Maybe; - - excluded: Maybe; - - kqlQuery: Maybe; - - type: Maybe; - - queryMatch: Maybe<_QueryMatch>; - }; - - export type _QueryMatch = { - __typename?: 'QueryMatchResult'; - - field: Maybe; - - displayField: Maybe; - - value: Maybe; - - displayValue: Maybe; - - operator: Maybe; - }; - - export type Favorite = { - __typename?: 'FavoriteTimelineResult'; - - fullName: Maybe; - - userName: Maybe; - - favoriteDate: Maybe; - }; - - export type Filters = { - __typename?: 'FilterTimelineResult'; - - meta: Maybe; - - query: Maybe; - - exists: Maybe; - - match_all: Maybe; - - missing: Maybe; - - range: Maybe; - - script: Maybe; - }; - - export type Meta = { - __typename?: 'FilterMetaTimelineResult'; - - alias: Maybe; - - controlledBy: Maybe; - - disabled: Maybe; - - field: Maybe; - - formattedValue: Maybe; - - index: Maybe; - - key: Maybe; - - negate: Maybe; - - params: Maybe; - - type: Maybe; - - value: Maybe; - }; - - export type KqlQuery = { - __typename?: 'SerializedFilterQueryResult'; - - filterQuery: Maybe; - }; - - export type FilterQuery = { - __typename?: 'SerializedKueryQueryResult'; - - kuery: Maybe; - - serializedQuery: Maybe; - }; - - export type Kuery = { - __typename?: 'KueryFilterQueryResult'; - - kind: Maybe; - - expression: Maybe; - }; - - export type DateRange = { - __typename?: 'DateRangePickerResult'; - - start: Maybe; - - end: Maybe; - }; -} - -export namespace PersistTimelinePinnedEventMutation { - export type Variables = { - pinnedEventId?: Maybe; - eventId: string; - timelineId?: Maybe; - }; - - export type Mutation = { - __typename?: 'Mutation'; - - persistPinnedEventOnTimeline: Maybe; - }; - - export type PersistPinnedEventOnTimeline = { - __typename?: 'PinnedEvent'; - - pinnedEventId: string; - - eventId: Maybe; - - timelineId: Maybe; - - timelineVersion: Maybe; - - created: Maybe; - - createdBy: Maybe; - - updated: Maybe; - - updatedBy: Maybe; - - version: Maybe; - }; -} diff --git a/x-pack/plugins/security_solution/public/hosts/components/authentications_table/index.test.tsx b/x-pack/plugins/security_solution/public/hosts/components/authentications_table/index.test.tsx index a63300738ebf0..8013208d02cc3 100644 --- a/x-pack/plugins/security_solution/public/hosts/components/authentications_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/hosts/components/authentications_table/index.test.tsx @@ -12,7 +12,6 @@ import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, @@ -29,22 +28,10 @@ describe('Authentication Table Component', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { diff --git a/x-pack/plugins/security_solution/public/hosts/components/hosts_table/index.test.tsx b/x-pack/plugins/security_solution/public/hosts/components/hosts_table/index.test.tsx index 613ef2c3366dc..0808238151e03 100644 --- a/x-pack/plugins/security_solution/public/hosts/components/hosts_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/hosts/components/hosts_table/index.test.tsx @@ -7,11 +7,9 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -41,23 +39,11 @@ describe('Hosts Table', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mount = useMountAppended(); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { @@ -86,21 +72,19 @@ describe('Hosts Table', () => { beforeEach(() => { wrapper = mount( - - - - - + + + ); }); test('Initial value of the store', () => { diff --git a/x-pack/plugins/security_solution/public/hosts/pages/hosts.test.tsx b/x-pack/plugins/security_solution/public/hosts/pages/hosts.test.tsx index ddea55158d9fd..4871cfcb069d2 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/hosts.test.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/hosts.test.tsx @@ -12,7 +12,6 @@ import { Router } from 'react-router-dom'; import { Filter } from '../../../../../../src/plugins/data/common/es_query'; import '../../common/mock/match_media'; import { - apolloClientObservable, TestProviders, mockGlobalState, SUB_PLUGINS_REDUCER, @@ -144,13 +143,7 @@ describe('Hosts - rendering', () => { }); const myState: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - const myStore = createStore( - myState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + const myStore = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/hosts/store/model.ts b/x-pack/plugins/security_solution/public/hosts/store/model.ts index b610971f70305..2060d46206723 100644 --- a/x-pack/plugins/security_solution/public/hosts/store/model.ts +++ b/x-pack/plugins/security_solution/public/hosts/store/model.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { HostsFields } from '../../../common/search_strategy/security_solution/hosts'; -import { Direction } from '../../graphql/types'; +import { Direction } from '../../../common/search_strategy'; +import { HostsFields } from '../../../common/search_strategy/security_solution'; export enum HostsType { page = 'page', diff --git a/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx b/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx index 0c9c74f9ebc15..536d1d084f0c5 100644 --- a/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx +++ b/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx @@ -11,8 +11,7 @@ */ import { renderApp } from './app'; -import { composeLibs } from './common/lib/compose/kibana_compose'; import { createStore, createInitialState } from './common/store'; -export { renderApp, composeLibs, createStore, createInitialState }; +export { renderApp, createStore, createInitialState }; diff --git a/x-pack/plugins/security_solution/public/network/components/details/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/details/index.test.tsx index 514460ffb0970..ceb89db7b0f53 100644 --- a/x-pack/plugins/security_solution/public/network/components/details/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/details/index.test.tsx @@ -9,10 +9,8 @@ import { shallow } from 'enzyme'; import React from 'react'; import { ActionCreator } from 'typescript-fsa'; -import { FlowTarget } from '../../../graphql/types'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -26,27 +24,16 @@ import { IpOverview } from './index'; import { mockData } from './mock'; import { mockAnomalies } from '../../../common/components/ml/mock'; import { NarrowDateRange } from '../../../common/components/ml/types'; +import { FlowTarget } from '../../../../common/search_strategy'; describe('IP Overview Component', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx index 3bbc08d593fd3..7b3f9e956c765 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx @@ -13,11 +13,11 @@ import { getRenderedFieldValue, PointToolTipContentComponent } from './point_too import { TestProviders } from '../../../../common/mock'; import { getEmptyStringTag } from '../../../../common/components/empty_value'; import { HostDetailsLink, NetworkDetailsLink } from '../../../../common/components/links'; -import { FlowTarget } from '../../../../graphql/types'; import { TooltipProperty, ITooltipProperty, } from '../../../../../../maps/public/classes/tooltips/tooltip_property'; +import { FlowTarget } from '../../../../../common/search_strategy'; describe('PointToolTipContent', () => { const mockFeatureProps: ITooltipProperty[] = [ diff --git a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx index fb032d11ef98a..0fa59c6fd9e42 100644 --- a/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx +++ b/x-pack/plugins/security_solution/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx @@ -14,9 +14,9 @@ import { import { DescriptionListStyled } from '../../../../common/components/page'; import { HostDetailsLink, NetworkDetailsLink } from '../../../../common/components/links'; import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; -import { FlowTarget } from '../../../../graphql/types'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ITooltipProperty } from '../../../../../../maps/public/classes/tooltips/tooltip_property'; +import { FlowTarget } from '../../../../../common/search_strategy'; interface PointToolTipContentProps { contextId: string; diff --git a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.test.tsx b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.test.tsx index 49c0decbfe301..d98db616c9cde 100644 --- a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.test.tsx @@ -7,8 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; - -import { FlowDirection } from '../../../graphql/types'; +import { FlowDirection } from '../../../../common/search_strategy'; import { FlowDirectionSelect } from './flow_direction_select'; diff --git a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.tsx b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.tsx index c434434f707de..12fa1e6a0d00d 100644 --- a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.tsx +++ b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_direction_select.tsx @@ -7,8 +7,7 @@ import { EuiFilterButton, EuiFilterGroup } from '@elastic/eui'; import React from 'react'; - -import { FlowDirection } from '../../../graphql/types'; +import { FlowDirection } from '../../../../common/search_strategy'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.test.tsx b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.test.tsx index e8779a76626a5..918114f9e7196 100644 --- a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.test.tsx @@ -8,8 +8,7 @@ import { mount, shallow } from 'enzyme'; import { clone } from 'lodash/fp'; import React from 'react'; - -import { FlowDirection, FlowTarget } from '../../../graphql/types'; +import { FlowDirection, FlowTarget } from '../../../../common/search_strategy'; import { FlowTargetSelect } from './flow_target_select'; diff --git a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.tsx b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.tsx index 5d8f33e9d7b05..723378b970df8 100644 --- a/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.tsx +++ b/x-pack/plugins/security_solution/public/network/components/flow_controls/flow_target_select.tsx @@ -7,8 +7,7 @@ import { EuiSuperSelect } from '@elastic/eui'; import React from 'react'; - -import { FlowDirection, FlowTarget } from '../../../graphql/types'; +import { FlowTarget, FlowDirection } from '../../../../common/search_strategy'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.test.tsx index b1e2874d3c77b..8794d48b5aa13 100644 --- a/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.test.tsx @@ -12,7 +12,7 @@ import { MemoryRouter } from 'react-router-dom'; import '../../../common/mock/match_media'; import { TestProviders } from '../../../common/mock'; import { FlowTargetSelectConnectedComponent } from './index'; -import { FlowTarget } from '../../../graphql/types'; +import { FlowTarget } from '../../../../common/search_strategy'; describe('Flow Target Select Connected', () => { test('renders correctly against snapshot flowTarget source', () => { diff --git a/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.tsx b/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.tsx index c1568e2df21b8..5fef9833c57e2 100644 --- a/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/flow_target_select_connected/index.tsx @@ -11,11 +11,11 @@ import React, { useCallback } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; import styled from 'styled-components'; -import { FlowDirection, FlowTarget } from '../../../graphql/types'; import * as i18nIp from '../details/translations'; import { FlowTargetSelect } from '../flow_controls/flow_target_select'; import { IpOverviewId } from '../../../timelines/components/field_renderers/field_renderers'; +import { FlowTarget, FlowDirection } from '../../../../common/search_strategy'; const SelectTypeItem = styled(EuiFlexItem)` min-width: 180px; diff --git a/x-pack/plugins/security_solution/public/network/components/kpi_network/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/kpi_network/index.test.tsx index e88a7593c1a09..7f9c5b4672f9a 100644 --- a/x-pack/plugins/security_solution/public/network/components/kpi_network/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/kpi_network/index.test.tsx @@ -10,7 +10,6 @@ import React from 'react'; import { Provider as ReduxStoreProvider } from 'react-redux'; import { - apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, @@ -33,22 +32,10 @@ describe('NetworkKpiComponent', () => { }; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { diff --git a/x-pack/plugins/security_solution/public/network/components/network_dns_table/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/network_dns_table/index.test.tsx index a645396063bde..7ec18c078c73d 100644 --- a/x-pack/plugins/security_solution/public/network/components/network_dns_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/network_dns_table/index.test.tsx @@ -8,12 +8,10 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -31,23 +29,11 @@ describe('NetworkTopNFlow Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mount = useMountAppended(); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { @@ -75,21 +61,19 @@ describe('NetworkTopNFlow Table Component', () => { describe('Sorting', () => { test('when you click on the column header, you should show the sorting icon', () => { const wrapper = mount( - - - - - + + + ); expect(store.getState().network.page.queries!.dns.sort).toEqual({ diff --git a/x-pack/plugins/security_solution/public/network/components/network_dns_table/is_ptr_included.test.tsx b/x-pack/plugins/security_solution/public/network/components/network_dns_table/is_ptr_included.test.tsx index 870de5c36afad..762cd4006002b 100644 --- a/x-pack/plugins/security_solution/public/network/components/network_dns_table/is_ptr_included.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/network_dns_table/is_ptr_included.test.tsx @@ -7,8 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; - -import { FlowDirection } from '../../../graphql/types'; +import { FlowDirection } from '../../../../common/search_strategy'; import { IsPtrIncluded } from './is_ptr_included'; diff --git a/x-pack/plugins/security_solution/public/network/components/network_http_table/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/network_http_table/index.test.tsx index cbadb47c6d11a..f7f75d9f0a365 100644 --- a/x-pack/plugins/security_solution/public/network/components/network_http_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/network_http_table/index.test.tsx @@ -8,12 +8,10 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -34,23 +32,11 @@ describe('NetworkHttp Table Component', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mount = useMountAppended(); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { @@ -78,21 +64,19 @@ describe('NetworkHttp Table Component', () => { describe('Sorting', () => { test('when you click on the column header, you should show the sorting icon', () => { const wrapper = mount( - - - - - + + + ); expect(store.getState().network.page.queries!.http.sort).toEqual({ diff --git a/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.test.tsx index 8ea43d1b0c34f..c9ce204a52538 100644 --- a/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.test.tsx @@ -8,13 +8,11 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; import { FlowTargetSourceDest } from '../../../../common/search_strategy/security_solution/network'; import { - apolloClientObservable, mockGlobalState, mockIndexPattern, TestProviders, @@ -35,22 +33,10 @@ describe('NetworkTopCountries Table Component', () => { const mount = useMountAppended(); const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { @@ -109,27 +95,25 @@ describe('NetworkTopCountries Table Component', () => { describe('Sorting on Table', () => { test('when you click on the column header, you should show the sorting icon', () => { const wrapper = mount( - - - - - + + + ); expect(store.getState().network.page.queries.topCountriesSource.sort).toEqual({ direction: 'desc', diff --git a/x-pack/plugins/security_solution/public/network/components/network_top_n_flow_table/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/network_top_n_flow_table/index.test.tsx index 5983efad32fe2..a05277cd0513d 100644 --- a/x-pack/plugins/security_solution/public/network/components/network_top_n_flow_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/network_top_n_flow_table/index.test.tsx @@ -8,13 +8,10 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; -import { FlowTargetSourceDest } from '../../../graphql/types'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -26,6 +23,7 @@ import { createStore, State } from '../../../common/store'; import { networkModel } from '../../store'; import { NetworkTopNFlowTable } from '.'; import { mockData } from './mock'; +import { FlowTargetSourceDest } from '../../../../common/search_strategy'; jest.mock('../../../common/components/link_to'); @@ -34,23 +32,11 @@ describe('NetworkTopNFlow Table Component', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mount = useMountAppended(); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('rendering', () => { @@ -100,22 +86,20 @@ describe('NetworkTopNFlow Table Component', () => { describe('Sorting on Table', () => { test('when you click on the column header, you should show the sorting icon', () => { const wrapper = mount( - - - - - + + + ); expect(store.getState().network.page.queries.topNFlowSource.sort).toEqual({ direction: 'desc', diff --git a/x-pack/plugins/security_solution/public/network/components/tls_table/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/tls_table/index.test.tsx index f93d6d276bc6e..09b1afc5611b0 100644 --- a/x-pack/plugins/security_solution/public/network/components/tls_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/tls_table/index.test.tsx @@ -8,12 +8,10 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -31,23 +29,11 @@ describe('Tls Table Component', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mount = useMountAppended(); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('Rendering', () => { @@ -75,21 +61,19 @@ describe('Tls Table Component', () => { describe('Sorting on Table', () => { test('when you click on the column header, you should show the sorting icon', () => { const wrapper = mount( - - - - - + + + ); expect(store.getState().network.details.queries!.tls.sort).toEqual({ direction: 'desc', diff --git a/x-pack/plugins/security_solution/public/network/components/users_table/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/users_table/index.test.tsx index 8fab7273530d2..e551dbb640751 100644 --- a/x-pack/plugins/security_solution/public/network/components/users_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/users_table/index.test.tsx @@ -8,13 +8,10 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; import '../../../common/mock/match_media'; -import { FlowTarget } from '../../../graphql/types'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -27,29 +24,18 @@ import { networkModel } from '../../store'; import { UsersTable } from '.'; import { mockUsersData } from './mock'; +import { FlowTarget } from '../../../../common/search_strategy'; describe('Users Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mount = useMountAppended(); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); describe('Rendering', () => { @@ -78,26 +64,20 @@ describe('Users Table Component', () => { describe('Sorting on Table', () => { test('when you click on the column header, you should show the sorting icon', () => { const wrapper = mount( - - - - - + + + ); expect(store.getState().network.details.queries!.users.sort).toEqual({ direction: 'asc', diff --git a/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx b/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx index 77f6d4575d8f7..49a7064113c30 100644 --- a/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx @@ -15,7 +15,6 @@ import { inputsModel } from '../../../common/store'; import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; import { useKibana } from '../../../common/lib/kibana'; import { createFilter } from '../../../common/containers/helpers'; -import { PageInfoPaginated, FlowTargetSourceDest } from '../../../graphql/types'; import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; import { networkModel, networkSelectors } from '../../store'; import { @@ -27,6 +26,7 @@ import { isCompleteResponse, isErrorResponse } from '../../../../../../../src/pl import * as i18n from './translations'; import { getInspectResponse } from '../../../helpers'; +import { FlowTargetSourceDest, PageInfoPaginated } from '../../../../common/search_strategy'; const ID = 'networkTlsQuery'; diff --git a/x-pack/plugins/security_solution/public/network/containers/users/index.tsx b/x-pack/plugins/security_solution/public/network/containers/users/index.tsx index 515ef3b8644ab..e000981733eed 100644 --- a/x-pack/plugins/security_solution/public/network/containers/users/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/users/index.tsx @@ -16,7 +16,6 @@ import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { inputsModel } from '../../../common/store'; import { useKibana } from '../../../common/lib/kibana'; import { createFilter } from '../../../common/containers/helpers'; -import { PageInfoPaginated } from '../../../graphql/types'; import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; import { networkSelectors } from '../../store'; import { @@ -29,6 +28,7 @@ import { isCompleteResponse, isErrorResponse } from '../../../../../../../src/pl import * as i18n from './translations'; import { getInspectResponse } from '../../../helpers'; import { InspectResponse } from '../../../types'; +import { PageInfoPaginated } from '../../../../common/search_strategy'; const ID = 'networkUsersQuery'; diff --git a/x-pack/plugins/security_solution/public/network/pages/details/index.test.tsx b/x-pack/plugins/security_solution/public/network/pages/details/index.test.tsx index 84c4e4528a12e..a9a97f6bac652 100644 --- a/x-pack/plugins/security_solution/public/network/pages/details/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/details/index.test.tsx @@ -11,9 +11,7 @@ import { Router, useParams } from 'react-router-dom'; import '../../../common/mock/match_media'; import { useSourcererScope } from '../../../common/containers/sourcerer'; -import { FlowTarget } from '../../../graphql/types'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -23,6 +21,7 @@ import { import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { createStore, State } from '../../../common/store'; import { NetworkDetails } from './index'; +import { FlowTarget } from '../../../../common/search_strategy'; jest.mock('@elastic/eui', () => { const original = jest.requireActual('@elastic/eui'); @@ -109,22 +108,10 @@ describe('Network Details', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it renders', () => { diff --git a/x-pack/plugins/security_solution/public/network/pages/details/index.tsx b/x-pack/plugins/security_solution/public/network/pages/details/index.tsx index 896eec39c125c..4cccb536c08bb 100644 --- a/x-pack/plugins/security_solution/public/network/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/details/index.tsx @@ -11,7 +11,11 @@ import { useDispatch } from 'react-redux'; import { useParams } from 'react-router-dom'; import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; -import { FlowTarget, LastEventIndexKey } from '../../../../common/search_strategy'; +import { + FlowTarget, + FlowTargetSourceDest, + LastEventIndexKey, +} from '../../../../common/search_strategy'; import { useGlobalTime } from '../../../common/containers/use_global_time'; import { FiltersGlobal } from '../../../common/components/filters_global'; import { HeaderPage } from '../../../common/components/header_page'; @@ -26,7 +30,6 @@ import { IpOverview } from '../../components/details'; import { SiemSearchBar } from '../../../common/components/search_bar'; import { WrapperPage } from '../../../common/components/wrapper_page'; import { useNetworkDetails } from '../../containers/details'; -import { FlowTargetSourceDest } from '../../../graphql/types'; import { useKibana } from '../../../common/lib/kibana'; import { decodeIpv6 } from '../../../common/lib/helpers'; import { convertToBuildEsQuery } from '../../../common/lib/keury'; diff --git a/x-pack/plugins/security_solution/public/network/pages/index.tsx b/x-pack/plugins/security_solution/public/network/pages/index.tsx index c82b9060729c6..ddc098823470a 100644 --- a/x-pack/plugins/security_solution/public/network/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/index.tsx @@ -10,13 +10,13 @@ import { Route, Switch, RouteComponentProps, useHistory } from 'react-router-dom import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities'; import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; -import { FlowTarget } from '../../graphql/types'; import { NetworkDetails } from './details'; import { Network } from './network'; import { getNetworkRoutePath } from './navigation'; import { NetworkRouteType } from './navigation/types'; import { MlNetworkConditionalContainer } from '../../common/components/ml/conditional_links/ml_network_conditional_container'; +import { FlowTarget } from '../../../common/search_strategy'; type Props = Partial> & { url: string }; diff --git a/x-pack/plugins/security_solution/public/network/pages/network.test.tsx b/x-pack/plugins/security_solution/public/network/pages/network.test.tsx index ece647e9710e0..862a4f1a56c12 100644 --- a/x-pack/plugins/security_solution/public/network/pages/network.test.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/network.test.tsx @@ -15,7 +15,6 @@ import { useSourcererScope } from '../../common/containers/sourcerer'; import { TestProviders, mockGlobalState, - apolloClientObservable, SUB_PLUGINS_REDUCER, kibanaObservable, createSecuritySolutionStorageMock, @@ -146,13 +145,7 @@ describe('Network page - rendering', () => { }); const myState: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - const myStore = createStore( - myState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + const myStore = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_host/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_host/index.test.tsx index 9199059b9790d..1295693db506f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_host/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_host/index.test.tsx @@ -11,7 +11,6 @@ import React from 'react'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -63,23 +62,11 @@ describe('OverviewHost', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { const myState = cloneDeep(state); - store = createStore( - myState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it renders the expected widget title', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx index ce3973e59d18b..13a9b529fdf43 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx @@ -11,7 +11,6 @@ import React from 'react'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -73,23 +72,11 @@ describe('OverviewNetwork', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); beforeEach(() => { const myState = cloneDeep(state); - store = createStore( - myState, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it renders the expected widget title', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx index 004e675cb3516..1d9b039e02258 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx @@ -5,14 +5,12 @@ * 2.0. */ -import ApolloClient from 'apollo-client'; import { EuiHorizontalRule, EuiText } from '@elastic/eui'; import React, { useCallback, useMemo, useEffect } from 'react'; import { useDispatch } from 'react-redux'; -import { TimelineType } from '../../../../common/types/timeline'; +import { SortFieldTimeline, TimelineType } from '../../../../common/types/timeline'; import { useGetAllTimeline } from '../../../timelines/containers/all'; -import { SortFieldTimeline, Direction } from '../../../graphql/types'; import { queryTimelineById, dispatchUpdateTimeline, @@ -30,15 +28,15 @@ import { SecurityPageName } from '../../../app/types'; import { APP_ID } from '../../../../common/constants'; import { useFormatUrl } from '../../../common/components/link_to'; import { LinkAnchor } from '../../../common/components/links'; +import { Direction } from '../../../../common/search_strategy'; interface Props { - apolloClient: ApolloClient<{}>; filterBy: FilterMode; } const PAGE_SIZE = 3; -const StatefulRecentTimelinesComponent: React.FC = ({ apolloClient, filterBy }) => { +const StatefulRecentTimelinesComponent: React.FC = ({ filterBy }) => { const dispatch = useDispatch(); const updateIsLoading = useCallback((payload) => dispatch(dispatchUpdateIsLoading(payload)), [ dispatch, @@ -50,14 +48,13 @@ const StatefulRecentTimelinesComponent: React.FC = ({ apolloClient, filte const onOpenTimeline: OnOpenTimeline = useCallback( ({ duplicate, timelineId }) => { queryTimelineById({ - apolloClient, duplicate, timelineId, updateIsLoading, updateTimeline, }); }, - [apolloClient, updateIsLoading, updateTimeline] + [updateIsLoading, updateTimeline] ); const goToTimelines = useCallback( diff --git a/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx b/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx index 9512a3e3c67c7..cd88b8f44dc7b 100644 --- a/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/sidebar/sidebar.tsx @@ -20,7 +20,6 @@ import { FilterMode as RecentCasesFilterMode } from '../recent_cases/types'; import { DEFAULT_FILTER_OPTIONS } from '../../../cases/containers/use_get_cases'; import { SidebarHeader } from '../../../common/components/sidebar_header'; import { useCurrentUser } from '../../../common/lib/kibana'; -import { useApolloClient } from '../../../common/utils/apollo_context'; import * as i18n from '../../pages/translations'; @@ -50,7 +49,6 @@ export const Sidebar = React.memo<{ setRecentTimelinesFilterBy, }) => { const currentUser = useCurrentUser(); - const apolloClient = useApolloClient(); const recentCasesFilters = useMemo( () => ( {recentTimelinesFilters} - + diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 136df89558d53..23f3472b470b5 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -177,10 +177,9 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { overview: subPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -200,10 +199,9 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { detections: subPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -223,9 +221,8 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { hosts: subPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -245,9 +242,8 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { network: subPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -267,9 +263,8 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { timelines: subPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -289,9 +284,8 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { cases: subPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -311,9 +305,8 @@ export class Plugin implements IPlugin { const [coreStart, startPlugins] = await core.getStartServices(); const { management: managementSubPlugin } = await this.subPlugins(); - const { renderApp, composeLibs } = await this.lazyApplicationDependencies(); + const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ - ...composeLibs(coreStart), ...params, services: await startServices, store: await this.store(coreStart, startPlugins), @@ -458,7 +451,7 @@ export class Plugin implements IPlugin { const storeShowIsTrue = createStore( stateShowIsTrue, SUB_PLUGINS_REDUCER, - apolloClientObservable, kibanaObservable, storage ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts index 4d1c9e8037455..1222f168b2ae9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.test.ts @@ -7,9 +7,12 @@ import { cloneDeep, getOr, omit } from 'lodash/fp'; import { Dispatch } from 'redux'; -import ApolloClient from 'apollo-client'; -import { mockTimelineResults, mockTimelineResult, mockTimelineModel } from '../../../common/mock'; +import { + mockTimelineResults, + mockTimelineModel, + mockGetOneTimelineResult, +} from '../../../common/mock'; import { timelineDefaults } from '../../store/timeline/defaults'; import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../../common/store/inputs/actions'; import { @@ -47,6 +50,7 @@ import { mockTimeline as mockSelectedTimeline, mockTemplate as mockSelectedTemplate, } from './__mocks__'; +import { getTimeline } from '../../containers/api'; jest.mock('../../../common/store/inputs/actions'); jest.mock('../../../common/components/url_state/normalize_time_range.ts'); @@ -68,6 +72,8 @@ jest.mock('../../../common/utils/default_date_settings', () => { }; }); +jest.mock('../../containers/api'); + describe('helpers', () => { let mockResults: OpenTimelineResult[]; @@ -1223,12 +1229,8 @@ describe('helpers', () => { const selectedTimeline = { ...mockSelectedTimeline, }; - const apolloClient = { - query: (jest.fn().mockResolvedValue(selectedTimeline) as unknown) as ApolloClient<{}>, - }; const onOpenTimeline = jest.fn(); const args = { - apolloClient, duplicate: false, graphEventId: '', timelineId: '', @@ -1240,6 +1242,7 @@ describe('helpers', () => { }; beforeAll(async () => { + (getTimeline as jest.Mock).mockResolvedValue(selectedTimeline); await queryTimelineById<{}>((args as unknown) as QueryTimelineById<{}>); }); @@ -1255,7 +1258,7 @@ describe('helpers', () => { }); test('get timeline by Id', () => { - expect(apolloClient.query).toHaveBeenCalled(); + expect(getTimeline).toHaveBeenCalled(); }); test('Do not override daterange if TimelineStatus is active', () => { @@ -1281,11 +1284,8 @@ describe('helpers', () => { const updateIsLoading = jest.fn(); const updateTimeline = jest.fn().mockImplementation(() => jest.fn()); const selectedTimeline = { ...mockSelectedTimeline }; - const apolloClient = { - query: (jest.fn().mockResolvedValue(selectedTimeline) as unknown) as ApolloClient<{}>, - }; + const args = { - apolloClient, duplicate: false, graphEventId: '', timelineId: '', @@ -1296,6 +1296,7 @@ describe('helpers', () => { }; beforeAll(async () => { + (getTimeline as jest.Mock).mockResolvedValue(selectedTimeline); await queryTimelineById<{}>((args as unknown) as QueryTimelineById<{}>); }); @@ -1311,7 +1312,7 @@ describe('helpers', () => { }); test('get timeline by Id', () => { - expect(apolloClient.query).toHaveBeenCalled(); + expect(getTimeline).toHaveBeenCalled(); }); test('should not override daterange if TimelineStatus is active', () => { @@ -1350,12 +1351,8 @@ describe('helpers', () => { describe('open an immutable template', () => { const updateIsLoading = jest.fn(); const template = { ...mockSelectedTemplate }; - const apolloClient = { - query: (jest.fn().mockResolvedValue(template) as unknown) as ApolloClient<{}>, - }; const onOpenTimeline = jest.fn(); const args = { - apolloClient, duplicate: false, graphEventId: '', timelineId: '', @@ -1367,10 +1364,12 @@ describe('helpers', () => { }; beforeAll(async () => { + (getTimeline as jest.Mock).mockResolvedValue(template); await queryTimelineById<{}>((args as unknown) as QueryTimelineById<{}>); }); afterAll(() => { + (getTimeline as jest.Mock).mockReset(); jest.clearAllMocks(); }); @@ -1382,7 +1381,7 @@ describe('helpers', () => { }); test('get timeline by Id', () => { - expect(apolloClient.query).toHaveBeenCalled(); + expect(getTimeline).toHaveBeenCalled(); }); test('override daterange if TimelineStatus is immutable', () => { @@ -1411,14 +1410,14 @@ describe('helpers', () => { describe('omitTypenameInTimeline', () => { test('it does not modify the passed in timeline if no __typename exists', () => { - const result = omitTypenameInTimeline(mockTimelineResult); + const result = omitTypenameInTimeline(mockGetOneTimelineResult); - expect(result).toEqual(mockTimelineResult); + expect(result).toEqual(mockGetOneTimelineResult); }); test('it returns timeline with __typename removed when it exists', () => { const mockTimeline = { - ...mockTimelineResult, + ...mockGetOneTimelineResult, __typename: 'something, something', }; const result = omitTypenameInTimeline(mockTimeline); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts index 68f4d70c018f8..8c4eb2112640f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/helpers.ts @@ -5,23 +5,12 @@ * 2.0. */ -import ApolloClient from 'apollo-client'; import { set } from '@elastic/safer-lodash-set/fp'; import { getOr, isEmpty } from 'lodash/fp'; import { Action } from 'typescript-fsa'; import uuid from 'uuid'; import { Dispatch } from 'redux'; import deepMerge from 'deepmerge'; -import { oneTimelineQuery } from '../../containers/one/index.gql_query'; -import { - TimelineResult, - GetOneTimeline, - NoteResult, - FilterTimelineResult, - ColumnHeaderResult, - PinnedEvent, - DataProviderResult, -} from '../../../graphql/types'; import { DataProviderType, @@ -29,6 +18,10 @@ import { TimelineStatus, TimelineType, TimelineTabs, + TimelineResult, + ColumnHeaderResult, + FilterTimelineResult, + DataProviderResult, } from '../../../../common/types/timeline'; import { @@ -66,6 +59,9 @@ import { DEFAULT_FROM_MOMENT, DEFAULT_TO_MOMENT, } from '../../../common/utils/default_date_settings'; +import { getTimeline } from '../../containers/api'; +import { PinnedEvent } from '../../../../common/types/timeline/pinned_event'; +import { NoteResult } from '../../../../common/types/timeline/note'; export const OPEN_TIMELINE_CLASS_NAME = 'open-timeline'; @@ -310,7 +306,6 @@ export const formatTimelineResultToModel = ( export interface QueryTimelineById { activeTimelineTab?: TimelineTabs; - apolloClient: ApolloClient | ApolloClient<{}> | undefined; duplicate?: boolean; graphEventId?: string; timelineId: string; @@ -329,7 +324,6 @@ export interface QueryTimelineById { export const queryTimelineById = ({ activeTimelineTab = TimelineTabs.query, - apolloClient, duplicate = false, graphEventId = '', timelineId, @@ -340,51 +334,44 @@ export const queryTimelineById = ({ updateTimeline, }: QueryTimelineById) => { updateIsLoading({ id: TimelineId.active, isLoading: true }); - if (apolloClient) { - apolloClient - .query({ - query: oneTimelineQuery, - fetchPolicy: 'no-cache', - variables: { id: timelineId }, - }) - .then((result) => { - const timelineToOpen: TimelineResult = omitTypenameInTimeline( - getOr({}, 'data.getOneTimeline', result) - ); - - const { timeline, notes } = formatTimelineResultToModel( - timelineToOpen, + Promise.resolve(getTimeline(timelineId)) + .then((result) => { + const timelineToOpen: TimelineResult = omitTypenameInTimeline( + getOr({}, 'data.getOneTimeline', result) + ); + + const { timeline, notes } = formatTimelineResultToModel( + timelineToOpen, + duplicate, + timelineType + ); + + if (onOpenTimeline != null) { + onOpenTimeline(timeline); + } else if (updateTimeline) { + const { from, to } = normalizeTimeRange({ + from: getOr(null, 'dateRange.start', timeline), + to: getOr(null, 'dateRange.end', timeline), + }); + updateTimeline({ duplicate, - timelineType - ); - - if (onOpenTimeline != null) { - onOpenTimeline(timeline); - } else if (updateTimeline) { - const { from, to } = normalizeTimeRange({ - from: getOr(null, 'dateRange.start', timeline), - to: getOr(null, 'dateRange.end', timeline), - }); - updateTimeline({ - duplicate, - from, - id: TimelineId.active, - notes, - timeline: { - ...timeline, - activeTab: activeTimelineTab, - graphEventId, - show: openTimeline, - dateRange: { start: from, end: to }, - }, - to, - })(); - } - }) - .finally(() => { - updateIsLoading({ id: TimelineId.active, isLoading: false }); - }); - } + from, + id: TimelineId.active, + notes, + timeline: { + ...timeline, + activeTab: activeTimelineTab, + graphEventId, + show: openTimeline, + dateRange: { start: from, end: to }, + }, + to, + })(); + } + }) + .finally(() => { + updateIsLoading({ id: TimelineId.active, isLoading: false }); + }); }; export const dispatchUpdateTimeline = (dispatch: Dispatch): DispatchUpdateTimeline => ({ diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx index 872175de2c055..c0b451a875522 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.test.tsx @@ -8,9 +8,8 @@ /* eslint-disable react/display-name */ import React from 'react'; -import { renderHook, act } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react-hooks'; import { mount } from 'enzyme'; -import { MockedProvider } from 'react-apollo/test-utils'; import { waitFor } from '@testing-library/react'; import { useHistory, useParams } from 'react-router-dom'; @@ -20,14 +19,13 @@ import { SecurityPageName } from '../../../app/types'; import { TimelineType } from '../../../../common/types/timeline'; import { TestProviders, mockOpenTimelineQueryResults } from '../../../common/mock'; -import { getTimelineTabsUrl } from '../../../common/components/link_to'; import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines_page'; import { useGetAllTimeline, getAllTimeline } from '../../containers/all'; import { useTimelineStatus } from './use_timeline_status'; import { NotePreviews } from './note_previews'; -import { OPEN_TIMELINE_CLASS_NAME } from './helpers'; +import { OPEN_TIMELINE_CLASS_NAME, queryTimelineById } from './helpers'; import { StatefulOpenTimeline } from '.'; import { TimelineTabsStyle } from './types'; import { @@ -35,6 +33,7 @@ import { UseTimelineTypesArgs, UseTimelineTypesResult, } from './use_timeline_types'; +import { deleteTimelinesByIds } from '../../containers/api'; jest.mock('react-router-dom', () => { const originalModule = jest.requireActual('react-router-dom'); @@ -80,6 +79,10 @@ jest.mock('./use_timeline_status', () => { }; }); +jest.mock('../../containers/api', () => ({ + deleteTimelinesByIds: jest.fn(), +})); + describe('StatefulOpenTimeline', () => { const title = 'All Timelines / Open Timelines'; let mockHistory: History[]; @@ -94,12 +97,9 @@ describe('StatefulOpenTimeline', () => { (useHistory as jest.Mock).mockReturnValue(mockHistory); ((useGetAllTimeline as unknown) as jest.Mock).mockReturnValue({ fetchAllTimeline: jest.fn(), - timelines: getAllTimeline( - '', - mockOpenTimelineQueryResults[0].result.data?.getAllTimeline?.timeline ?? [] - ), + timelines: getAllTimeline('', mockOpenTimelineQueryResults.timeline ?? []), loading: false, - totalCount: mockOpenTimelineQueryResults[0].result.data.getAllTimeline.totalCount, + totalCount: mockOpenTimelineQueryResults.totalCount, refetch: jest.fn(), }); ((useTimelineStatus as unknown) as jest.Mock).mockReturnValue({ @@ -112,23 +112,19 @@ describe('StatefulOpenTimeline', () => { }); afterEach(() => { - (getTimelineTabsUrl as jest.Mock).mockClear(); - (useParams as jest.Mock).mockClear(); - (useHistory as jest.Mock).mockClear(); + jest.clearAllMocks(); mockHistory = []; }); test('it has the expected initial state', () => { const wrapper = mount( - - - + ); @@ -175,7 +171,7 @@ describe('StatefulOpenTimeline', () => { expect(result.current.timelineType).toBe(TimelineType.template); }); - test("should land on correct templates' tab after switching tab", () => { + test("should land on correct templates' tab after switching tab", async () => { (useParams as jest.Mock).mockReturnValue({ tabName: TimelineType.template, pageName: SecurityPageName.timelines, @@ -183,21 +179,20 @@ describe('StatefulOpenTimeline', () => { const wrapper = mount( - - - + ); - wrapper - .find(`[data-test-subj="timeline-${TimelineTabsStyle.tab}-${TimelineType.template}"]`) - .first() - .simulate('click'); - act(() => { + await waitFor(() => { + wrapper + .find(`[data-test-subj="timeline-${TimelineTabsStyle.tab}-${TimelineType.template}"]`) + .first() + .simulate('click'); + expect(history.length).toBeGreaterThan(0); }); }); @@ -218,7 +213,7 @@ describe('StatefulOpenTimeline', () => { expect(result.current.timelineType).toBe(TimelineType.default); }); - test('should not change url after switching filter', () => { + test('should not change url after switching filter', async () => { (useParams as jest.Mock).mockReturnValue({ tabName: 'mockTabName', pageName: SecurityPageName.case, @@ -226,58 +221,53 @@ describe('StatefulOpenTimeline', () => { const wrapper = mount( - - - + ); - wrapper - .find( - `[data-test-subj="open-timeline-modal-body-${TimelineTabsStyle.filter}-${TimelineType.template}"]` - ) - .first() - .simulate('click'); - act(() => { + await waitFor(() => { + wrapper + .find( + `[data-test-subj="open-timeline-modal-body-${TimelineTabsStyle.filter}-${TimelineType.template}"]` + ) + .first() + .simulate('click'); expect(mockHistory.length).toEqual(0); }); }); }); describe('#onQueryChange', () => { - test('it updates the query state with the expected trimmed value when the user enters a query', () => { + test('it updates the query state with the expected trimmed value when the user enters a query', async () => { const wrapper = mount( - - - + ); - wrapper - .find('[data-test-subj="search-bar"] input') - .simulate('keyup', { key: 'Enter', target: { value: ' abcd ' } }); - expect(wrapper.find('[data-test-subj="search-row"]').first().prop('query')).toEqual('abcd'); + await waitFor(() => { + wrapper + .find('[data-test-subj="search-bar"] input') + .simulate('keyup', { key: 'Enter', target: { value: ' abcd ' } }); + expect(wrapper.find('[data-test-subj="search-row"]').first().prop('query')).toEqual('abcd'); + }); }); - test('it appends the word "with" to the Showing in Timelines message when the user enters a query', async () => { const wrapper = mount( - - - + ); @@ -295,13 +285,11 @@ describe('StatefulOpenTimeline', () => { test('echos (renders) the query when the user enters a query', async () => { const wrapper = mount( - - - + ); @@ -321,13 +309,11 @@ describe('StatefulOpenTimeline', () => { test('focuses the input when the component mounts', async () => { const wrapper = mount( - - - + ); @@ -347,13 +333,11 @@ describe('StatefulOpenTimeline', () => { const wrapper = mount( - - - + ); @@ -381,41 +365,24 @@ describe('StatefulOpenTimeline', () => { }); describe('#onDeleteSelected', () => { - // TODO - Have been skip because we need to re-implement the test as the component changed - test.skip('it invokes deleteTimelines with the selected timelines when the button is clicked', async () => { - const deleteTimelines = jest.fn(); - + test('it invokes deleteTimelines with the selected timelines when the button is clicked', async () => { const wrapper = mount( - - - + ); + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="delete-timeline"]').first().simulate('click'); + wrapper.find('[data-test-subj="confirmModalConfirmButton"]').first().simulate('click'); await waitFor(() => { - wrapper - .find('.euiCheckbox__input') - .first() - .simulate('change', { target: { checked: true } }); - - wrapper.find('[data-test-subj="delete-selected"]').first().simulate('click'); + wrapper.update(); - expect(deleteTimelines).toHaveBeenCalledWith([ - 'saved-timeline-11', - 'saved-timeline-10', - 'saved-timeline-9', - 'saved-timeline-8', - 'saved-timeline-6', - 'saved-timeline-5', - 'saved-timeline-4', - 'saved-timeline-3', - 'saved-timeline-2', - ]); + expect(deleteTimelinesByIds).toHaveBeenCalled(); }); }); }); @@ -424,14 +391,12 @@ describe('StatefulOpenTimeline', () => { test('it updates the selection state when timelines are selected', async () => { const wrapper = mount( - - - + ); @@ -455,14 +420,12 @@ describe('StatefulOpenTimeline', () => { test('it updates the sort state when the user clicks on a column to sort it', () => { const wrapper = mount( - - - + ); @@ -482,14 +445,12 @@ describe('StatefulOpenTimeline', () => { test('it updates the onlyFavorites state when the user clicks the Only Favorites button', () => { const wrapper = mount( - - - + ); @@ -509,14 +470,12 @@ describe('StatefulOpenTimeline', () => { test('it updates the itemIdToExpandedNotesRowMap state when the user clicks the expand notes button', async () => { const wrapper = mount( - - - + ); @@ -538,11 +497,11 @@ describe('StatefulOpenTimeline', () => { '10849df0-7b44-11e9-a608-ab3d811609': ( ({ ...note, savedObjectId: note.noteId }) - ) + mockOpenTimelineQueryResults.timeline[0].notes != null + ? mockOpenTimelineQueryResults.timeline[0].notes.map((note) => ({ + ...note, + savedObjectId: note.noteId, + })) : [] } /> @@ -554,14 +513,12 @@ describe('StatefulOpenTimeline', () => { test('it renders the expanded notes when the expand button is clicked', async () => { const wrapper = mount( - - - + ); @@ -577,14 +534,12 @@ describe('StatefulOpenTimeline', () => { test('it has the expected initial state for openTimeline - templateTimelineFilter', () => { const wrapper = mount( - - - + ); @@ -594,14 +549,12 @@ describe('StatefulOpenTimeline', () => { test('it has the expected initial state for openTimelineModalBody - templateTimelineFilter', () => { const wrapper = mount( - - - + ); @@ -619,14 +572,12 @@ describe('StatefulOpenTimeline', () => { test('when the user deletes selected timelines, resetSelectionState is invoked to clear the selection state', async () => { const wrapper = mount( - - - + ); const getSelectedItem = (): [] => @@ -645,14 +596,12 @@ describe('StatefulOpenTimeline', () => { test('it renders the expected count of matching timelines when no query has been entered', async () => { const wrapper = mount( - - - + ); @@ -665,62 +614,51 @@ describe('StatefulOpenTimeline', () => { }); }); - // TODO - Have been skip because we need to re-implement the test as the component changed - test.skip('it invokes onOpenTimeline with the expected parameters when the hyperlink is clicked', async () => { - const onOpenTimeline = jest.fn(); - + test('it invokes onOpenTimeline with the expected parameters when the hyperlink is clicked', async () => { const wrapper = mount( - - - + ); await waitFor(() => { wrapper - .find( - `[data-test-subj="title-${ - mockOpenTimelineQueryResults[0].result.data!.getAllTimeline.timeline[0].savedObjectId - }"]` - ) + .find(`[data-test-subj="title-${mockOpenTimelineQueryResults.timeline[0].savedObjectId}"]`) .first() .simulate('click'); - expect(onOpenTimeline).toHaveBeenCalledWith({ - duplicate: false, - timelineId: mockOpenTimelineQueryResults[0].result.data!.getAllTimeline.timeline[0] - .savedObjectId, - }); + expect((queryTimelineById as jest.Mock).mock.calls[0][0].timelineId).toEqual( + mockOpenTimelineQueryResults.timeline[0].savedObjectId + ); + expect((queryTimelineById as jest.Mock).mock.calls[0][0].duplicate).toEqual(false); }); }); - // TODO - Have been skip because we need to re-implement the test as the component changed - test.skip('it invokes onOpenTimeline with the expected params when the button is clicked', async () => { - const onOpenTimeline = jest.fn(); - + test('it invokes onOpenTimeline with the expected params when the button is clicked', async () => { const wrapper = mount( - - - + ); - + wrapper.find('[data-test-subj="euiCollapsedItemActionsButton"]').first().simulate('click'); + wrapper.find('[data-test-subj="open-duplicate"]').first().simulate('click'); await waitFor(() => { - wrapper.find('[data-test-subj="open-duplicate"]').first().simulate('click'); + wrapper.update(); - expect(onOpenTimeline).toBeCalledWith({ duplicate: true, timelineId: 'saved-timeline-11' }); + expect((queryTimelineById as jest.Mock).mock.calls[0][0].timelineId).toEqual( + mockOpenTimelineQueryResults.timeline[0].savedObjectId + ); + expect((queryTimelineById as jest.Mock).mock.calls[0][0].duplicate).toEqual(true); }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx index 523c181dfb10f..21e85fd3c5a4f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/index.tsx @@ -8,11 +8,9 @@ import React, { useEffect, useState, useCallback, useMemo } from 'react'; import { useDispatch } from 'react-redux'; -import { DeleteTimelineMutation, SortFieldTimeline, Direction } from '../../../graphql/types'; import { sourcererSelectors } from '../../../common/store'; import { useShallowEqualSelector, useDeepEqualSelector } from '../../../common/hooks/use_selector'; -import { TimelineId } from '../../../../common/types/timeline'; -import { useApolloClient } from '../../../common/utils/apollo_context'; +import { SortFieldTimeline, TimelineId } from '../../../../common/types/timeline'; import { TimelineModel } from '../../../timelines/store/timeline/model'; import { timelineSelectors } from '../../../timelines/store/timeline'; import { @@ -20,7 +18,6 @@ import { updateIsLoading as dispatchUpdateIsLoading, } from '../../../timelines/store/timeline/actions'; -import { deleteTimelineMutation } from '../../containers/delete/persist.gql_query'; import { useGetAllTimeline } from '../../containers/all'; import { defaultHeaders } from '../timeline/body/column_headers/default_headers'; @@ -47,6 +44,8 @@ import { import { DEFAULT_SORT_FIELD, DEFAULT_SORT_DIRECTION } from './constants'; import { useTimelineTypes } from './use_timeline_types'; import { useTimelineStatus } from './use_timeline_status'; +import { deleteTimelinesByIds } from '../../containers/api'; +import { Direction } from '../../../../common/search_strategy'; interface OwnProps { /** Displays open timeline in modal */ @@ -84,7 +83,6 @@ export const StatefulOpenTimelineComponent = React.memo( setImportDataModalToggle, title, }) => { - const apolloClient = useApolloClient(); const dispatch = useDispatch(); /** Required by EuiTable for expandable rows: a map of `TimelineResult.savedObjectId` to rendered notes */ const [itemIdToExpandedNotesRowMap, setItemIdToExpandedNotesRowMap] = useState< @@ -214,17 +212,10 @@ export const StatefulOpenTimelineComponent = React.memo( ); } - await apolloClient!.mutate< - DeleteTimelineMutation.Mutation, - DeleteTimelineMutation.Variables - >({ - mutation: deleteTimelineMutation, - fetchPolicy: 'no-cache', - variables: { id: timelineIds }, - }); + await deleteTimelinesByIds(timelineIds); refetch(); }, - [apolloClient, dispatch, existingIndexNames, refetch, timelineSavedObjectId] + [dispatch, existingIndexNames, refetch, timelineSavedObjectId] ); const onDeleteOneTimeline: OnDeleteOneTimeline = useCallback( @@ -291,7 +282,6 @@ export const StatefulOpenTimelineComponent = React.memo( } queryTimelineById({ - apolloClient, duplicate, onOpenTimeline, timelineId, @@ -301,7 +291,7 @@ export const StatefulOpenTimelineComponent = React.memo( }); }, // eslint-disable-next-line react-hooks/exhaustive-deps - [apolloClient, updateIsLoading, updateTimeline] + [updateIsLoading, updateTimeline] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx index 936993931da27..12da999c21fc8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx @@ -7,7 +7,6 @@ import { mount } from 'enzyme'; import React, { ReactElement } from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { TestProviders } from '../../../../common/mock/test_providers'; import { mockOpenTimelineQueryResults } from '../../../../common/mock/timeline_results'; @@ -16,9 +15,7 @@ import { useTimelineStatus } from '../use_timeline_status'; import { OpenTimelineModal } from '.'; jest.mock('../../../../common/lib/kibana'); -jest.mock('../../../../common/utils/apollo_context', () => ({ - useApolloClient: () => ({}), -})); + jest.mock('../../../containers/all', () => { const originalModule = jest.requireActual('../../../containers/all'); return { @@ -53,13 +50,9 @@ describe('OpenTimelineModal', () => { beforeEach(() => { ((useGetAllTimeline as unknown) as jest.Mock).mockReturnValue({ fetchAllTimeline: jest.fn(), - timelines: getAllTimeline( - '', - mockOpenTimelineQueryResults[0].result.data?.getAllTimeline?.timeline ?? [] - ), + timelines: getAllTimeline('', mockOpenTimelineQueryResults.timeline ?? []), loading: false, - totalCount: mockOpenTimelineQueryResults[0].result.data.getAllTimeline.totalCount, - refetch: jest.fn(), + totalCount: mockOpenTimelineQueryResults.totalCount, }); ((useTimelineStatus as unknown) as jest.Mock).mockReturnValue({ timelineStatus: null, @@ -76,9 +69,7 @@ describe('OpenTimelineModal', () => { test('it renders the expected modal', async () => { const wrapper = mount( - - - + ); @@ -90,9 +81,7 @@ describe('OpenTimelineModal', () => { test('it installs elastic prebuilt templates', async () => { const wrapper = mount( - - - + ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx index 62cdda6070b32..a902f4ea785c3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx @@ -7,24 +7,15 @@ import { mount } from 'enzyme'; import React from 'react'; -import { MockedProvider } from 'react-apollo/test-utils'; import { waitFor } from '@testing-library/react'; -import { TestProviders } from '../../../../common/mock/test_providers'; -import { mockOpenTimelineQueryResults } from '../../../../common/mock/timeline_results'; import * as i18n from '../translations'; import { OpenTimelineModalButton } from './open_timeline_modal_button'; describe('OpenTimelineModalButton', () => { test('it renders the expected button text', async () => { - const wrapper = mount( - - - - - - ); + const wrapper = mount(); await waitFor(() => { wrapper.update(); @@ -38,13 +29,7 @@ describe('OpenTimelineModalButton', () => { describe('onClick prop', () => { test('it invokes onClick function provided as a prop when the button is clicked', async () => { const onClick = jest.fn(); - const wrapper = mount( - - - - - - ); + const wrapper = mount(); await waitFor(() => { wrapper.find('[data-test-subj="open-timeline-button"]').first().simulate('click'); diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts index 47e1da2d240ea..cddf4e8d71d60 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/types.ts @@ -8,7 +8,7 @@ import type React from 'react'; import { AllTimelinesVariables } from '../../containers/all'; import { TimelineModel } from '../../store/timeline/model'; -import { NoteResult } from '../../../graphql/types'; +import { NoteResult } from '../../../../common/types/timeline/note'; import { TimelineTypeLiteral, TimelineTypeLiteralWithNull, diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/host_details/expandable_host.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/host_details/expandable_host.test.tsx index a9ab89359d0ae..c2df8959c8c94 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/host_details/expandable_host.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/host_details/expandable_host.test.tsx @@ -10,7 +10,6 @@ import React from 'react'; import '../../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -20,15 +19,6 @@ import { import { createStore, State } from '../../../../common/store'; import { ExpandableHostDetails } from './expandable_host'; -jest.mock('react-apollo', () => { - const original = jest.requireActual('react-apollo'); - return { - ...original, - // eslint-disable-next-line react/display-name - Query: () => <>, - }; -}); - describe('Expandable Host Component', () => { const state: State = { ...mockGlobalState, @@ -39,13 +29,7 @@ describe('Expandable Host Component', () => { }; const { storage } = createSecuritySolutionStorageMock(); - const store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mockProps = { contextID: 'text-context', diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.test.tsx index 15b2b33409707..69676e58b77bd 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.test.tsx @@ -10,7 +10,6 @@ import React from 'react'; import '../../../common/mock/match_media'; import { - apolloClientObservable, mockGlobalState, TestProviders, SUB_PLUGINS_REDUCER, @@ -21,26 +20,12 @@ import { createStore, State } from '../../../common/store'; import { DetailsPanel } from './index'; import { TimelineExpandedDetail, TimelineTabs } from '../../../../common/types/timeline'; import { FlowTarget } from '../../../../common/search_strategy/security_solution/network'; -jest.mock('react-apollo', () => { - const original = jest.requireActual('react-apollo'); - return { - ...original, - // eslint-disable-next-line react/display-name - Query: () => <>, - }; -}); describe('Details Panel Component', () => { const state: State = { ...mockGlobalState }; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const dataLessExpandedDetail = { [TimelineTabs.query]: { @@ -89,13 +74,7 @@ describe('Details Panel Component', () => { describe('DetailsPanel: rendering', () => { beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it should not render the DetailsPanel if no expanded detail has been set in the reducer', () => { @@ -123,13 +102,7 @@ describe('Details Panel Component', () => { describe('DetailsPanel:EventDetails: rendering', () => { beforeEach(() => { state.timeline.timelineById.test.expandedDetail = eventExpandedDetail; - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it should render the Details Panel when the panelView is set and the associated params are set', () => { @@ -167,13 +140,7 @@ describe('Details Panel Component', () => { describe('DetailsPanel:HostDetails: rendering', () => { beforeEach(() => { state.timeline.timelineById.test.expandedDetail = hostExpandedDetail; - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it should render the Host Details view in the Details Panel when the panelView is hostDetail and the hostName is set', () => { @@ -190,13 +157,7 @@ describe('Details Panel Component', () => { describe('DetailsPanel:NetworkDetails: rendering', () => { beforeEach(() => { state.timeline.timelineById.test.expandedDetail = networkExpandedDetail; - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); test('it should render the Network Details view in the Details Panel when the panelView is networkDetail and the ip is set', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/column_header.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/column_header.tsx index 18ead2490dee3..7d203fab9e88f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/column_header.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/column_header.tsx @@ -19,9 +19,9 @@ import { getDraggableFieldId, } from '../../../../../common/components/drag_and_drop/helpers'; import { TimelineTabs } from '../../../../../../common/types/timeline'; +import { Direction } from '../../../../../../common/search_strategy'; import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; import { OnFilterChange } from '../../events'; -import { Direction } from '../../../../../graphql/types'; import { ARIA_COLUMN_INDEX_OFFSET } from '../../helpers'; import { EventsTh, EventsThContent, EventsHeadingHandle } from '../../styles'; import { Sort } from '../sort'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/helpers.ts index 85e1b52b5620b..b52fa292413df 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/helpers.ts @@ -5,8 +5,8 @@ * 2.0. */ +import { Direction } from '../../../../../../../common/search_strategy'; import { assertUnreachable } from '../../../../../../../common/utility_types'; -import { Direction } from '../../../../../../graphql/types'; import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; import { Sort, SortDirection } from '../../sort'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.test.tsx index bc4ba7fbf0ff5..b0198e60f3b9a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.test.tsx @@ -9,7 +9,6 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; import { timelineActions } from '../../../../../store/timeline'; -import { Direction } from '../../../../../../graphql/types'; import { TestProviders } from '../../../../../../common/mock'; import { ColumnHeaderType } from '../../../../../store/timeline/model'; import { Sort } from '../../sort'; @@ -18,6 +17,7 @@ import { defaultHeaders } from '../default_headers'; import { HeaderComponent } from '.'; import { getNewSortDirectionOnClick, getNextSortDirection, getSortDirection } from './helpers'; +import { Direction } from '../../../../../../../common/search_strategy'; const mockDispatch = jest.fn(); jest.mock('react-redux', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.test.tsx index c76027e5ef78e..e900458c65572 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/index.test.tsx @@ -11,7 +11,6 @@ import React from 'react'; import '../../../../../common/mock/match_media'; import { DEFAULT_ACTIONS_COLUMN_WIDTH } from '../constants'; import { defaultHeaders } from './default_headers'; -import { Direction } from '../../../../../graphql/types'; import { mockBrowserFields } from '../../../../../common/containers/source/mock'; import { Sort } from '../sort'; import { TestProviders } from '../../../../../common/mock/test_providers'; @@ -21,6 +20,7 @@ import { ColumnHeadersComponent } from '.'; import { cloneDeep } from 'lodash/fp'; import { timelineActions } from '../../../../store/timeline'; import { TimelineTabs } from '../../../../../../common/types/timeline'; +import { Direction } from '../../../../../../common/search_strategy'; const mockDispatch = jest.fn(); jest.mock('react-redux', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/index.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/index.ts index 67cda060e90e4..e7c69b9229d70 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/index.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Direction } from '../../../../../graphql/types'; +import { Direction } from '../../../../../../common/search_strategy'; import { ColumnId } from '../column_id'; /** Specifies a column's sort direction */ diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx index a08e47b5cadda..56f98a6795cd1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx @@ -7,8 +7,8 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; +import { Direction } from '../../../../../../common/search_strategy'; -import { Direction } from '../../../../../graphql/types'; import * as i18n from '../translations'; import { getDirection, SortIndicator } from './sort_indicator'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.tsx index c7d1a1f7b6957..6af29793f9373 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/sort/sort_indicator.tsx @@ -8,11 +8,11 @@ import { EuiIcon, EuiToolTip } from '@elastic/eui'; import React from 'react'; -import { Direction } from '../../../../../graphql/types'; import * as i18n from '../translations'; import { SortNumber } from './sort_number'; import { SortDirection } from '.'; +import { Direction } from '../../../../../../common/search_strategy'; enum SortDirectionIndicatorEnum { SORT_UP = 'sortUp', diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx index 2ea2a2e401c0f..0f781b0958d02 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/pinned_tab_content/index.test.tsx @@ -9,7 +9,6 @@ import { shallow } from 'enzyme'; import React from 'react'; import useResizeObserver from 'use-resize-observer/polyfilled'; -import { Direction } from '../../../../graphql/types'; import { DefaultCellRenderer } from '../cell_rendering/default_cell_renderer'; import { defaultHeaders, mockTimelineData } from '../../../../common/mock'; import '../../../../common/mock/match_media'; @@ -23,6 +22,7 @@ import { useTimelineEventsDetails } from '../../../containers/details/index'; import { useSourcererScope } from '../../../../common/containers/sourcerer'; import { mockSourcererScope } from '../../../../common/containers/sourcerer/mocks'; import { PinnedTabContentComponent, Props as PinnedTabContentComponentProps } from '.'; +import { Direction } from '../../../../../common/search_strategy'; jest.mock('../../../containers/index', () => ({ useTimelineEvents: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 4333f48bc2379..165de178768f2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -15,7 +15,6 @@ import { timelineActions, timelineSelectors } from '../../../../timelines/store/ import { useShallowEqualSelector } from '../../../../common/hooks/use_selector'; import * as i18n from './translations'; -import { TimelineInput } from '../../../store/timeline/actions'; import { useCreateTimelineButton } from './use_create_timeline'; import { timelineDefaults } from '../../../store/timeline/defaults'; @@ -25,8 +24,6 @@ const NotesCountBadge = (styled(EuiBadge)` NotesCountBadge.displayName = 'NotesCountBadge'; -export type SaveTimeline = (args: TimelineInput) => void; - interface AddToFavoritesButtonProps { timelineId: string; } diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.test.tsx index aa667c0a8466c..1cbf7587dd29b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/new_template_timeline.test.tsx @@ -11,7 +11,6 @@ import { Provider as ReduxStoreProvider } from 'react-redux'; import { mockGlobalState, - apolloClientObservable, SUB_PLUGINS_REDUCER, kibanaObservable, createSecuritySolutionStorageMock, @@ -29,13 +28,7 @@ jest.mock('../../../../common/lib/kibana', () => { describe('NewTemplateTimeline', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - const store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); const mockClosePopover = jest.fn(); const mockTitle = 'NEW_TIMELINE'; let wrapper: ReactWrapper; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx index ede473acbfb2a..acae8c8c53cd0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_tab_content/index.test.tsx @@ -9,7 +9,6 @@ import { shallow } from 'enzyme'; import React from 'react'; import useResizeObserver from 'use-resize-observer/polyfilled'; -import { Direction } from '../../../../graphql/types'; import { DefaultCellRenderer } from '../cell_rendering/default_cell_renderer'; import { defaultHeaders, mockTimelineData } from '../../../../common/mock'; import '../../../../common/mock/match_media'; @@ -25,6 +24,7 @@ import { useTimelineEvents } from '../../../containers/index'; import { useTimelineEventsDetails } from '../../../containers/details/index'; import { useSourcererScope } from '../../../../common/containers/sourcerer'; import { mockSourcererScope } from '../../../../common/containers/sourcerer/mocks'; +import { Direction } from '../../../../../common/search_strategy'; jest.mock('../../../containers/index', () => ({ useTimelineEvents: jest.fn(), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.test.tsx index 3bca1c743db09..44174009d0198 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.test.tsx @@ -9,9 +9,9 @@ import { EuiSelectableProps } from '@elastic/eui'; import React from 'react'; import { shallow, ShallowWrapper, mount } from 'enzyme'; -import { TimelineType } from '../../../../../common/types/timeline'; -import { SortFieldTimeline, Direction } from '../../../../graphql/types'; +import { SortFieldTimeline, TimelineType } from '../../../../../common/types/timeline'; import { SelectableTimeline, ORIGINAL_PAGE_SIZE } from './'; +import { Direction } from '../../../../../common/search_strategy'; const mockFetchAllTimeline = jest.fn(); jest.mock('../../../containers/all', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx index 7ccce80bbe9a4..5692081c5ed3e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx @@ -23,15 +23,16 @@ import styled from 'styled-components'; import { TimelineTypeLiteralWithNull, TimelineTypeLiteral, + SortFieldTimeline, } from '../../../../../common/types/timeline'; import { useGetAllTimeline } from '../../../containers/all'; -import { SortFieldTimeline, Direction } from '../../../../graphql/types'; import { isUntitled } from '../../open_timeline/helpers'; import * as i18nTimeline from '../../open_timeline/translations'; import { OpenTimelineResult } from '../../open_timeline/types'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; import * as i18n from '../translations'; +import { Direction } from '../../../../../common/search_strategy'; const MyEuiFlexItem = styled(EuiFlexItem)` display: inline-block; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts deleted file mode 100644 index 59d8ce381446a..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.gql_query.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const allTimelinesQuery = gql` - query GetAllTimeline( - $pageInfo: PageInfoTimeline! - $search: String - $sort: SortTimeline - $onlyUserFavorite: Boolean - $timelineType: TimelineType - $status: TimelineStatus - ) { - getAllTimeline( - pageInfo: $pageInfo - search: $search - sort: $sort - onlyUserFavorite: $onlyUserFavorite - timelineType: $timelineType - status: $status - ) { - totalCount - defaultTimelineCount - templateTimelineCount - elasticTemplateTimelineCount - customTemplateTimelineCount - favoriteCount - timeline { - savedObjectId - description - favorite { - fullName - userName - favoriteDate - } - eventIdToNoteIds { - eventId - note - timelineId - noteId - created - createdBy - timelineVersion - updated - updatedBy - version - } - excludedRowRendererIds - notes { - eventId - note - timelineId - timelineVersion - noteId - created - createdBy - updated - updatedBy - version - } - noteIds - pinnedEventIds - status - title - timelineType - templateTimelineId - templateTimelineVersion - created - createdBy - updated - updatedBy - version - } - } - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx index 82b41a95bd537..4ba6fa8b22cd7 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/all/index.tsx @@ -12,22 +12,19 @@ import { useDispatch } from 'react-redux'; import { OpenTimelineResult } from '../../components/open_timeline/types'; import { errorToToaster, useStateToaster } from '../../../common/components/toasters'; -import { - GetAllTimeline, - PageInfoTimeline, - SortTimeline, - TimelineResult, -} from '../../../graphql/types'; import { inputsActions } from '../../../common/store/inputs'; -import { useApolloClient } from '../../../common/utils/apollo_context'; -import { allTimelinesQuery } from './index.gql_query'; import * as i18n from '../../pages/translations'; import { TimelineType, TimelineTypeLiteralWithNull, TimelineStatusLiteralWithNull, + PageInfoTimeline, + TimelineResult, + SortTimeline, + GetAllTimelineVariables, } from '../../../../common/types/timeline'; +import { getAllTimelines } from '../api'; export interface AllTimelinesArgs { fetchAllTimeline: ({ @@ -100,7 +97,6 @@ export const getAllTimeline = memoizeOne( export const useGetAllTimeline = (): AllTimelinesArgs => { const dispatch = useDispatch(); - const apolloClient = useApolloClient(); const [, dispatchToaster] = useStateToaster(); const [allTimelines, setAllTimelines] = useState>({ loading: false, @@ -127,64 +123,49 @@ export const useGetAllTimeline = (): AllTimelinesArgs => { const fetchData = async () => { try { - if (apolloClient != null) { - setAllTimelines((prevState) => ({ - ...prevState, - loading: true, - })); + setAllTimelines((prevState) => ({ + ...prevState, + loading: true, + })); - const variables: GetAllTimeline.Variables = { - onlyUserFavorite, - pageInfo, - search, - sort, - status, - timelineType, - }; - const response = await apolloClient.query< - GetAllTimeline.Query, - GetAllTimeline.Variables - >({ - query: allTimelinesQuery, - fetchPolicy: 'network-only', - variables, - context: { - fetchOptions: { - abortSignal: abortCtrl.signal, - }, - }, - }); - const getAllTimelineResponse = response?.data?.getAllTimeline; - const totalCount = getAllTimelineResponse?.totalCount ?? 0; - const timelines = getAllTimelineResponse?.timeline ?? []; - const customTemplateTimelineCount = - getAllTimelineResponse?.customTemplateTimelineCount ?? 0; - const defaultTimelineCount = getAllTimelineResponse?.defaultTimelineCount ?? 0; - const elasticTemplateTimelineCount = - getAllTimelineResponse?.elasticTemplateTimelineCount ?? 0; - const templateTimelineCount = getAllTimelineResponse?.templateTimelineCount ?? 0; - const favoriteCount = getAllTimelineResponse?.favoriteCount ?? 0; - if (!didCancel) { - dispatch( - inputsActions.setQuery({ - inputId: 'global', - id: ALL_TIMELINE_QUERY_ID, - loading: false, - refetch: fetchData, - inspect: null, - }) - ); - setAllTimelines({ + const variables: GetAllTimelineVariables = { + onlyUserFavorite, + pageInfo, + search, + sort, + status, + timelineType, + }; + const getAllTimelineResponse = await getAllTimelines(variables, abortCtrl.signal); + const totalCount = getAllTimelineResponse?.totalCount ?? 0; + const timelines = getAllTimelineResponse?.timeline ?? []; + const customTemplateTimelineCount = + getAllTimelineResponse?.customTemplateTimelineCount ?? 0; + const defaultTimelineCount = getAllTimelineResponse?.defaultTimelineCount ?? 0; + const elasticTemplateTimelineCount = + getAllTimelineResponse?.elasticTemplateTimelineCount ?? 0; + const templateTimelineCount = getAllTimelineResponse?.templateTimelineCount ?? 0; + const favoriteCount = getAllTimelineResponse?.favoriteCount ?? 0; + if (!didCancel) { + dispatch( + inputsActions.setQuery({ + inputId: 'global', + id: ALL_TIMELINE_QUERY_ID, loading: false, - totalCount, - timelines: getAllTimeline(JSON.stringify(variables), timelines as TimelineResult[]), - customTemplateTimelineCount, - defaultTimelineCount, - elasticTemplateTimelineCount, - templateTimelineCount, - favoriteCount, - }); - } + refetch: fetchData, + inspect: null, + }) + ); + setAllTimelines({ + loading: false, + totalCount, + timelines: getAllTimeline(JSON.stringify(variables), timelines as TimelineResult[]), + customTemplateTimelineCount, + defaultTimelineCount, + elasticTemplateTimelineCount, + templateTimelineCount, + favoriteCount, + }); } } catch (error) { if (!didCancel) { @@ -212,7 +193,7 @@ export const useGetAllTimeline = (): AllTimelinesArgs => { abortCtrl.abort(); }; }, - [apolloClient, dispatch, dispatchToaster] + [dispatch, dispatchToaster] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index 01a85f6309c3f..a6c2126f95e8d 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -21,14 +21,23 @@ import { TimelineErrorResponse, ImportTimelineResultSchema, importTimelineResultSchema, + ResponseFavoriteTimeline, + AllTimelinesResponse, + SingleTimelineResponse, + allTimelinesResponse, + responseFavoriteTimeline, + GetTimelinesArgs, + SingleTimelineResponseType, + TimelineType, } from '../../../common/types/timeline'; -import { TimelineInput, TimelineType } from '../../graphql/types'; import { TIMELINE_URL, TIMELINE_DRAFT_URL, TIMELINE_IMPORT_URL, TIMELINE_EXPORT_URL, TIMELINE_PREPACKAGED_URL, + TIMELINES_URL, + TIMELINE_FAVORITE_URL, } from '../../../common/constants'; import { KibanaServices } from '../../common/lib/kibana'; @@ -39,6 +48,7 @@ import { ImportDataProps, ImportDataResponse, } from '../../detections/containers/detection_engine/rules'; +import { TimelineInput } from '../../../common/search_strategy'; interface RequestPostTimeline { timeline: TimelineInput; @@ -52,12 +62,24 @@ interface RequestPatchTimeline extends RequestPostTimeline { type RequestPersistTimeline = RequestPostTimeline & Partial>; -const decodeTimelineResponse = (respTimeline?: TimelineResponse) => +const decodeTimelineResponse = (respTimeline?: TimelineResponse | TimelineErrorResponse) => pipe( TimelineResponseType.decode(respTimeline), fold(throwErrors(createToasterPlainError), identity) ); +const decodeSingleTimelineResponse = (respTimeline?: SingleTimelineResponse) => + pipe( + SingleTimelineResponseType.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const decodeAllTimelinesResponse = (respTimeline: AllTimelinesResponse) => + pipe( + allTimelinesResponse.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + const decodeTimelineErrorResponse = (respTimeline?: TimelineErrorResponse) => pipe( TimelineErrorResponseType.decode(respTimeline), @@ -70,10 +92,25 @@ const decodePrepackedTimelineResponse = (respTimeline?: ImportTimelineResultSche fold(throwErrors(createToasterPlainError), identity) ); -const postTimeline = async ({ timeline }: RequestPostTimeline): Promise => { +const decodeResponseFavoriteTimeline = (respTimeline?: ResponseFavoriteTimeline) => + pipe( + responseFavoriteTimeline.decode(respTimeline), + fold(throwErrors(createToasterPlainError), identity) + ); + +const postTimeline = async ({ + timeline, +}: RequestPostTimeline): Promise => { + let requestBody; + try { + requestBody = JSON.stringify({ timeline }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.post(TIMELINE_URL, { method: 'POST', - body: JSON.stringify({ timeline }), + body: requestBody, }); return decodeTimelineResponse(response); @@ -85,10 +122,16 @@ const patchTimeline = async ({ version, }: RequestPatchTimeline): Promise => { let response = null; + let requestBody = null; + try { + requestBody = JSON.stringify({ timeline, timelineId, version }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } try { response = await KibanaServices.get().http.patch(TIMELINE_URL, { method: 'PATCH', - body: JSON.stringify({ timeline, timelineId, version }), + body: requestBody, }); } catch (err) { // For Future developer @@ -106,12 +149,13 @@ export const persistTimeline = async ({ }: RequestPersistTimeline): Promise => { try { if (isEmpty(timelineId) && timeline.status === TimelineStatus.draft && timeline) { - const draftTimeline = await cleanDraftTimeline({ + const temp: TimelineResponse | TimelineErrorResponse = await cleanDraftTimeline({ timelineType: timeline.timelineType!, templateTimelineId: timeline.templateTimelineId ?? undefined, templateTimelineVersion: timeline.templateTimelineVersion ?? undefined, }); + const draftTimeline = decodeTimelineResponse(temp); const templateTimelineInfo = timeline.timelineType! === TimelineType.template ? { @@ -182,11 +226,16 @@ export const exportSelectedTimeline: ExportSelectedData = ({ filename = `timelines_export.ndjson`, ids = [], signal, -}): Promise => { - const body = ids.length > 0 ? JSON.stringify({ ids }) : undefined; +}): Promise => { + let requestBody; + try { + requestBody = ids.length > 0 ? JSON.stringify({ ids }) : undefined; + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } return KibanaServices.get().http.fetch(`${TIMELINE_EXPORT_URL}`, { method: 'POST', - body, + body: requestBody, query: { file_name: filename, }, @@ -216,7 +265,8 @@ export const cleanDraftTimeline = async ({ timelineType: TimelineType; templateTimelineId?: string; templateTimelineVersion?: number; -}): Promise => { +}): Promise => { + let requestBody; const templateTimelineInfo = timelineType === TimelineType.template ? { @@ -224,11 +274,16 @@ export const cleanDraftTimeline = async ({ templateTimelineVersion, } : {}; - const response = await KibanaServices.get().http.post(TIMELINE_DRAFT_URL, { - body: JSON.stringify({ + try { + requestBody = JSON.stringify({ timelineType, ...templateTimelineInfo, - }), + }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.post(TIMELINE_DRAFT_URL, { + body: requestBody, }); return decodeTimelineResponse(response); @@ -242,3 +297,94 @@ export const installPrepackedTimelines = async (): Promise { + const response = await KibanaServices.get().http.get(TIMELINE_URL, { + query: { + id, + }, + }); + + return decodeSingleTimelineResponse(response); +}; + +export const getTimelineTemplate = async (templateTimelineId: string) => { + const response = await KibanaServices.get().http.get(TIMELINE_URL, { + query: { + template_timeline_id: templateTimelineId, + }, + }); + + return decodeSingleTimelineResponse(response); +}; + +export const getAllTimelines = async (args: GetTimelinesArgs, abortSignal: AbortSignal) => { + const response = await KibanaServices.get().http.fetch(TIMELINES_URL, { + method: 'GET', + query: { + ...(args.onlyUserFavorite ? { only_user_favorite: args.onlyUserFavorite } : {}), + ...(args?.pageInfo?.pageSize ? { page_size: args.pageInfo.pageSize } : {}), + ...(args?.pageInfo?.pageIndex ? { page_index: args.pageInfo.pageIndex } : {}), + ...(args.search ? { search: args.search } : {}), + ...(args?.sort?.sortField ? { sort_field: args?.sort?.sortField } : {}), + ...(args?.sort?.sortOrder ? { sort_order: args?.sort?.sortOrder } : {}), + ...(args.status ? { status: args.status } : {}), + ...(args.timelineType ? { timeline_type: args.timelineType } : {}), + }, + signal: abortSignal, + }); + + return decodeAllTimelinesResponse(response); +}; + +export const persistFavorite = async ({ + timelineId, + templateTimelineId, + templateTimelineVersion, + timelineType, +}: { + timelineId?: string | null; + templateTimelineId?: string | null; + templateTimelineVersion?: number | null; + timelineType: TimelineType; +}) => { + let requestBody; + + try { + requestBody = JSON.stringify({ + timelineId, + templateTimelineId, + templateTimelineVersion, + timelineType, + }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + + const response = await KibanaServices.get().http.patch( + TIMELINE_FAVORITE_URL, + { + method: 'PATCH', + body: requestBody, + } + ); + + return decodeResponseFavoriteTimeline(response); +}; + +export const deleteTimelinesByIds = async (savedObjectIds: string[]) => { + let requestBody; + + try { + requestBody = JSON.stringify({ + savedObjectIds, + }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.delete(TIMELINE_URL, { + method: 'DELETE', + body: requestBody, + }); + return response; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/delete/persist.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/delete/persist.gql_query.ts deleted file mode 100644 index 8312988d61e33..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/delete/persist.gql_query.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const deleteTimelineMutation = gql` - mutation DeleteTimelineMutation($id: [ID!]!) { - deleteTimeline(id: $id) - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/favorite/persist.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/favorite/persist.gql_query.ts deleted file mode 100644 index f0e31b43af038..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/favorite/persist.gql_query.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const persistTimelineFavoriteMutation = gql` - mutation PersistTimelineFavoriteMutation( - $timelineId: ID - $templateTimelineId: String - $templateTimelineVersion: Int - $timelineType: TimelineType! - ) { - persistFavorite( - timelineId: $timelineId - templateTimelineId: $templateTimelineId - templateTimelineVersion: $templateTimelineVersion - timelineType: $timelineType - ) { - savedObjectId - version - favorite { - fullName - userName - favoriteDate - } - templateTimelineId - templateTimelineVersion - timelineType - } - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx index 5f464b5ed943f..83b511f95bc2a 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx @@ -16,7 +16,6 @@ import { isCompleteResponse, isErrorResponse } from '../../../../../../src/plugi import { inputsModel, KueryFilterQueryKind } from '../../common/store'; import { useKibana } from '../../common/lib/kibana'; import { createFilter } from '../../common/containers/helpers'; -import { DocValueFields } from '../../common/containers/query_template'; import { timelineActions } from '../../timelines/store/timeline'; import { detectionsTimelineIds, skipQueryForDetectionsPage } from './helpers'; import { getInspectResponse } from '../../helpers'; @@ -29,6 +28,7 @@ import { TimelineEdges, TimelineItem, TimelineRequestSortField, + DocValueFields, } from '../../../common/search_strategy'; import { InspectResponse } from '../../types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/notes/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/notes/api.ts new file mode 100644 index 0000000000000..53c54f915cb8a --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/notes/api.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { NOTE_URL } from '../../../../common/constants'; +import { NoteSavedObject, SavedNote } from '../../../../common/types/timeline/note'; +import { KibanaServices } from '../../../common/lib/kibana'; + +export const persistNote = async ({ + note, + noteId, + version, + overrideOwner, +}: { + note: SavedNote; + noteId?: string | null; + version?: string | null; + overrideOwner?: boolean; +}) => { + let requestBody; + + try { + requestBody = JSON.stringify({ noteId, version, note, overrideOwner }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.patch(NOTE_URL, { + method: 'PATCH', + body: requestBody, + }); + return response; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/notes/persist.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/notes/persist.gql_query.ts deleted file mode 100644 index 5fa0d213cbd89..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/notes/persist.gql_query.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const persistTimelineNoteMutation = gql` - mutation PersistTimelineNoteMutation($noteId: ID, $version: String, $note: NoteInput!) { - persistNote(noteId: $noteId, version: $version, note: $note) { - code - message - note { - eventId - note - timelineId - timelineVersion - noteId - created - createdBy - updated - updatedBy - version - } - } - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/one/index.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/one/index.gql_query.ts deleted file mode 100644 index 97bae5717c7d6..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/one/index.gql_query.ts +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const oneTimelineQuery = gql` - query GetOneTimeline($id: ID!, $timelineType: TimelineType) { - getOneTimeline(id: $id, timelineType: $timelineType) { - savedObjectId - columns { - aggregatable - category - columnHeaderType - description - example - indexes - id - name - searchable - type - } - dataProviders { - id - name - enabled - excluded - kqlQuery - type - queryMatch { - field - displayField - value - displayValue - operator - } - and { - id - name - enabled - excluded - kqlQuery - type - queryMatch { - field - displayField - value - displayValue - operator - } - } - } - dateRange { - start - end - } - description - eqlOptions { - eventCategoryField - tiebreakerField - timestampField - query - size - } - eventType - eventIdToNoteIds { - eventId - note - timelineId - noteId - created - createdBy - timelineVersion - updated - updatedBy - version - } - excludedRowRendererIds - favorite { - fullName - userName - favoriteDate - } - filters { - meta { - alias - controlledBy - disabled - field - formattedValue - index - key - negate - params - type - value - } - query - exists - match_all - missing - range - script - } - kqlMode - kqlQuery { - filterQuery { - kuery { - kind - expression - } - serializedQuery - } - } - indexNames - notes { - eventId - note - timelineId - timelineVersion - noteId - created - createdBy - updated - updatedBy - version - } - noteIds - pinnedEventIds - pinnedEventsSaveObject { - pinnedEventId - eventId - timelineId - created - createdBy - updated - updatedBy - version - } - status - title - timelineType - templateTimelineId - templateTimelineVersion - savedQueryId - sort - created - createdBy - updated - updatedBy - version - } - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/persist.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/persist.gql_query.ts deleted file mode 100644 index ef050d806a9f2..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/persist.gql_query.ts +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const persistTimelineMutation = gql` - mutation PersistTimelineMutation($timelineId: ID, $version: String, $timeline: TimelineInput!) { - persistTimeline(id: $timelineId, version: $version, timeline: $timeline) { - code - message - timeline { - savedObjectId - version - columns { - aggregatable - category - columnHeaderType - description - example - indexes - id - name - searchable - type - } - dataProviders { - id - name - enabled - excluded - kqlQuery - type - queryMatch { - field - displayField - value - displayValue - operator - } - and { - id - name - enabled - excluded - kqlQuery - type - queryMatch { - field - displayField - value - displayValue - operator - } - } - } - description - eventType - excludedRowRendererIds - favorite { - fullName - userName - favoriteDate - } - filters { - meta { - alias - controlledBy - disabled - field - formattedValue - index - key - negate - params - type - value - } - query - exists - match_all - missing - range - script - } - kqlMode - kqlQuery { - filterQuery { - kuery { - kind - expression - } - serializedQuery - } - } - indexNames - title - dateRange { - start - end - } - savedQueryId - sort - created - createdBy - updated - updatedBy - } - } - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts new file mode 100644 index 0000000000000..c43a16df09062 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { PINNED_EVENT_URL } from '../../../../common/constants'; +import { PinnedEvent } from '../../../../common/types/timeline/pinned_event'; +import { KibanaServices } from '../../../common/lib/kibana'; + +export const persistPinnedEvent = async ({ + eventId, + pinnedEventId, + timelineId, +}: { + eventId: string; + pinnedEventId?: string | null; + timelineId?: string | null; +}) => { + let requestBody; + try { + requestBody = JSON.stringify({ eventId, pinnedEventId, timelineId }); + } catch (err) { + return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); + } + const response = await KibanaServices.get().http.patch(PINNED_EVENT_URL, { + method: 'PATCH', + body: requestBody, + }); + return response; +}; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/persist.gql_query.ts b/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/persist.gql_query.ts deleted file mode 100644 index 5ac2e367a7ab4..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/persist.gql_query.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const persistTimelinePinnedEventMutation = gql` - mutation PersistTimelinePinnedEventMutation($pinnedEventId: ID, $eventId: ID!, $timelineId: ID) { - persistPinnedEventOnTimeline( - pinnedEventId: $pinnedEventId - eventId: $eventId - timelineId: $timelineId - ) { - pinnedEventId - eventId - timelineId - timelineVersion - created - createdBy - updated - updatedBy - version - } - } -`; diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/defaults.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/defaults.ts index df79ff1d2b309..7e76f6035f8b5 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/defaults.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/defaults.ts @@ -7,10 +7,10 @@ import { TimelineType, TimelineStatus, TimelineTabs } from '../../../../common/types/timeline'; -import { Direction } from '../../../graphql/types'; import { defaultHeaders } from '../../components/timeline/body/column_headers/default_headers'; import { normalizeTimeRange } from '../../../common/components/url_state/normalize_time_range'; import { SubsetTimelineModel, TimelineModel } from './model'; +import { Direction } from '../../../../common/search_strategy'; // normalizeTimeRange uses getTimeRangeSettings which cannot be used outside Kibana context if the uiSettings is not false const { from: start, to: end } = normalizeTimeRange({ from: '', to: '' }, false); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.test.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.test.ts index 0bc1c5d57fa33..c8e8e00caf530 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.test.ts @@ -6,8 +6,8 @@ */ import { Filter, esFilters } from '../../../../../../../src/plugins/data/public'; +import { Direction } from '../../../../common/search_strategy'; import { TimelineType, TimelineStatus, TimelineTabs } from '../../../../common/types/timeline'; -import { Direction } from '../../../graphql/types'; import { convertTimelineAsInput } from './epic'; import { TimelineModel } from './model'; diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts index ac510401fc186..30d09da2f736d 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts @@ -35,14 +35,14 @@ import { Filter, MatchAllFilter, } from '../../../../../../.../../../src/plugins/data/public'; -import { TimelineStatus, TimelineErrorResponse } from '../../../../common/types/timeline'; -import { inputsModel } from '../../../common/store/inputs'; import { + TimelineStatus, + TimelineErrorResponse, TimelineType, - TimelineInput, ResponseTimeline, TimelineResult, -} from '../../../graphql/types'; +} from '../../../../common/types/timeline'; +import { inputsModel } from '../../../common/store/inputs'; import { addError } from '../../../common/store/app/actions'; import { persistTimeline } from '../../containers/api'; @@ -89,6 +89,7 @@ import { isNotNull } from './helpers'; import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; import { myEpicTimelineId } from './my_epic_timeline_id'; import { ActionTimeline, TimelineEpicDependencies } from './types'; +import { TimelineInput } from '../../../../common/search_strategy'; const timelineActionsType = [ applyKqlFilterQuery.type, @@ -133,7 +134,6 @@ export const createTimelineEpic = (): Epic< selectNotesByIdSelector, timelineByIdSelector, timelineTimeRangeSelector, - apolloClient$, kibana$, } ) => { @@ -195,8 +195,8 @@ export const createTimelineEpic = (): Epic< ), dispatcherTimelinePersistQueue.pipe( delay(500), - withLatestFrom(timeline$, apolloClient$, notes$, timelineTimeRange$), - concatMap(([objAction, timeline, apolloClient, notes, timelineTimeRange]) => { + withLatestFrom(timeline$, notes$, timelineTimeRange$), + concatMap(([objAction, timeline, notes, timelineTimeRange]) => { const action: ActionTimeline = get('action', objAction); const timelineId = myEpicTimelineId.getTimelineId(); const version = myEpicTimelineId.getTimelineVersion(); @@ -205,7 +205,6 @@ export const createTimelineEpic = (): Epic< if (timelineNoteActionsType.includes(action.type)) { return epicPersistNote( - apolloClient, action, timeline, notes, @@ -215,17 +214,9 @@ export const createTimelineEpic = (): Epic< allTimelineQuery$ ); } else if (timelinePinnedEventActionsType.includes(action.type)) { - return epicPersistPinnedEvent( - apolloClient, - action, - timeline, - action$, - timeline$, - allTimelineQuery$ - ); + return epicPersistPinnedEvent(action, timeline, action$, timeline$, allTimelineQuery$); } else if (timelineFavoriteActionsType.includes(action.type)) { return epicPersistTimelineFavorite( - apolloClient, action, timeline, action$, diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_favorite.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_favorite.ts index 0e1ebf6b246e2..ae314f54715cd 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_favorite.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_favorite.ts @@ -5,16 +5,12 @@ * 2.0. */ -import { NormalizedCacheObject } from 'apollo-cache-inmemory'; -import { ApolloClient } from 'apollo-client'; import { get } from 'lodash/fp'; import { Action } from 'redux'; import { Epic } from 'redux-observable'; import { from, Observable, empty } from 'rxjs'; import { filter, mergeMap, withLatestFrom, startWith, takeUntil } from 'rxjs/operators'; -import { persistTimelineFavoriteMutation } from '../../containers/favorite/persist.gql_query'; -import { PersistTimelineFavoriteMutation, ResponseFavoriteTimeline } from '../../../graphql/types'; import { addError } from '../../../common/store/app/actions'; import { endTimelineSaving, @@ -24,16 +20,15 @@ import { showCallOutUnauthorizedMsg, } from './actions'; import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; -import { refetchQueries } from './refetch_queries'; import { myEpicTimelineId } from './my_epic_timeline_id'; import { ActionTimeline, TimelineById } from './types'; import { inputsModel } from '../../../common/store/inputs'; -import { TimelineType } from '../../../../common/types/timeline'; +import { ResponseFavoriteTimeline, TimelineType } from '../../../../common/types/timeline'; +import { persistFavorite } from '../../containers/api'; export const timelineFavoriteActionsType = [updateIsFavorite.type]; export const epicPersistTimelineFavorite = ( - apolloClient: ApolloClient, action: ActionTimeline, timeline: TimelineById, action$: Observable, @@ -42,19 +37,11 @@ export const epicPersistTimelineFavorite = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Observable => from( - apolloClient.mutate< - PersistTimelineFavoriteMutation.Mutation, - PersistTimelineFavoriteMutation.Variables - >({ - mutation: persistTimelineFavoriteMutation, - fetchPolicy: 'no-cache', - variables: { - timelineId: myEpicTimelineId.getTimelineId(), - templateTimelineId: timeline[action.payload.id].templateTimelineId, - templateTimelineVersion: timeline[action.payload.id].templateTimelineVersion, - timelineType: timeline[action.payload.id].timelineType ?? TimelineType.default, - }, - refetchQueries, + persistFavorite({ + timelineId: myEpicTimelineId.getTimelineId(), + templateTimelineId: timeline[action.payload.id].templateTimelineId, + templateTimelineVersion: timeline[action.payload.id].templateTimelineVersion, + timelineType: timeline[action.payload.id].timelineType ?? TimelineType.default, }) ).pipe( withLatestFrom(timeline$, allTimelineQuery$), diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_local_storage.test.tsx b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_local_storage.test.tsx index 0b70ba8991686..01bc589393d2e 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_local_storage.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_local_storage.test.tsx @@ -14,7 +14,6 @@ import '../../../common/mock/match_media'; import { mockGlobalState, SUB_PLUGINS_REDUCER, - apolloClientObservable, TestProviders, defaultHeaders, createSecuritySolutionStorageMock, @@ -38,11 +37,11 @@ import { import { defaultRowRenderers } from '../../components/timeline/body/renderers'; import { mockDataProviders } from '../../components/timeline/data_providers/mock/mock_data_providers'; import { Sort } from '../../components/timeline/body/sort'; -import { Direction } from '../../../graphql/types'; import { addTimelineInStorage } from '../../containers/local_storage'; import { isPageTimeline } from './epic_local_storage'; import { TimelineId, TimelineStatus, TimelineTabs } from '../../../../common/types/timeline'; +import { Direction } from '../../../../common/search_strategy'; jest.mock('../../containers/local_storage'); @@ -51,13 +50,7 @@ const addTimelineInStorageMock = addTimelineInStorage as jest.Mock; describe('epicLocalStorage', () => { const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); - let store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); let props = {} as QueryTabContentComponentProps; const sort: Sort[] = [ @@ -71,13 +64,7 @@ describe('epicLocalStorage', () => { const endDate = '2018-03-24T03:33:52.253Z'; beforeEach(() => { - store = createStore( - state, - SUB_PLUGINS_REDUCER, - apolloClientObservable, - kibanaObservable, - storage - ); + store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); props = { columns: defaultHeaders, dataProviders: mockDataProviders, diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_note.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_note.ts index a2d64deb4c66c..974bd9d998c0a 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_note.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_note.ts @@ -5,16 +5,12 @@ * 2.0. */ -import { ApolloClient } from 'apollo-client'; -import { NormalizedCacheObject } from 'apollo-cache-inmemory'; import { get } from 'lodash/fp'; import { Action } from 'redux'; import { Epic } from 'redux-observable'; import { from, empty, Observable } from 'rxjs'; import { filter, mergeMap, switchMap, withLatestFrom, startWith, takeUntil } from 'rxjs/operators'; -import { persistTimelineNoteMutation } from '../../../timelines/containers/notes/persist.gql_query'; -import { PersistTimelineNoteMutation, ResponseNote } from '../../../graphql/types'; import { updateNote, addError } from '../../../common/store/app/actions'; import { NotesById } from '../../../common/store/app/model'; import { inputsModel } from '../../../common/store/inputs'; @@ -28,14 +24,14 @@ import { showCallOutUnauthorizedMsg, } from './actions'; import { myEpicTimelineId } from './my_epic_timeline_id'; -import { refetchQueries } from './refetch_queries'; import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; import { ActionTimeline, TimelineById } from './types'; +import { persistNote } from '../../containers/notes/api'; +import { ResponseNote } from '../../../../common/types/timeline/note'; export const timelineNoteActionsType = [addNote.type, addNoteToEvent.type]; export const epicPersistNote = ( - apolloClient: ApolloClient, action: ActionTimeline, timeline: TimelineById, notes: NotesById, @@ -46,22 +42,14 @@ export const epicPersistNote = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Observable => from( - apolloClient.mutate< - PersistTimelineNoteMutation.Mutation, - PersistTimelineNoteMutation.Variables - >({ - mutation: persistTimelineNoteMutation, - fetchPolicy: 'no-cache', - variables: { - noteId: null, - version: null, - note: { - eventId: action.payload.eventId, - note: getNote(action.payload.noteId, notes), - timelineId: myEpicTimelineId.getTimelineId(), - }, + persistNote({ + noteId: null, + version: null, + note: { + eventId: action.payload.eventId, + note: getNote(action.payload.noteId, notes), + timelineId: myEpicTimelineId.getTimelineId(), }, - refetchQueries, }) ).pipe( withLatestFrom(timeline$, notes$, allTimelineQuery$), diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_pinned_event.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_pinned_event.ts index bd5cf879d47ef..c6c348615af27 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_pinned_event.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/epic_pinned_event.ts @@ -5,19 +5,15 @@ * 2.0. */ -import { NormalizedCacheObject } from 'apollo-cache-inmemory'; -import { ApolloClient } from 'apollo-client'; import { get, omit } from 'lodash/fp'; import { Action } from 'redux'; import { Epic } from 'redux-observable'; import { from, Observable, empty } from 'rxjs'; import { filter, mergeMap, startWith, withLatestFrom, takeUntil } from 'rxjs/operators'; -import { persistTimelinePinnedEventMutation } from '../../../timelines/containers/pinned_event/persist.gql_query'; -import { PersistTimelinePinnedEventMutation, PinnedEvent } from '../../../graphql/types'; import { addError } from '../../../common/store/app/actions'; import { inputsModel } from '../../../common/store/inputs'; - +import { PinnedEvent } from '../../../../common/types/timeline/pinned_event'; import { pinEvent, endTimelineSaving, @@ -27,14 +23,13 @@ import { showCallOutUnauthorizedMsg, } from './actions'; import { myEpicTimelineId } from './my_epic_timeline_id'; -import { refetchQueries } from './refetch_queries'; import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; import { ActionTimeline, TimelineById } from './types'; +import { persistPinnedEvent } from '../../containers/pinned_event/api'; export const timelinePinnedEventActionsType = [pinEvent.type, unPinEvent.type]; export const epicPersistPinnedEvent = ( - apolloClient: ApolloClient, action: ActionTimeline, timeline: TimelineById, action$: Observable, @@ -43,22 +38,13 @@ export const epicPersistPinnedEvent = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Observable => from( - apolloClient.mutate< - PersistTimelinePinnedEventMutation.Mutation, - PersistTimelinePinnedEventMutation.Variables - >({ - mutation: persistTimelinePinnedEventMutation, - fetchPolicy: 'no-cache', - variables: { - pinnedEventId: - timeline[action.payload.id].pinnedEventsSaveObject[action.payload.eventId] != null - ? timeline[action.payload.id].pinnedEventsSaveObject[action.payload.eventId] - .pinnedEventId - : null, - eventId: action.payload.eventId, - timelineId: myEpicTimelineId.getTimelineId(), - }, - refetchQueries, + persistPinnedEvent({ + pinnedEventId: + timeline[action.payload.id].pinnedEventsSaveObject[action.payload.eventId] != null + ? timeline[action.payload.id].pinnedEventsSaveObject[action.payload.eventId].pinnedEventId + : null, + eventId: action.payload.eventId, + timelineId: myEpicTimelineId.getTimelineId(), }) ).pipe( withLatestFrom(timeline$, allTimelineQuery$), diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/model.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/model.ts index a899994ad4aab..faece61cf9b7e 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/model.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/model.ts @@ -9,7 +9,6 @@ import { Filter, IFieldSubType } from '../../../../../../../src/plugins/data/pub import { DataProvider } from '../../components/timeline/data_providers/data_provider'; import { Sort } from '../../components/timeline/body/sort'; -import { PinnedEvent } from '../../../graphql/types'; import { EqlOptionsSelected, TimelineNonEcsData, @@ -23,6 +22,7 @@ import type { RowRendererId, TimelineTabs, } from '../../../../common/types/timeline'; +import { PinnedEvent } from '../../../../common/types/timeline/pinned_event'; export const DEFAULT_PAGE_COUNT = 2; // Eui Pager will not render unless this is a minimum of 2 pages export type KqlMode = 'filter' | 'search'; diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts index e464637c469f8..d467747346b8b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.test.ts @@ -22,7 +22,6 @@ import { import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH } from '../../../timelines/components/timeline/body/constants'; import { getColumnWidthFromType } from '../../../timelines/components/timeline/body/column_headers/helpers'; -import { Direction } from '../../../graphql/types'; import { defaultHeaders } from '../../../common/mock'; import { @@ -49,6 +48,7 @@ import { import { ColumnHeaderOptions, TimelineModel } from './model'; import { timelineDefaults } from './defaults'; import { TimelineById } from './types'; +import { Direction } from '../../../../common/search_strategy'; jest.mock('../../../common/components/url_state/normalize_time_range.ts'); jest.mock('../../../common/utils/default_date_settings', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/refetch_queries.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/refetch_queries.ts deleted file mode 100644 index 962b809caf884..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/refetch_queries.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { allTimelinesQuery } from '../../../timelines/containers/all/index.gql_query'; -import { Direction } from '../../../graphql/types'; -import { DEFAULT_SORT_FIELD } from '../../../timelines/components/open_timeline/constants'; - -export const refetchQueries = [ - { - query: allTimelinesQuery, - variables: { - search: '', - pageInfo: { - pageIndex: 1, - pageSize: 10, - }, - sort: { sortField: DEFAULT_SORT_FIELD, sortOrder: Direction.desc }, - onlyUserFavorite: false, - }, - }, -]; diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts index d227c496610c3..d4a96d036bd5f 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts @@ -9,7 +9,6 @@ import { Action } from 'redux'; import { Observable } from 'rxjs'; import { Storage } from '../../../../../../../src/plugins/kibana_utils/public'; -import { AppApolloClient } from '../../../common/lib/lib'; import { inputsModel } from '../../../common/store/inputs'; import { NotesById } from '../../../common/store/app/model'; @@ -56,7 +55,6 @@ export interface TimelineEpicDependencies { timelineTimeRangeSelector: (state: State) => inputsModel.TimeRange; selectAllTimelineQuery: () => (state: State, id: string) => inputsModel.GlobalQuery; selectNotesByIdSelector: (state: State) => NotesById; - apolloClient$: Observable; kibana$: Observable; storage: Storage; } diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index e88077679e1b6..7b9cd2f6e1db5 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { AppFrontendLibs } from './common/lib/lib'; import { CoreStart } from '../../../../src/core/public'; import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; @@ -71,7 +70,7 @@ export interface PluginSetup { // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PluginStart {} -export interface AppObservableLibs extends AppFrontendLibs { +export interface AppObservableLibs { kibana: CoreStart; } diff --git a/x-pack/plugins/security_solution/scripts/combined_schema.ts b/x-pack/plugins/security_solution/scripts/combined_schema.ts deleted file mode 100644 index d6b401f58c853..0000000000000 --- a/x-pack/plugins/security_solution/scripts/combined_schema.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { buildSchemaFromTypeDefinitions } from 'graphql-tools'; - -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { schemas as serverSchemas } from '../server/graphql'; - -export const schemas = [...serverSchemas]; - -// this default export is used to feed the combined types to the gql-gen tool -// which generates the corresponding typescript types -// eslint-disable-next-line import/no-default-export -export default buildSchemaFromTypeDefinitions(schemas); diff --git a/x-pack/plugins/security_solution/scripts/generate_types_from_graphql.js b/x-pack/plugins/security_solution/scripts/generate_types_from_graphql.js deleted file mode 100644 index 3d371333eea8e..0000000000000 --- a/x-pack/plugins/security_solution/scripts/generate_types_from_graphql.js +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -require('../../../../src/setup_node_env'); - -const { join, resolve } = require('path'); -// eslint-disable-next-line import/no-extraneous-dependencies, import/no-unresolved -const { generate } = require('graphql-code-generator'); - -const GRAPHQL_GLOBS = [ - join('public', '**', '*.gql_query.ts{,x}'), - join('common', 'graphql', '**', '*.gql_query.ts{,x}'), -]; -const OUTPUT_INTROSPECTION_PATH = resolve('public', 'graphql', 'introspection.json'); -const OUTPUT_CLIENT_TYPES_PATH = resolve('public', 'graphql', 'types.ts'); -const OUTPUT_SERVER_TYPES_PATH = resolve('server', 'graphql', 'types.ts'); -const SCHEMA_PATH = resolve(__dirname, 'combined_schema.ts'); - -async function main() { - await generate( - { - schema: SCHEMA_PATH, - overwrite: true, - generates: { - [OUTPUT_INTROSPECTION_PATH]: { - documents: GRAPHQL_GLOBS, - primitives: { - String: 'string', - Int: 'number', - Float: 'number', - Boolean: 'boolean', - ID: 'string', - }, - config: { - namingConvention: { - typeNames: 'change-case#pascalCase', - enumValues: 'keep', - }, - contextType: 'SiemContext', - scalars: { - ToStringArray: 'string[] | string', - ToNumberArray: 'number[] | number', - ToDateArray: 'string[] | string', - ToBooleanArray: 'boolean[] | boolean', - Date: 'string', - }, - }, - plugins: ['introspection'], - }, - [OUTPUT_CLIENT_TYPES_PATH]: { - documents: GRAPHQL_GLOBS, - primitives: { - String: 'string', - Int: 'number', - Float: 'number', - Boolean: 'boolean', - ID: 'string', - }, - config: { - avoidOptionals: false, - namingConvention: { - typeNames: 'change-case#pascalCase', - enumValues: 'keep', - }, - contextType: 'SiemContext', - scalars: { - ToStringArray: 'string[]', - ToNumberArray: 'number[]', - ToDateArray: 'string[]', - ToBooleanArray: 'boolean[]', - Date: 'string', - }, - }, - plugins: [ - { - add: `/* tslint:disable */ - /* eslint-disable */ - /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - `, - }, - 'typescript-common', - 'typescript-server', - 'typescript-client', - ], - }, - [OUTPUT_SERVER_TYPES_PATH]: { - primitives: { - String: 'string', - Int: 'number', - Float: 'number', - Boolean: 'boolean', - ID: 'string', - }, - config: { - avoidOptionals: false, - namingConvention: { - typeNames: 'change-case#pascalCase', - enumValues: 'keep', - }, - contextType: 'SiemContext', - scalars: { - ToStringArray: 'string[] | string', - ToNumberArray: 'number[] | number', - ToDateArray: 'string[] | string', - ToBooleanArray: 'boolean[] | boolean', - Date: 'string', - }, - }, - plugins: [ - { - add: ` - /* tslint:disable */ - /* eslint-disable */ - /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - - import { SiemContext } from '../lib/types'; - `, - }, - 'typescript-common', - 'typescript-server', - 'typescript-resolvers', - ], - }, - }, - }, - true - ); -} - -if (require.main === module) { - main(); -} diff --git a/x-pack/plugins/security_solution/server/graphql/ecs/index.ts b/x-pack/plugins/security_solution/server/graphql/ecs/index.ts deleted file mode 100644 index 2c534d979a925..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/ecs/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { ecsSchema } from './schema.gql'; -export { createScalarToStringArrayValueResolvers } from './resolvers'; diff --git a/x-pack/plugins/security_solution/server/graphql/ecs/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/ecs/resolvers.ts deleted file mode 100644 index de9daf1178ad2..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/ecs/resolvers.ts +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLScalarType, Kind } from 'graphql'; -import { isBoolean, isNumber, isObject } from 'lodash/fp'; - -/* - * serialize: gets invoked when serializing the result to send it back to a client. - * - * parseValue: gets invoked to parse client input that was passed through variables. - * - * parseLiteral: gets invoked to parse client input that was passed inline in the query. - */ - -export const toStringArrayScalar = new GraphQLScalarType({ - name: 'StringArray', - description: 'Represents value in detail item from the timeline who wants to more than one type', - serialize(value): string[] | null { - if (value == null) { - return null; - } else if (Array.isArray(value)) { - return convertArrayToString(value) as string[]; - } else if (isBoolean(value) || isNumber(value) || isObject(value)) { - return [convertToString(value)]; - } - return [value]; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.INT: - return parseInt(ast.value, 10); - case Kind.FLOAT: - return parseFloat(ast.value); - case Kind.STRING: - return ast.value; - case Kind.LIST: - return ast.values; - case Kind.OBJECT: - return ast.fields; - } - return null; - }, -}); -export const toStringArrayNoNullableScalar = new GraphQLScalarType({ - name: 'StringArray', - description: 'Represents value in detail item from the timeline who wants to more than one type', - serialize(value): string[] | undefined { - if (value == null) { - return undefined; - } else if (Array.isArray(value)) { - return convertArrayToString(value) as string[]; - } else if (isBoolean(value) || isNumber(value) || isObject(value)) { - return [convertToString(value)]; - } - return [value]; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.INT: - return parseInt(ast.value, 10); - case Kind.FLOAT: - return parseFloat(ast.value); - case Kind.STRING: - return ast.value; - case Kind.LIST: - return ast.values; - case Kind.OBJECT: - return ast.fields; - } - return undefined; - }, -}); -export const createScalarToStringArrayValueResolvers = () => ({ - ToStringArray: toStringArrayScalar, - ToStringArrayNoNullable: toStringArrayNoNullableScalar, -}); - -const convertToString = (value: object | number | boolean | string): string => { - if (isObject(value)) { - try { - return JSON.stringify(value); - } catch (_) { - return 'Invalid Object'; - } - } - return value.toString(); -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const convertArrayToString = (values: any[]): string[] | string => { - if (Array.isArray(values)) { - return values - .filter((item) => item != null) - .map((item) => convertArrayToString(item)) as string[]; - } - return convertToString(values); -}; diff --git a/x-pack/plugins/security_solution/server/graphql/ecs/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/ecs/schema.gql.ts deleted file mode 100644 index 3ae501c5a167d..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/ecs/schema.gql.ts +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const ecsSchema = gql` - scalar ToStringArray - scalar ToStringArrayNoNullable - - type EventEcsFields { - action: ToStringArray - category: ToStringArray - code: ToStringArray - created: ToDateArray - dataset: ToStringArray - duration: ToNumberArray - end: ToDateArray - hash: ToStringArray - id: ToStringArray - kind: ToStringArray - module: ToStringArray - original: ToStringArray - outcome: ToStringArray - risk_score: ToNumberArray - risk_score_norm: ToNumberArray - severity: ToNumberArray - start: ToDateArray - timezone: ToStringArray - type: ToStringArray - } - - type Location { - lon: ToNumberArray - lat: ToNumberArray - } - - type GeoEcsFields { - city_name: ToStringArray - continent_name: ToStringArray - country_iso_code: ToStringArray - country_name: ToStringArray - location: Location - region_iso_code: ToStringArray - region_name: ToStringArray - } - - type PrimarySecondary { - primary: ToStringArray - secondary: ToStringArray - type: ToStringArray - } - - type Summary { - actor: PrimarySecondary - object: PrimarySecondary - how: ToStringArray - message_type: ToStringArray - sequence: ToStringArray - } - - type AgentEcsField { - type: ToStringArray - } - - type AuditdData { - acct: ToStringArray - terminal: ToStringArray - op: ToStringArray - } - - type AuditdEcsFields { - result: ToStringArray - session: ToStringArray - data: AuditdData - summary: Summary - sequence: ToStringArray - } - - type OsEcsFields { - platform: ToStringArray - name: ToStringArray - full: ToStringArray - family: ToStringArray - version: ToStringArray - kernel: ToStringArray - } - - type HostEcsFields { - architecture: ToStringArray - id: ToStringArray - ip: ToStringArray - mac: ToStringArray - name: ToStringArray - os: OsEcsFields - type: ToStringArray - } - - type Thread { - id: ToNumberArray - start: ToStringArray - } - - type ProcessHashData { - md5: ToStringArray - sha1: ToStringArray - sha256: ToStringArray - } - - type ProcessEcsFields { - hash: ProcessHashData - pid: ToNumberArray - name: ToStringArray - ppid: ToNumberArray - args: ToStringArray - entity_id: ToStringArray - executable: ToStringArray - title: ToStringArray - thread: Thread - working_directory: ToStringArray - } - - type SourceEcsFields { - bytes: ToNumberArray - ip: ToStringArray - port: ToNumberArray - domain: ToStringArray - geo: GeoEcsFields - packets: ToNumberArray - } - - type DestinationEcsFields { - bytes: ToNumberArray - ip: ToStringArray - port: ToNumberArray - domain: ToStringArray - geo: GeoEcsFields - packets: ToNumberArray - } - - type DnsQuestionData { - name: ToStringArray - type: ToStringArray - } - - type DnsEcsFields { - question: DnsQuestionData - resolved_ip: ToStringArray - response_code: ToStringArray - } - - type EndgameEcsFields { - exit_code: ToNumberArray - file_name: ToStringArray - file_path: ToStringArray - logon_type: ToNumberArray - parent_process_name: ToStringArray - pid: ToNumberArray - process_name: ToStringArray - subject_domain_name: ToStringArray - subject_logon_id: ToStringArray - subject_user_name: ToStringArray - target_domain_name: ToStringArray - target_logon_id: ToStringArray - target_user_name: ToStringArray - } - - type SuricataAlertData { - signature: ToStringArray - signature_id: ToNumberArray - } - - type SuricataEveData { - alert: SuricataAlertData - flow_id: ToNumberArray - proto: ToStringArray - } - - type SuricataEcsFields { - eve: SuricataEveData - } - - type TlsJa3Data { - hash: ToStringArray - } - - type FingerprintData { - sha1: ToStringArray - } - - type TlsClientCertificateData { - fingerprint: FingerprintData - } - - type TlsServerCertificateData { - fingerprint: FingerprintData - } - - type TlsFingerprintsData { - ja3: TlsJa3Data - } - - type TlsEcsFields { - client_certificate: TlsClientCertificateData - fingerprints: TlsFingerprintsData - server_certificate: TlsServerCertificateData - } - - type ZeekConnectionData { - local_resp: ToBooleanArray - local_orig: ToBooleanArray - missed_bytes: ToNumberArray - state: ToStringArray - history: ToStringArray - } - - type ZeekNoticeData { - suppress_for: ToNumberArray - msg: ToStringArray - note: ToStringArray - sub: ToStringArray - dst: ToStringArray - dropped: ToBooleanArray - peer_descr: ToStringArray - } - - type ZeekDnsData { - AA: ToBooleanArray - qclass_name: ToStringArray - RD: ToBooleanArray - qtype_name: ToStringArray - rejected: ToBooleanArray - qtype: ToStringArray - query: ToStringArray - trans_id: ToNumberArray - qclass: ToStringArray - RA: ToBooleanArray - TC: ToBooleanArray - } - - type FileFields { - name: ToStringArray - path: ToStringArray - target_path: ToStringArray - extension: ToStringArray - type: ToStringArray - device: ToStringArray - inode: ToStringArray - uid: ToStringArray - owner: ToStringArray - gid: ToStringArray - group: ToStringArray - mode: ToStringArray - size: ToNumberArray - mtime: ToDateArray - ctime: ToDateArray - } - - type ZeekHttpData { - resp_mime_types: ToStringArray - trans_depth: ToStringArray - status_msg: ToStringArray - resp_fuids: ToStringArray - tags: ToStringArray - } - - type HttpBodyData { - content: ToStringArray - bytes: ToNumberArray - } - - type HttpRequestData { - method: ToStringArray - body: HttpBodyData - referrer: ToStringArray - bytes: ToNumberArray - } - - type HttpResponseData { - status_code: ToNumberArray - body: HttpBodyData - bytes: ToNumberArray - } - - type HttpEcsFields { - version: ToStringArray - request: HttpRequestData - response: HttpResponseData - } - - type UrlEcsFields { - domain: ToStringArray - original: ToStringArray - username: ToStringArray - password: ToStringArray - } - - type ZeekFileData { - session_ids: ToStringArray - timedout: ToBooleanArray - local_orig: ToBooleanArray - tx_host: ToStringArray - source: ToStringArray - is_orig: ToBooleanArray - overflow_bytes: ToNumberArray - sha1: ToStringArray - duration: ToNumberArray - depth: ToNumberArray - analyzers: ToStringArray - mime_type: ToStringArray - rx_host: ToStringArray - total_bytes: ToNumberArray - fuid: ToStringArray - seen_bytes: ToNumberArray - missing_bytes: ToNumberArray - md5: ToStringArray - } - - type ZeekSslData { - cipher: ToStringArray - established: ToBooleanArray - resumed: ToBooleanArray - version: ToStringArray - } - - type ZeekEcsFields { - session_id: ToStringArray - connection: ZeekConnectionData - notice: ZeekNoticeData - dns: ZeekDnsData - http: ZeekHttpData - files: ZeekFileData - ssl: ZeekSslData - } - - type UserEcsFields { - domain: ToStringArray - id: ToStringArray - name: ToStringArray - full_name: ToStringArray - email: ToStringArray - hash: ToStringArray - group: ToStringArray - } - - type WinlogEcsFields { - event_id: ToNumberArray - } - - type NetworkEcsField { - bytes: ToNumberArray - community_id: ToStringArray - direction: ToStringArray - packets: ToNumberArray - protocol: ToStringArray - transport: ToStringArray - } - - type PackageEcsFields { - arch: ToStringArray - entity_id: ToStringArray - name: ToStringArray - size: ToNumberArray - summary: ToStringArray - version: ToStringArray - } - - type AuditEcsFields { - package: PackageEcsFields - } - - type SshEcsFields { - method: ToStringArray - signature: ToStringArray - } - - type AuthEcsFields { - ssh: SshEcsFields - } - - type SystemEcsField { - audit: AuditEcsFields - auth: AuthEcsFields - } - - type RuleField { - id: ToStringArray - rule_id: ToStringArray - false_positives: [String!]! - saved_id: ToStringArray - timeline_id: ToStringArray - timeline_title: ToStringArray - max_signals: ToNumberArray - risk_score: ToStringArray - output_index: ToStringArray - description: ToStringArray - from: ToStringArray - immutable: ToBooleanArray - index: ToStringArray - interval: ToStringArray - language: ToStringArray - query: ToStringArray - references: ToStringArray - severity: ToStringArray - tags: ToStringArray - threat: ToAny - type: ToStringArray - size: ToStringArray - to: ToStringArray - enabled: ToBooleanArray - filters: ToAny - created_at: ToStringArray - updated_at: ToStringArray - created_by: ToStringArray - updated_by: ToStringArray - version: ToStringArray - note: ToStringArray - threshold: ToAny - exceptions_list: ToAny - } - - type SignalField { - rule: RuleField - original_time: ToStringArray - status: ToStringArray - } - - type RuleEcsField { - reference: ToStringArray - } - - type ECS { - _id: String! - _index: String - agent: AgentEcsField - auditd: AuditdEcsFields - destination: DestinationEcsFields - dns: DnsEcsFields - endgame: EndgameEcsFields - event: EventEcsFields - geo: GeoEcsFields - host: HostEcsFields - network: NetworkEcsField - rule: RuleEcsField - signal: SignalField - source: SourceEcsFields - suricata: SuricataEcsFields - tls: TlsEcsFields - zeek: ZeekEcsFields - http: HttpEcsFields - url: UrlEcsFields - timestamp: Date - message: ToStringArray - user: UserEcsFields - winlog: WinlogEcsFields - process: ProcessEcsFields - file: FileFields - system: SystemEcsField - } - - type EcsEdges { - node: ECS! - cursor: CursorType! - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/hosts/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/hosts/schema.gql.ts deleted file mode 100644 index c3a5c4e3b23cf..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/hosts/schema.gql.ts +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const hostsSchema = gql` - type OsFields { - platform: String - name: String - full: String - family: String - version: String - kernel: String - } - - type HostFields { - architecture: String - id: String - ip: [String] - mac: [String] - name: String - os: OsFields - type: String - } - - type AgentFields { - id: String - } - - type CloudInstance { - id: [String] - } - - type CloudMachine { - type: [String] - } - - type CloudFields { - instance: CloudInstance - machine: CloudMachine - provider: [String] - region: [String] - } - - enum HostPolicyResponseActionStatus { - success - failure - warning - unsupported - } - - type EndpointFields { - endpointPolicy: String - sensorVersion: String - policyStatus: HostPolicyResponseActionStatus - } - - type HostItem { - _id: String - agent: AgentFields - cloud: CloudFields - endpoint: EndpointFields - host: HostEcsFields - inspect: Inspect - lastSeen: Date - } - - type HostsEdges { - node: HostItem! - cursor: CursorType! - } - - type HostsData { - edges: [HostsEdges!]! - totalCount: Float! - pageInfo: PageInfoPaginated! - inspect: Inspect - } - - type FirstLastSeenHost { - inspect: Inspect - firstSeen: Date - lastSeen: Date - } - - enum HostsFields { - hostName - lastSeen - } - - input HostsSortField { - field: HostsFields! - direction: Direction! - } - - extend type Source { - "Gets Hosts based on timerange and specified criteria, or all events in the timerange if no criteria is specified" - Hosts( - id: String - timerange: TimerangeInput! - pagination: PaginationInputPaginated! - sort: HostsSortField! - filterQuery: String - defaultIndex: [String!]! - docValueFields: [docValueFieldsInput!]! - ): HostsData! - HostOverview( - id: String - hostName: String! - timerange: TimerangeInput! - defaultIndex: [String!]! - ): HostItem! - HostFirstLastSeen( - id: String - hostName: String! - defaultIndex: [String!]! - docValueFields: [docValueFieldsInput!]! - ): FirstLastSeenHost! - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/index.ts b/x-pack/plugins/security_solution/server/graphql/index.ts deleted file mode 100644 index ba3a1371f1829..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { rootSchema } from '../../common/graphql/root'; -import { sharedSchema } from '../../common/graphql/shared'; - -import { ecsSchema } from './ecs'; -import { dateSchema } from './scalar_date'; -import { noteSchema } from './note'; -import { pinnedEventSchema } from './pinned_event'; -import { toAnySchema } from './scalar_to_any'; -import { toBooleanSchema } from './scalar_to_boolean_array'; -import { toDateSchema } from './scalar_to_date_array'; -import { toNumberSchema } from './scalar_to_number_array'; -import { sourceStatusSchema } from './source_status'; -import { sourcesSchema } from './sources'; -import { timelineSchema } from './timeline'; -export const schemas = [ - ecsSchema, - dateSchema, - toAnySchema, - toNumberSchema, - toDateSchema, - toBooleanSchema, - noteSchema, - pinnedEventSchema, - rootSchema, - sourcesSchema, - sourceStatusSchema, - sharedSchema, - timelineSchema, -]; diff --git a/x-pack/plugins/security_solution/server/graphql/note/index.ts b/x-pack/plugins/security_solution/server/graphql/note/index.ts deleted file mode 100644 index f15ab97ca7676..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/note/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createNoteResolvers } from './resolvers'; -export { noteSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/note/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/note/resolvers.ts deleted file mode 100644 index 383522bc06bdd..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/note/resolvers.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { AppResolverWithFields, AppResolverOf } from '../../lib/framework'; -import { MutationResolvers, QueryResolvers } from '../types'; -import { Notes } from '../../lib/timeline/saved_object/notes'; - -export type QueryNoteResolver = AppResolverOf; - -export type QueryAllNoteResolver = AppResolverWithFields< - QueryResolvers.GetAllNotesResolver, - 'totalCount' | 'Note' ->; - -export type QueryNotesByTimelineIdResolver = AppResolverOf; - -export type QueryNotesByEventIdResolver = AppResolverOf; - -export type MutationNoteResolver = AppResolverOf< - MutationResolvers.PersistNoteResolver ->; - -export type MutationDeleteNoteResolver = AppResolverOf; - -export type MutationDeleteNoteByTimelineIdResolver = AppResolverOf; - -interface NoteResolversDeps { - note: Notes; -} - -export const createNoteResolvers = ( - libs: NoteResolversDeps -): { - Query: { - getNote: QueryNoteResolver; - getAllNotes: QueryAllNoteResolver; - getNotesByEventId: QueryNotesByEventIdResolver; - getNotesByTimelineId: QueryNotesByTimelineIdResolver; - }; - Mutation: { - deleteNote: MutationDeleteNoteResolver; - deleteNoteByTimelineId: MutationDeleteNoteByTimelineIdResolver; - persistNote: MutationNoteResolver; - }; -} => ({ - Query: { - async getNote(root, args, { req }) { - return libs.note.getNote(req, args.id); - }, - async getAllNotes(root, args, { req }) { - return libs.note.getAllNotes( - req, - args.pageInfo || null, - args.search || null, - args.sort || null - ); - }, - async getNotesByEventId(root, args, { req }) { - return libs.note.getNotesByEventId(req, args.eventId); - }, - async getNotesByTimelineId(root, args, { req }) { - return libs.note.getNotesByTimelineId(req, args.timelineId); - }, - }, - Mutation: { - async deleteNote(root, args, { req }) { - await libs.note.deleteNote(req, args.id); - - return true; - }, - async deleteNoteByTimelineId(root, args, { req }) { - await libs.note.deleteNoteByTimelineId(req, args.timelineId); - - return true; - }, - async persistNote(root, args, { req }) { - return libs.note.persistNote( - req, - args.noteId || null, - args.version || null, - { - ...args.note, - timelineId: args.note.timelineId || null, - }, - true - ); - }, - }, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/note/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/note/schema.gql.ts deleted file mode 100644 index bd791b734ff24..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/note/schema.gql.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -const note = ` - eventId: String - note: String - timelineId: String -`; - -export const noteSchema = gql` - ############### - #### INPUT #### - ############### - - input NoteInput { - ${note} - } - - input PageInfoNote { - pageIndex: Float! - pageSize: Float! - } - - enum SortFieldNote { - updatedBy - updated - } - - input SortNote { - sortField: SortFieldNote! - sortOrder: Direction! - } - - ############### - #### QUERY #### - ############### - type NoteResult { - ${note} - noteId: String! - created: Float - createdBy: String - timelineVersion: String - updated: Float - updatedBy: String - version: String - } - - type ResponseNote { - code: Float - message: String - note: NoteResult! - } - - type ResponseNotes { - notes: [NoteResult!]! - totalCount: Float - } - - ######################### - #### Mutation/Query #### - ######################### - - extend type Query { - getNote(id: ID!): NoteResult! - getNotesByTimelineId(timelineId: ID!): [NoteResult!]! - getNotesByEventId(eventId: ID!): [NoteResult!]! - getAllNotes(pageInfo: PageInfoNote, search: String, sort: SortNote): ResponseNotes! - } - - extend type Mutation { - "Persists a note" - persistNote(noteId: ID, version: String, note: NoteInput!): ResponseNote! - deleteNote(id: [ID!]!):Boolean - deleteNoteByTimelineId(timelineId: ID!, version: String):Boolean - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/pinned_event/index.ts b/x-pack/plugins/security_solution/server/graphql/pinned_event/index.ts deleted file mode 100644 index b1018025b3d73..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/pinned_event/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createPinnedEventResolvers } from './resolvers'; -export { pinnedEventSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/pinned_event/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/pinned_event/resolvers.ts deleted file mode 100644 index de1a40d9118c7..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/pinned_event/resolvers.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { AppResolverOf } from '../../lib/framework'; -import { MutationResolvers, QueryResolvers } from '../types'; -import { PinnedEvent } from '../../lib/timeline/saved_object/pinned_events'; - -export type QueryAllPinnedEventsByTimelineIdResolver = AppResolverOf; - -export type MutationPinnedEventResolver = AppResolverOf; - -export type MutationDeletePinnedEventOnTimelineResolver = AppResolverOf; - -export type MutationDeleteAllPinnedEventsOnTimelineResolver = AppResolverOf; - -interface TimelineResolversDeps { - pinnedEvent: PinnedEvent; -} - -export const createPinnedEventResolvers = ( - libs: TimelineResolversDeps -): { - Query: { - getAllPinnedEventsByTimelineId: QueryAllPinnedEventsByTimelineIdResolver; - }; - Mutation: { - persistPinnedEventOnTimeline: MutationPinnedEventResolver; - deletePinnedEventOnTimeline: MutationDeletePinnedEventOnTimelineResolver; - deleteAllPinnedEventsOnTimeline: MutationDeleteAllPinnedEventsOnTimelineResolver; - }; -} => ({ - Query: { - async getAllPinnedEventsByTimelineId(root, args, { req }) { - return libs.pinnedEvent.getAllPinnedEventsByTimelineId(req, args.timelineId); - }, - }, - Mutation: { - async persistPinnedEventOnTimeline(root, args, { req }) { - return libs.pinnedEvent.persistPinnedEventOnTimeline( - req, - args.pinnedEventId || null, - args.eventId, - args.timelineId || null - ); - }, - async deletePinnedEventOnTimeline(root, args, { req }) { - await libs.pinnedEvent.deletePinnedEventOnTimeline(req, args.id); - return true; - }, - async deleteAllPinnedEventsOnTimeline(root, args, { req }) { - await libs.pinnedEvent.deleteAllPinnedEventsOnTimeline(req, args.timelineId); - return true; - }, - }, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/pinned_event/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/pinned_event/schema.gql.ts deleted file mode 100644 index 2e1cb29cf9d78..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/pinned_event/schema.gql.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const pinnedEventSchema = gql` - ######################### - #### Mutation/Query #### - ######################### - - type PinnedEvent { - code: Float - message: String - pinnedEventId: ID! - eventId: ID - timelineId: ID - timelineVersion: String - created: Float - createdBy: String - updated: Float - updatedBy: String - version: String - } - - extend type Query { - getAllPinnedEventsByTimelineId(timelineId: ID!): [PinnedEvent!]! - } - - extend type Mutation { - "Persists a pinned event in a timeline" - persistPinnedEventOnTimeline(pinnedEventId: ID, eventId: ID!, timelineId: ID): PinnedEvent - "Remove a pinned events in a timeline" - deletePinnedEventOnTimeline(id: [ID!]!): Boolean! - "Remove all pinned events in a timeline" - deleteAllPinnedEventsOnTimeline(timelineId: ID!): Boolean! - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_date/index.ts b/x-pack/plugins/security_solution/server/graphql/scalar_date/index.ts deleted file mode 100644 index 6e3fb5adbb687..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_date/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createScalarDateResolvers } from './resolvers'; -export { dateSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.test.ts b/x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.test.ts deleted file mode 100644 index 4c421af560180..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IntValueNode, StringValueNode } from 'graphql'; - -import { dateScalar } from './resolvers'; - -describe('Test ScalarDate Resolver', () => { - describe('#serialize', () => { - test('Make sure that an epoch date number is serialized', () => { - const date = dateScalar.serialize(1514782800000); - expect(date).toEqual('2018-01-01T05:00:00.000Z'); - }); - - test('Make sure that a date string is serialized', () => { - const date = dateScalar.serialize('2018-01-01T05:00:00.000Z'); - expect(date).toEqual('2018-01-01T05:00:00.000Z'); - }); - }); - - describe('#parseValue', () => { - test('Make sure that an epoch date number passes through parseValue', () => { - const date = dateScalar.parseValue(1514782800000); - expect(date).toEqual(1514782800000); - }); - - test('Make sure that a date string passes through parseValue', () => { - const date = dateScalar.parseValue('2018-01-01T05:00:00.000Z'); - expect(date).toEqual('2018-01-01T05:00:00.000Z'); - }); - }); - - describe('#parseLiteral', () => { - test('Make sure that an epoch date string passes through parseLiteral', () => { - const valueNode: IntValueNode = { - kind: 'IntValue', - value: '1514782800000', - }; - const date = dateScalar.parseLiteral(valueNode); - expect(date).toEqual(1514782800000); - }); - - test('Make sure that a date string passes through parseLiteral', () => { - const valueNode: StringValueNode = { - kind: 'StringValue', - value: '2018-01-01T05:00:00.000Z', - }; - const date = dateScalar.parseLiteral(valueNode); - expect(date).toEqual('2018-01-01T05:00:00.000Z'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.ts deleted file mode 100644 index fe55cc949af48..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_date/resolvers.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLScalarType, Kind } from 'graphql'; - -export const dateScalar = new GraphQLScalarType({ - name: 'Date', - description: - 'Represents a Date for either an ES formatted date string or epoch string ISO8601 formatted', - serialize(value): string { - return Number.isNaN(Date.parse(value)) ? new Date(value).toISOString() : value; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.INT: - return parseInt(ast.value, 10); - case Kind.STRING: - return ast.value; - } - return null; - }, -}); - -export const createScalarDateResolvers = () => ({ - Date: dateScalar, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_any/index.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_any/index.ts deleted file mode 100644 index 0a26a1a59816a..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_any/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createScalarToAnyValueResolvers } from './resolvers'; -export { toAnySchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_any/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_any/resolvers.ts deleted file mode 100644 index 37903617989e6..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_any/resolvers.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { isObject } from 'lodash/fp'; -import { GraphQLScalarType, Kind } from 'graphql'; - -/* - * serialize: gets invoked when serializing the result to send it back to a client. - * - * parseValue: gets invoked to parse client input that was passed through variables. - * - * parseLiteral: gets invoked to parse client input that was passed inline in the query. - */ - -export const toAnyScalar = new GraphQLScalarType({ - name: 'Any', - description: 'Represents any type', - serialize(value): unknown { - if (value == null) { - return null; - } - try { - const maybeObj = JSON.parse(value); - if (isObject(maybeObj)) { - return maybeObj; - } else { - return value; - } - } catch (e) { - return value; - } - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.BOOLEAN: - return ast.value; - case Kind.INT: - return ast.value; - case Kind.FLOAT: - return ast.value; - case Kind.STRING: - return ast.value; - case Kind.LIST: - return ast.values; - case Kind.OBJECT: - return ast.fields; - } - return null; - }, -}); - -export const createScalarToAnyValueResolvers = () => ({ - ToAny: toAnyScalar, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_any/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_any/schema.gql.ts deleted file mode 100644 index 79c4a881c10b9..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_any/schema.gql.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const toAnySchema = gql` - scalar ToAny -`; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/index.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/index.ts deleted file mode 100644 index df362871fd5a6..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createScalarToBooleanArrayValueResolvers } from './resolvers'; -export { toBooleanSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.test.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.test.ts deleted file mode 100644 index 247ed3a0d0911..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { toBooleanArrayScalar } from './resolvers'; - -describe('Test ToBooleanArray Scalar Resolver', () => { - describe('#serialize', () => { - test('Test Null Boolean', () => { - expect(toBooleanArrayScalar.serialize(null)).toEqual(null); - }); - - test('Test Undefined Boolean', () => { - expect(toBooleanArrayScalar.serialize(undefined)).toEqual(null); - }); - - test('Test NaN Number', () => { - expect(toBooleanArrayScalar.serialize(NaN)).toEqual([false]); - }); - - test('Test Basic false Boolean', () => { - expect(toBooleanArrayScalar.serialize(false)).toEqual([false]); - }); - - test('Test Basic true Boolean', () => { - expect(toBooleanArrayScalar.serialize(true)).toEqual([true]); - }); - - test('Test Basic false Boolean string', () => { - expect(toBooleanArrayScalar.serialize('false')).toEqual([false]); - }); - - test('Test Basic true Boolean string', () => { - expect(toBooleanArrayScalar.serialize('true')).toEqual([true]); - }); - - test('Test Basic true Boolean string with weird letters', () => { - expect(toBooleanArrayScalar.serialize('tRuE')).toEqual([true]); - }); - - test('Test Basic true Boolean string with just the letter T', () => { - expect(toBooleanArrayScalar.serialize('T')).toEqual([true]); - }); - - test('Test Basic true Boolean string with just the letter t', () => { - expect(toBooleanArrayScalar.serialize('t')).toEqual([true]); - }); - - test('Test string with gibberish returning false', () => { - expect(toBooleanArrayScalar.serialize('some gibberish')).toEqual([false]); - }); - - test('Test Basic false Boolean in array', () => { - expect(toBooleanArrayScalar.serialize([false])).toEqual([false]); - }); - - test('Test Basic true Boolean in array', () => { - expect(toBooleanArrayScalar.serialize([true])).toEqual([true]); - }); - - test('Test Basic false Boolean string in array', () => { - expect(toBooleanArrayScalar.serialize(['false'])).toEqual([false]); - }); - - test('Test Basic true Boolean string in array', () => { - expect(toBooleanArrayScalar.serialize(['true'])).toEqual([true]); - }); - - test('Test number with 0 returning false', () => { - expect(toBooleanArrayScalar.serialize(0)).toEqual([false]); - }); - - test('Test number with 1 returning returning true', () => { - expect(toBooleanArrayScalar.serialize(1)).toEqual([true]); - }); - - test('Test array with 0 and 1 returning true and false', () => { - expect(toBooleanArrayScalar.serialize([0, 1, 1, 0, 1])).toEqual([ - false, - true, - true, - false, - true, - ]); - }); - - test('Test Simple Object returning false', () => { - expect(toBooleanArrayScalar.serialize({})).toEqual([false]); - }); - - test('Test Simple Circular Reference returning false', () => { - const circularReference = { myself: {} }; - circularReference.myself = circularReference; - expect(toBooleanArrayScalar.serialize(circularReference)).toEqual([false]); - }); - - test('Test Array of Strings with some numbers, a null, and some text and a boolean', () => { - expect( - toBooleanArrayScalar.serialize([ - 5, - 'you', - '1', - 'he', - '20', - 'we', - null, - '22', - 'they', - 'True', - 'T', - 't', - ]) - ).toEqual([true, false, false, false, false, false, false, false, true, true, true]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.ts deleted file mode 100644 index b1aefd3188ef6..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/resolvers.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLScalarType, Kind } from 'graphql'; -import { isNumber, isObject, isString } from 'lodash/fp'; - -/* - * serialize: gets invoked when serializing the result to send it back to a client. - * - * parseValue: gets invoked to parse client input that was passed through variables. - * - * parseLiteral: gets invoked to parse client input that was passed inline in the query. - */ - -export const toBooleanArrayScalar = new GraphQLScalarType({ - name: 'BooleanArray', - description: 'Represents value in detail item from the timeline who wants to more than one type', - serialize(value): boolean[] | null { - if (value == null) { - return null; - } else if (Array.isArray(value)) { - return convertArrayToBoolean(value) as boolean[]; - } else if (isString(value) || isObject(value) || isNumber(value)) { - return [convertToBoolean(value)]; - } - return [value]; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.BOOLEAN: - return ast.value; - case Kind.INT: - return ast.value; - case Kind.FLOAT: - return ast.value; - case Kind.STRING: - return ast.value; - case Kind.LIST: - return ast.values; - case Kind.OBJECT: - return ast.fields; - } - return null; - }, -}); - -export const createScalarToBooleanArrayValueResolvers = () => ({ - ToBooleanArray: toBooleanArrayScalar, -}); - -const convertToBoolean = (value: object | number | boolean | string): boolean => { - if (isObject(value)) { - return false; - } else if (isString(value)) { - return value.toLowerCase() === 'true' || value.toLowerCase() === 't' ? true : false; - } else { - return Boolean(value); - } -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const convertArrayToBoolean = (values: any[]): boolean[] | boolean => { - if (Array.isArray(values)) { - return values - .filter((item) => item != null) - .map((item) => convertArrayToBoolean(item)) as boolean[]; - } - return convertToBoolean(values); -}; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/schema.gql.ts deleted file mode 100644 index d8717ebfdee02..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_boolean_array/schema.gql.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const toBooleanSchema = gql` - scalar ToBooleanArray -`; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/index.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/index.ts deleted file mode 100644 index 53b8c2c4caa0c..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createScalarToDateArrayValueResolvers } from './resolvers'; -export { toDateSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.test.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.test.ts deleted file mode 100644 index 109fbb9e42005..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { toDateArrayScalar } from './resolvers'; - -describe('Test ToDateArray Scalar Resolver', () => { - describe('#serialize', () => { - test('Test Null Number', () => { - expect(toDateArrayScalar.serialize(null)).toEqual(null); - }); - - test('Test Undefined Number', () => { - expect(toDateArrayScalar.serialize(undefined)).toEqual(null); - }); - - test('Test NaN Number', () => { - expect(toDateArrayScalar.serialize(NaN)).toEqual([NaN]); - }); - - test('Test Basic Date String', () => { - expect(toDateArrayScalar.serialize('2019-04-16T03:14:13.704Z')).toEqual([ - '2019-04-16T03:14:13.704Z', - ]); - }); - - test('Test Basic Date Number as String', () => { - expect(toDateArrayScalar.serialize('1555384642768')).toEqual(['2019-04-16T03:17:22.768Z']); - }); - - test('Test Basic Date String in an array', () => { - expect(toDateArrayScalar.serialize(['2019-04-16T03:14:13.704Z'])).toEqual([ - '2019-04-16T03:14:13.704Z', - ]); - }); - - test('Test Two Basic Date Strings in an array', () => { - expect( - toDateArrayScalar.serialize(['2019-04-16T03:14:13.704Z', '2019-05-16T03:14:13.704Z']) - ).toEqual(['2019-04-16T03:14:13.704Z', '2019-05-16T03:14:13.704Z']); - }); - - test('Test Basic Numbers in an array', () => { - expect(toDateArrayScalar.serialize([1555384642768, 1555384453704])).toEqual([ - '2019-04-16T03:17:22.768Z', - '2019-04-16T03:14:13.704Z', - ]); - }); - - test('Mix of Basic Numbers and strings in an array', () => { - expect( - toDateArrayScalar.serialize([1555384642768, '2019-05-16T03:14:13.704Z', 1555384453704]) - ).toEqual([ - '2019-04-16T03:17:22.768Z', - '2019-05-16T03:14:13.704Z', - '2019-04-16T03:14:13.704Z', - ]); - }); - - test('Test Simple Object', () => { - expect(toDateArrayScalar.serialize({})).toEqual(['invalid date']); - }); - - test('Test Simple Circular Reference', () => { - const circularReference = { myself: {} }; - circularReference.myself = circularReference; - expect(toDateArrayScalar.serialize(circularReference)).toEqual(['invalid date']); - }); - - test('Test Array of Strings with some numbers, a null, and some text', () => { - expect( - toDateArrayScalar.serialize([ - '1555384453704', - 'you', - 1555384642768, - 'he', - 'we', - null, - 'they', - ]) - ).toEqual([ - '2019-04-16T03:14:13.704Z', - 'you', - '2019-04-16T03:17:22.768Z', - 'he', - 'we', - 'they', - ]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.ts deleted file mode 100644 index 532e520e4045e..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/resolvers.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLScalarType, Kind } from 'graphql'; -import { isBoolean, isNumber, isObject, isString } from 'lodash/fp'; - -/* - * serialize: gets invoked when serializing the result to send it back to a client. - * - * parseValue: gets invoked to parse client input that was passed through variables. - * - * parseLiteral: gets invoked to parse client input that was passed inline in the query. - */ - -export const toDateArrayScalar = new GraphQLScalarType({ - name: 'DateArray', - description: 'Represents value in detail item from the timeline who wants to more than one type', - serialize(value): string[] | null { - if (value == null) { - return null; - } else if (Array.isArray(value)) { - return convertArrayToDate(value) as string[]; - } else if (isBoolean(value) || isString(value) || isObject(value)) { - return [convertToDate(value)]; - } - return [value]; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.INT: - return parseInt(ast.value, 10); - case Kind.STRING: - return ast.value; - } - return null; - }, -}); - -export const createScalarToDateArrayValueResolvers = () => ({ - ToDateArray: toDateArrayScalar, -}); - -const convertToDate = (value: object | number | boolean | string): string => { - if (isNumber(value)) { - return new Date(value).toISOString(); - } else if (isObject(value)) { - return 'invalid date'; - } else if (isString(value) && !isNaN(+value)) { - return new Date(+value).toISOString(); - } else { - return String(value); - } -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const convertArrayToDate = (values: any[]): string[] | string => { - if (Array.isArray(values)) { - return values - .filter((item) => item != null) - .map((item) => convertArrayToDate(item)) as string[]; - } - return convertToDate(values); -}; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/schema.gql.ts deleted file mode 100644 index 7238e975c4c25..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_date_array/schema.gql.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const toDateSchema = gql` - scalar ToDateArray -`; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/index.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/index.ts deleted file mode 100644 index 070c09181c2c5..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createScalarToNumberArrayValueResolvers } from './resolvers'; -export { toNumberSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.test.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.test.ts deleted file mode 100644 index a37ae25ec5e04..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { toNumberArrayScalar } from './resolvers'; - -describe('Test ToNumberArray Scalar Resolver', () => { - describe('#serialize', () => { - test('Test Null Number', () => { - expect(toNumberArrayScalar.serialize(null)).toEqual(null); - }); - - test('Test Undefined Number', () => { - expect(toNumberArrayScalar.serialize(undefined)).toEqual(null); - }); - - test('Test NaN Number', () => { - expect(toNumberArrayScalar.serialize(NaN)).toEqual([NaN]); - }); - - test('Test Basic Number', () => { - expect(toNumberArrayScalar.serialize(5)).toEqual([5]); - }); - - test('Test Basic Number in an array', () => { - expect(toNumberArrayScalar.serialize([5])).toEqual([5]); - }); - - test('Test Two Basic Numbers in an array', () => { - expect(toNumberArrayScalar.serialize([5, 3])).toEqual([5, 3]); - }); - - test('Test Basic String', () => { - expect(toNumberArrayScalar.serialize('33')).toEqual([33]); - }); - - test('Test Two Basic Strings in an array', () => { - expect(toNumberArrayScalar.serialize(['33', '44'])).toEqual([33, 44]); - }); - - test('Test Two Basic Strings and a piece of text in an array', () => { - expect(toNumberArrayScalar.serialize(['33', 'orange', '44'])).toEqual([33, NaN, 44]); - }); - - test('Test Basic Object to return NaN', () => { - expect(toNumberArrayScalar.serialize({ hello: 'test' })).toEqual([NaN]); - }); - - test('Test more complicated Object to return NaN', () => { - expect( - toNumberArrayScalar.serialize({ - hello: 'test', - me: 40, - you: ['32', '34', null], - others: [{ age: 78, name: 'unknown', lucky: true }], - isNull: null, - }) - ).toEqual([NaN]); - }); - - test('Test Array of Strings with some numbers, a null, and some text', () => { - expect( - toNumberArrayScalar.serialize(['5', 'you', '3', 'he', '20', 'we', null, '22', 'they']) - ).toEqual([5, NaN, 3, NaN, 20, NaN, 22, NaN]); - }); - - test('Test Simple Circular Reference', () => { - const circularReference = { myself: {} }; - circularReference.myself = circularReference; - expect(toNumberArrayScalar.serialize(circularReference)).toEqual([NaN]); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.ts deleted file mode 100644 index 9ec6de45ae48b..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/resolvers.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLScalarType, Kind } from 'graphql'; -import { isBoolean, isNumber, isObject, isString } from 'lodash/fp'; - -/* - * serialize: gets invoked when serializing the result to send it back to a client. - * - * parseValue: gets invoked to parse client input that was passed through variables. - * - * parseLiteral: gets invoked to parse client input that was passed inline in the query. - */ - -export const toNumberArrayScalar = new GraphQLScalarType({ - name: 'NumberArray', - description: 'Represents value in detail item from the timeline who wants to more than one type', - serialize(value): number[] | null { - if (value == null) { - return null; - } else if (Array.isArray(value)) { - return convertArrayToNumber(value) as number[]; - } else if (isBoolean(value) || isString(value) || isObject(value)) { - return [convertToNumber(value)]; - } - return [value]; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.INT: - return ast.value; - case Kind.FLOAT: - return ast.value; - case Kind.STRING: - return parseFloat(ast.value); - case Kind.LIST: - return ast.values; - case Kind.OBJECT: - return ast.fields; - } - return null; - }, -}); - -export const createScalarToNumberArrayValueResolvers = () => ({ - ToNumberArray: toNumberArrayScalar, -}); - -const convertToNumber = (value: object | number | boolean | string): number => { - if (isNumber(value)) { - return value; - } else if (isString(value)) { - return parseFloat(value); - } else { - return NaN; - } -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const convertArrayToNumber = (values: any[]): number[] | number => { - if (Array.isArray(values)) { - return values - .filter((item) => item != null) - .map((item) => convertArrayToNumber(item)) as number[]; - } - return convertToNumber(values); -}; diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/schema.gql.ts deleted file mode 100644 index 514af67f109e6..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/scalar_to_number_array/schema.gql.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const toNumberSchema = gql` - scalar ToNumberArray -`; diff --git a/x-pack/plugins/security_solution/server/graphql/source_status/index.ts b/x-pack/plugins/security_solution/server/graphql/source_status/index.ts deleted file mode 100644 index fef667075145a..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/source_status/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createSourceStatusResolvers } from './resolvers'; -export { sourceStatusSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/source_status/resolvers.test.ts b/x-pack/plugins/security_solution/server/graphql/source_status/resolvers.test.ts deleted file mode 100644 index 86c641dfb13b6..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/source_status/resolvers.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { filterIndexes } from './resolvers'; - -describe('resolvers', () => { - test('it should filter single index that has an empty string', () => { - const emptyArray = filterIndexes(['']); - expect(emptyArray).toEqual([]); - }); - - test('it should filter single index that has blanks within it', () => { - const emptyArray = filterIndexes([' ']); - expect(emptyArray).toEqual([]); - }); - - test('it should filter indexes that has an empty string and a valid index', () => { - const emptyArray = filterIndexes(['', 'valid-index']); - expect(emptyArray).toEqual(['valid-index']); - }); - - test('it should filter indexes that have blanks within them and a valid index', () => { - const emptyArray = filterIndexes([' ', 'valid-index']); - expect(emptyArray).toEqual(['valid-index']); - }); - - test('it should filter single index that has _all within it', () => { - const emptyArray = filterIndexes(['_all']); - expect(emptyArray).toEqual([]); - }); - - test('it should filter single index that has _all within it surrounded by spaces', () => { - const emptyArray = filterIndexes([' _all ']); - expect(emptyArray).toEqual([]); - }); - - test('it should filter indexes that _all within them and a valid index', () => { - const emptyArray = filterIndexes(['_all', 'valid-index']); - expect(emptyArray).toEqual(['valid-index']); - }); - - test('it should filter indexes that _all surrounded with spaces within them and a valid index', () => { - const emptyArray = filterIndexes([' _all ', 'valid-index']); - expect(emptyArray).toEqual(['valid-index']); - }); -}); diff --git a/x-pack/plugins/security_solution/server/graphql/source_status/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/source_status/resolvers.ts deleted file mode 100644 index 038f981a2f389..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/source_status/resolvers.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLScalarType, Kind } from 'graphql'; -import { SourceStatusResolvers } from '../../graphql/types'; -import { AppResolverOf, ChildResolverOf } from '../../lib/framework'; -import { IndexFields } from '../../lib/index_fields'; -import { SourceStatus } from '../../lib/source_status'; -import { QuerySourceResolver } from '../sources/resolvers'; -import { IFieldSubType } from '../../../../../../src/plugins/data/common/index_patterns/types'; - -export type SourceStatusIndicesExistResolver = ChildResolverOf< - AppResolverOf, - QuerySourceResolver ->; - -export type SourceStatusIndexFieldsResolver = ChildResolverOf< - AppResolverOf, - QuerySourceResolver ->; - -export const createSourceStatusResolvers = (libs: { - sourceStatus: SourceStatus; - fields: IndexFields; -}): { - SourceStatus: { - indicesExist: SourceStatusIndicesExistResolver; - indexFields: SourceStatusIndexFieldsResolver; - }; -} => ({ - SourceStatus: { - async indicesExist(_, args, { req }) { - const indexes = filterIndexes(args.defaultIndex); - if (indexes.length !== 0) { - return libs.sourceStatus.hasIndices(req, indexes); - } else { - return false; - } - }, - async indexFields(_, args, { req }) { - const indexes = filterIndexes(args.defaultIndex); - if (indexes.length !== 0) { - return libs.fields.getFields(req, indexes); - } else { - return []; - } - }, - }, -}); - -/** - * Given a set of indexes this will remove anything that is: - * - blank or empty strings are removed as not valid indexes - * - _all is removed as that is not a valid index - * @param indexes Indexes with invalid values removed - */ -export const filterIndexes = (indexes: string[]): string[] => - indexes.filter((index) => index.trim() !== '' && index.trim() !== '_all'); - -export const toIFieldSubTypeNonNullableScalar = new GraphQLScalarType({ - name: 'IFieldSubType', - description: 'Represents value in index pattern field item', - serialize(value): IFieldSubType | undefined { - if (value == null) { - return undefined; - } - - return { - multi: value.multi ?? undefined, - nested: value.nested ?? undefined, - }; - }, - parseValue(value) { - return value; - }, - parseLiteral(ast) { - switch (ast.kind) { - case Kind.INT: - return undefined; - case Kind.FLOAT: - return undefined; - case Kind.STRING: - return undefined; - case Kind.LIST: - return undefined; - case Kind.OBJECT: - return ast; - } - return undefined; - }, -}); - -export const createScalarToIFieldSubTypeNonNullableScalarResolvers = () => ({ - ToIFieldSubTypeNonNullable: toIFieldSubTypeNonNullableScalar, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/source_status/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/source_status/schema.gql.ts deleted file mode 100644 index c1fd7b24e6dcb..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/source_status/schema.gql.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const sourceStatusSchema = gql` - scalar ToIFieldSubTypeNonNullable - - "A descriptor of a field in an index" - type IndexField { - "Where the field belong" - category: String! - "Example of field's value" - example: String - "whether the field's belong to an alias index" - indexes: [String]! - "The name of the field" - name: String! - "The type of the field's values as recognized by Kibana" - type: String! - "Whether the field's values can be efficiently searched for" - searchable: Boolean! - "Whether the field's values can be aggregated" - aggregatable: Boolean! - "Description of the field" - description: String - format: String - "the elastic type as mapped in the index" - esTypes: ToStringArrayNoNullable - subType: ToIFieldSubTypeNonNullable - } - - extend type SourceStatus { - "Whether the configured alias or wildcard pattern resolve to any auditbeat indices" - indicesExist(defaultIndex: [String!]!): Boolean! - "The list of fields defined in the index mappings" - indexFields(defaultIndex: [String!]!): [String!]! - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/sources/index.ts b/x-pack/plugins/security_solution/server/graphql/sources/index.ts deleted file mode 100644 index 583918fa014c7..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/sources/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createSourcesResolvers } from './resolvers'; -export { sourcesSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/sources/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/sources/resolvers.ts deleted file mode 100644 index 8ae30c17560f0..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/sources/resolvers.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { QueryResolvers, SourceResolvers } from '../../graphql/types'; -import { - AppResolverOf, - AppResolverWithFields, - ChildResolverOf, - ResultOf, -} from '../../lib/framework'; -import { SourceStatus } from '../../lib/source_status'; -import { Sources } from '../../lib/sources'; - -export type QuerySourceResolver = AppResolverWithFields< - QueryResolvers.SourceResolver, - 'id' | 'configuration' ->; - -export type QueryAllSourcesResolver = AppResolverWithFields< - QueryResolvers.AllSourcesResolver, - 'id' | 'configuration' ->; - -export type SourceStatusResolver = ChildResolverOf< - AppResolverOf>>, - QuerySourceResolver ->; - -export interface SourcesResolversDeps { - sources: Sources; - sourceStatus: SourceStatus; -} - -export const createSourcesResolvers = ( - libs: SourcesResolversDeps -): { - Query: { - source: QuerySourceResolver; - allSources: QueryAllSourcesResolver; - }; - Source: { - status: SourceStatusResolver; - }; -} => ({ - Query: { - async source(root, args) { - const requestedSourceConfiguration = await libs.sources.getConfiguration(args.id); - - return { - id: args.id, - configuration: requestedSourceConfiguration, - }; - }, - async allSources() { - const sourceConfigurations = await libs.sources.getAllConfigurations(); - - return Object.entries(sourceConfigurations).map(([sourceName, sourceConfiguration]) => ({ - id: sourceName, - configuration: sourceConfiguration, - })); - }, - }, - Source: { - async status(source) { - return source; - }, - }, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/sources/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/sources/schema.gql.ts deleted file mode 100644 index 6b5b12a1e92a4..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/sources/schema.gql.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -export const sourcesSchema = gql` - extend type Query { - "Get a security data source by id" - source("The id of the source" id: ID!): Source! - "Get a list of all security data sources" - allSources: [Source!]! - } - - type Source { - "The id of the source" - id: ID! - "The raw configuration of the source" - configuration: SourceConfiguration! - "The status of the source" - status: SourceStatus! - } - - "The status of an infrastructure data source" - type SourceStatus - - "A set of configuration options for a security data source" - type SourceConfiguration { - "The field mapping to use for this source" - fields: SourceFields! - } - - "A mapping of semantic fields to their document counterparts" - type SourceFields { - "The field to identify a container by" - container: String! - "The fields to identify a host by" - host: String! - "The fields that may contain the log event message. The first field found win." - message: [String!]! - "The field to identify a pod by" - pod: String! - "The field to use as a tiebreaker for log events that have identical timestamps" - tiebreaker: String! - "The field to use as a timestamp for metrics and logs" - timestamp: String! - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/timeline/index.ts b/x-pack/plugins/security_solution/server/graphql/timeline/index.ts deleted file mode 100644 index ef78a0e8b8bdd..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/timeline/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { createTimelineResolvers } from './resolvers'; -export { timelineSchema } from './schema.gql'; diff --git a/x-pack/plugins/security_solution/server/graphql/timeline/resolvers.ts b/x-pack/plugins/security_solution/server/graphql/timeline/resolvers.ts deleted file mode 100644 index 8aa08eda95923..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/timeline/resolvers.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { AppResolverWithFields, AppResolverOf } from '../../lib/framework'; -import { MutationResolvers, QueryResolvers } from '../types'; -import { Timeline } from '../../lib/timeline/saved_object/timelines'; -import { TimelineType } from '../../../common/types/timeline'; - -export type QueryTimelineResolver = AppResolverOf; - -export type QueryAllTimelineResolver = AppResolverWithFields< - QueryResolvers.GetAllTimelineResolver, - 'totalCount' | 'timeline' ->; - -export type MutationTimelineResolver = AppResolverOf< - MutationResolvers.PersistTimelineResolver ->; - -export type MutationDeleteTimelineResolver = AppResolverOf; - -export type MutationFavoriteResolver = AppResolverOf; - -interface TimelineResolversDeps { - timeline: Timeline; -} - -export const createTimelineResolvers = ( - libs: TimelineResolversDeps -): { - Query: { - getOneTimeline: QueryTimelineResolver; - getAllTimeline: QueryAllTimelineResolver; - }; - Mutation: { - deleteTimeline: MutationDeleteTimelineResolver; - persistTimeline: MutationTimelineResolver; - persistFavorite: MutationFavoriteResolver; - }; -} => ({ - Query: { - async getOneTimeline(root, args, { req }) { - return libs.timeline.getTimeline(req, args.id, args.timelineType); - }, - async getAllTimeline(root, args, { req }) { - return libs.timeline.getAllTimeline( - req, - args.onlyUserFavorite || null, - args.pageInfo, - args.search || null, - args.sort || null, - args.status || null, - args.timelineType || null - ); - }, - }, - Mutation: { - async deleteTimeline(root, args, { req }) { - await libs.timeline.deleteTimeline(req, args.id); - - return true; - }, - async persistFavorite(root, args, { req }) { - return libs.timeline.persistFavorite( - req, - args.timelineId || null, - args.templateTimelineId || null, - args.templateTimelineVersion || null, - args.timelineType || TimelineType.default - ); - }, - async persistTimeline(root, args, { req }) { - return libs.timeline.persistTimeline( - req, - args.id || null, - args.version || null, - args.timeline - ); - }, - }, -}); diff --git a/x-pack/plugins/security_solution/server/graphql/timeline/schema.gql.ts b/x-pack/plugins/security_solution/server/graphql/timeline/schema.gql.ts deleted file mode 100644 index 98e7103e61224..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/timeline/schema.gql.ts +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import gql from 'graphql-tag'; - -const columnHeader = ` - aggregatable: Boolean - category: String - columnHeaderType: String - description: String - example: String - indexes: [String!] - id: String - name: String - placeholder: String - searchable: Boolean - type: String -`; - -const eqlOptions = ` - eventCategoryField: String - tiebreakerField: String - timestampField: String - query: String - size: ToAny -`; - -const queryMatch = ` - field: String - displayField: String - value: String - displayValue: String - operator: String -`; - -const kueryFilterQuery = ` - kind: String - expression: String -`; - -const dateRange = ` - start: ToAny - end: ToAny -`; - -const favoriteTimeline = ` - fullName: String - userName: String - favoriteDate: Float -`; - -const sortTimeline = ` - columnId: String - sortDirection: String -`; - -const filtersMetaTimeline = ` - alias: String - controlledBy: String - disabled: Boolean - field: String - formattedValue: String - index: String - key: String - negate: Boolean - params: String - type: String - value: String -`; - -export const timelineSchema = gql` - ############### - #### INPUT #### - ############### - - input ColumnHeaderInput { - ${columnHeader} - } - - input QueryMatchInput { - ${queryMatch} - } - - input DataProviderInput { - id: String - name: String - enabled: Boolean - excluded: Boolean - kqlQuery: String - queryMatch: QueryMatchInput - and: [DataProviderInput!] - type: DataProviderType - } - - enum DataProviderType { - default - template - } - - input KueryFilterQueryInput { - ${kueryFilterQuery} - } - - input SerializedKueryQueryInput { - kuery: KueryFilterQueryInput - serializedQuery: String - } - - input SerializedFilterQueryInput { - filterQuery: SerializedKueryQueryInput - } - - input DateRangePickerInput { - ${dateRange} - } - - input FavoriteTimelineInput { - ${favoriteTimeline} - } - - input SortTimelineInput { - ${sortTimeline} - } - - input FilterMetaTimelineInput { - ${filtersMetaTimeline} - } - - input EqlOptionsInput { - ${eqlOptions} - } - - input FilterTimelineInput { - exists: String - meta: FilterMetaTimelineInput - match_all: String - missing: String - query: String - range: String - script: String - } - - enum TimelineType { - default - template - } - - enum TimelineStatus { - active - draft - immutable - } - - enum RowRendererId { - alerts - auditd - auditd_file - library - netflow - plain - registry - suricata - system - system_dns - system_endgame_process - system_file - system_fim - system_security_event - system_socket - threat_match - zeek - } - - input TimelineInput { - columns: [ColumnHeaderInput!] - dataProviders: [DataProviderInput!] - description: String - eqlOptions: EqlOptionsInput - eventType: String - excludedRowRendererIds: [RowRendererId!] - filters: [FilterTimelineInput!] - kqlMode: String - kqlQuery: SerializedFilterQueryInput - indexNames: [String!] - title: String - templateTimelineId: String - templateTimelineVersion: Int - timelineType: TimelineType - dateRange: DateRangePickerInput - savedQueryId: String - sort: [SortTimelineInput!] - status: TimelineStatus - } - - input PageInfoTimeline { - pageIndex: Float! - pageSize: Float! - } - - enum SortFieldTimeline { - title - description - updated - created - } - - input SortTimeline { - sortField: SortFieldTimeline! - sortOrder: Direction! - } - - ############### - #### QUERY #### - ############### - type ColumnHeaderResult { - ${columnHeader} - } - - type QueryMatchResult { - ${queryMatch} - } - - type DataProviderResult { - id: String - name: String - enabled: Boolean - excluded: Boolean - kqlQuery: String - queryMatch: QueryMatchResult - type: DataProviderType - and: [DataProviderResult!] - } - - type KueryFilterQueryResult { - ${kueryFilterQuery} - } - - type SerializedKueryQueryResult { - kuery: KueryFilterQueryResult - serializedQuery: String - } - - type SerializedFilterQueryResult { - filterQuery: SerializedKueryQueryResult - } - - type DateRangePickerResult { - ${dateRange} - } - - type FavoriteTimelineResult { - ${favoriteTimeline} - } - - type FilterMetaTimelineResult { - ${filtersMetaTimeline} - } - - type EqlOptionsResult { - ${eqlOptions} - } - - type FilterTimelineResult { - exists: String - meta: FilterMetaTimelineResult - match_all: String - missing: String - query: String - range: String - script: String - } - - type TimelineResult { - columns: [ColumnHeaderResult!] - created: Float - createdBy: String - dataProviders: [DataProviderResult!] - dateRange: DateRangePickerResult - description: String - eqlOptions: EqlOptionsResult - eventIdToNoteIds: [NoteResult!] - eventType: String - excludedRowRendererIds: [RowRendererId!] - favorite: [FavoriteTimelineResult!] - filters: [FilterTimelineResult!] - kqlMode: String - kqlQuery: SerializedFilterQueryResult - indexNames: [String!] - notes: [NoteResult!] - noteIds: [String!] - pinnedEventIds: [String!] - pinnedEventsSaveObject: [PinnedEvent!] - savedQueryId: String - savedObjectId: String! - sort: ToAny - status: TimelineStatus - title: String - templateTimelineId: String - templateTimelineVersion: Int - timelineType: TimelineType - updated: Float - updatedBy: String - version: String! - } - - type ResponseTimeline { - code: Float - message: String - timeline: TimelineResult! - } - - type ResponseFavoriteTimeline { - code: Float - message: String - savedObjectId: String! - templateTimelineId: String - templateTimelineVersion: Int - timelineType: TimelineType - version: String! - favorite: [FavoriteTimelineResult!] - } - - type ResponseTimelines { - timeline: [TimelineResult]! - totalCount: Float - defaultTimelineCount: Float - templateTimelineCount: Float - elasticTemplateTimelineCount: Float - customTemplateTimelineCount: Float - favoriteCount: Float - } - - ######################### - #### Mutation/Query #### - ######################### - - extend type Query { - getOneTimeline(id: ID!, timelineType: TimelineType): TimelineResult! - getAllTimeline(pageInfo: PageInfoTimeline!, search: String, sort: SortTimeline, onlyUserFavorite: Boolean, timelineType: TimelineType, status: TimelineStatus): ResponseTimelines! - } - - extend type Mutation { - "Persists a timeline" - persistTimeline(id: ID, version: String, timeline: TimelineInput!): ResponseTimeline! - persistFavorite(timelineId: ID, templateTimelineId: String, templateTimelineVersion: Int, timelineType: TimelineType): ResponseFavoriteTimeline! - deleteTimeline(id: [ID!]!): Boolean! - } -`; diff --git a/x-pack/plugins/security_solution/server/graphql/types.ts b/x-pack/plugins/security_solution/server/graphql/types.ts deleted file mode 100644 index a60a6dd6093d1..0000000000000 --- a/x-pack/plugins/security_solution/server/graphql/types.ts +++ /dev/null @@ -1,5706 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { SiemContext } from '../lib/types'; - -export type Maybe = T | null; - -export interface PageInfoNote { - pageIndex: number; - - pageSize: number; -} - -export interface SortNote { - sortField: SortFieldNote; - - sortOrder: Direction; -} - -export interface PageInfoTimeline { - pageIndex: number; - - pageSize: number; -} - -export interface SortTimeline { - sortField: SortFieldTimeline; - - sortOrder: Direction; -} - -export interface NoteInput { - eventId?: Maybe; - - note?: Maybe; - - timelineId?: Maybe; -} - -export interface TimelineInput { - columns?: Maybe; - - dataProviders?: Maybe; - - description?: Maybe; - - eqlOptions?: Maybe; - - eventType?: Maybe; - - excludedRowRendererIds?: Maybe; - - filters?: Maybe; - - kqlMode?: Maybe; - - kqlQuery?: Maybe; - - indexNames?: Maybe; - - title?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - - dateRange?: Maybe; - - savedQueryId?: Maybe; - - sort?: Maybe; - - status?: Maybe; -} - -export interface ColumnHeaderInput { - aggregatable?: Maybe; - - category?: Maybe; - - columnHeaderType?: Maybe; - - description?: Maybe; - - example?: Maybe; - - indexes?: Maybe; - - id?: Maybe; - - name?: Maybe; - - placeholder?: Maybe; - - searchable?: Maybe; - - type?: Maybe; -} - -export interface DataProviderInput { - id?: Maybe; - - name?: Maybe; - - enabled?: Maybe; - - excluded?: Maybe; - - kqlQuery?: Maybe; - - queryMatch?: Maybe; - - and?: Maybe; - - type?: Maybe; -} - -export interface QueryMatchInput { - field?: Maybe; - - displayField?: Maybe; - - value?: Maybe; - - displayValue?: Maybe; - - operator?: Maybe; -} - -export interface EqlOptionsInput { - eventCategoryField?: Maybe; - - tiebreakerField?: Maybe; - - timestampField?: Maybe; - - query?: Maybe; - - size?: Maybe; -} - -export interface FilterTimelineInput { - exists?: Maybe; - - meta?: Maybe; - - match_all?: Maybe; - - missing?: Maybe; - - query?: Maybe; - - range?: Maybe; - - script?: Maybe; -} - -export interface FilterMetaTimelineInput { - alias?: Maybe; - - controlledBy?: Maybe; - - disabled?: Maybe; - - field?: Maybe; - - formattedValue?: Maybe; - - index?: Maybe; - - key?: Maybe; - - negate?: Maybe; - - params?: Maybe; - - type?: Maybe; - - value?: Maybe; -} - -export interface SerializedFilterQueryInput { - filterQuery?: Maybe; -} - -export interface SerializedKueryQueryInput { - kuery?: Maybe; - - serializedQuery?: Maybe; -} - -export interface KueryFilterQueryInput { - kind?: Maybe; - - expression?: Maybe; -} - -export interface DateRangePickerInput { - start?: Maybe; - - end?: Maybe; -} - -export interface SortTimelineInput { - columnId?: Maybe; - - sortDirection?: Maybe; -} - -export interface TimerangeInput { - /** The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan. */ - interval: string; - /** The end of the timerange */ - to: string; - /** The beginning of the timerange */ - from: string; -} - -export interface DocValueFieldsInput { - field: string; - - format: string; -} - -export interface PaginationInput { - /** The limit parameter allows you to configure the maximum amount of items to be returned */ - limit: number; - /** The cursor parameter defines the next result you want to fetch */ - cursor?: Maybe; - /** The tiebreaker parameter allow to be more precise to fetch the next item */ - tiebreaker?: Maybe; -} - -export interface PaginationInputPaginated { - /** The activePage parameter defines the page of results you want to fetch */ - activePage: number; - /** The cursorStart parameter defines the start of the results to be displayed */ - cursorStart: number; - /** The fakePossibleCount parameter determines the total count in order to show 5 additional pages */ - fakePossibleCount: number; - /** The querySize parameter is the number of items to be returned */ - querySize: number; -} - -export interface SortField { - sortFieldId: string; - - direction: Direction; -} - -export interface FavoriteTimelineInput { - fullName?: Maybe; - - userName?: Maybe; - - favoriteDate?: Maybe; -} - -export enum SortFieldNote { - updatedBy = 'updatedBy', - updated = 'updated', -} - -export enum Direction { - asc = 'asc', - desc = 'desc', -} - -export enum TimelineType { - default = 'default', - template = 'template', -} - -export enum DataProviderType { - default = 'default', - template = 'template', -} - -export enum RowRendererId { - alerts = 'alerts', - auditd = 'auditd', - auditd_file = 'auditd_file', - library = 'library', - netflow = 'netflow', - plain = 'plain', - registry = 'registry', - suricata = 'suricata', - system = 'system', - system_dns = 'system_dns', - system_endgame_process = 'system_endgame_process', - system_file = 'system_file', - system_fim = 'system_fim', - system_security_event = 'system_security_event', - system_socket = 'system_socket', - threat_match = 'threat_match', - zeek = 'zeek', -} - -export enum TimelineStatus { - active = 'active', - draft = 'draft', - immutable = 'immutable', -} - -export enum SortFieldTimeline { - title = 'title', - description = 'description', - updated = 'updated', - created = 'created', -} - -export enum FlowTarget { - client = 'client', - destination = 'destination', - server = 'server', - source = 'source', -} - -export enum FlowTargetSourceDest { - destination = 'destination', - source = 'source', -} - -export enum FlowDirection { - uniDirectional = 'uniDirectional', - biDirectional = 'biDirectional', -} - -export type ToAny = any; - -export type ToStringArray = string[] | string; - -export type ToStringArrayNoNullable = any; - -export type ToDateArray = string[] | string; - -export type ToNumberArray = number[] | number; - -export type ToBooleanArray = boolean[] | boolean; - -export type Date = string; - -export type ToIFieldSubTypeNonNullable = any; - -// ==================================================== -// Scalars -// ==================================================== - -// ==================================================== -// Types -// ==================================================== - -export interface Query { - getNote: NoteResult; - - getNotesByTimelineId: NoteResult[]; - - getNotesByEventId: NoteResult[]; - - getAllNotes: ResponseNotes; - - getAllPinnedEventsByTimelineId: PinnedEvent[]; - /** Get a security data source by id */ - source: Source; - /** Get a list of all security data sources */ - allSources: Source[]; - - getOneTimeline: TimelineResult; - - getAllTimeline: ResponseTimelines; -} - -export interface NoteResult { - eventId?: Maybe; - - note?: Maybe; - - timelineId?: Maybe; - - noteId: string; - - created?: Maybe; - - createdBy?: Maybe; - - timelineVersion?: Maybe; - - updated?: Maybe; - - updatedBy?: Maybe; - - version?: Maybe; -} - -export interface ResponseNotes { - notes: NoteResult[]; - - totalCount?: Maybe; -} - -export interface PinnedEvent { - code?: Maybe; - - message?: Maybe; - - pinnedEventId: string; - - eventId?: Maybe; - - timelineId?: Maybe; - - timelineVersion?: Maybe; - - created?: Maybe; - - createdBy?: Maybe; - - updated?: Maybe; - - updatedBy?: Maybe; - - version?: Maybe; -} - -export interface Source { - /** The id of the source */ - id: string; - /** The raw configuration of the source */ - configuration: SourceConfiguration; - /** The status of the source */ - status: SourceStatus; -} - -/** A set of configuration options for a security data source */ -export interface SourceConfiguration { - /** The field mapping to use for this source */ - fields: SourceFields; -} - -/** A mapping of semantic fields to their document counterparts */ -export interface SourceFields { - /** The field to identify a container by */ - container: string; - /** The fields to identify a host by */ - host: string; - /** The fields that may contain the log event message. The first field found win. */ - message: string[]; - /** The field to identify a pod by */ - pod: string; - /** The field to use as a tiebreaker for log events that have identical timestamps */ - tiebreaker: string; - /** The field to use as a timestamp for metrics and logs */ - timestamp: string; -} - -/** The status of an infrastructure data source */ -export interface SourceStatus { - /** Whether the configured alias or wildcard pattern resolve to any auditbeat indices */ - indicesExist: boolean; - /** The list of fields defined in the index mappings */ - indexFields: string[]; -} - -export interface TimelineResult { - columns?: Maybe; - - created?: Maybe; - - createdBy?: Maybe; - - dataProviders?: Maybe; - - dateRange?: Maybe; - - description?: Maybe; - - eqlOptions?: Maybe; - - eventIdToNoteIds?: Maybe; - - eventType?: Maybe; - - excludedRowRendererIds?: Maybe; - - favorite?: Maybe; - - filters?: Maybe; - - kqlMode?: Maybe; - - kqlQuery?: Maybe; - - indexNames?: Maybe; - - notes?: Maybe; - - noteIds?: Maybe; - - pinnedEventIds?: Maybe; - - pinnedEventsSaveObject?: Maybe; - - savedQueryId?: Maybe; - - savedObjectId: string; - - sort?: Maybe; - - status?: Maybe; - - title?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - - updated?: Maybe; - - updatedBy?: Maybe; - - version: string; -} - -export interface ColumnHeaderResult { - aggregatable?: Maybe; - - category?: Maybe; - - columnHeaderType?: Maybe; - - description?: Maybe; - - example?: Maybe; - - indexes?: Maybe; - - id?: Maybe; - - name?: Maybe; - - placeholder?: Maybe; - - searchable?: Maybe; - - type?: Maybe; -} - -export interface DataProviderResult { - id?: Maybe; - - name?: Maybe; - - enabled?: Maybe; - - excluded?: Maybe; - - kqlQuery?: Maybe; - - queryMatch?: Maybe; - - type?: Maybe; - - and?: Maybe; -} - -export interface QueryMatchResult { - field?: Maybe; - - displayField?: Maybe; - - value?: Maybe; - - displayValue?: Maybe; - - operator?: Maybe; -} - -export interface DateRangePickerResult { - start?: Maybe; - - end?: Maybe; -} - -export interface EqlOptionsResult { - eventCategoryField?: Maybe; - - tiebreakerField?: Maybe; - - timestampField?: Maybe; - - query?: Maybe; - - size?: Maybe; -} - -export interface FavoriteTimelineResult { - fullName?: Maybe; - - userName?: Maybe; - - favoriteDate?: Maybe; -} - -export interface FilterTimelineResult { - exists?: Maybe; - - meta?: Maybe; - - match_all?: Maybe; - - missing?: Maybe; - - query?: Maybe; - - range?: Maybe; - - script?: Maybe; -} - -export interface FilterMetaTimelineResult { - alias?: Maybe; - - controlledBy?: Maybe; - - disabled?: Maybe; - - field?: Maybe; - - formattedValue?: Maybe; - - index?: Maybe; - - key?: Maybe; - - negate?: Maybe; - - params?: Maybe; - - type?: Maybe; - - value?: Maybe; -} - -export interface SerializedFilterQueryResult { - filterQuery?: Maybe; -} - -export interface SerializedKueryQueryResult { - kuery?: Maybe; - - serializedQuery?: Maybe; -} - -export interface KueryFilterQueryResult { - kind?: Maybe; - - expression?: Maybe; -} - -export interface ResponseTimelines { - timeline: (Maybe)[]; - - totalCount?: Maybe; - - defaultTimelineCount?: Maybe; - - templateTimelineCount?: Maybe; - - elasticTemplateTimelineCount?: Maybe; - - customTemplateTimelineCount?: Maybe; - - favoriteCount?: Maybe; -} - -export interface Mutation { - /** Persists a note */ - persistNote: ResponseNote; - - deleteNote?: Maybe; - - deleteNoteByTimelineId?: Maybe; - /** Persists a pinned event in a timeline */ - persistPinnedEventOnTimeline?: Maybe; - /** Remove a pinned events in a timeline */ - deletePinnedEventOnTimeline: boolean; - /** Remove all pinned events in a timeline */ - deleteAllPinnedEventsOnTimeline: boolean; - /** Persists a timeline */ - persistTimeline: ResponseTimeline; - - persistFavorite: ResponseFavoriteTimeline; - - deleteTimeline: boolean; -} - -export interface ResponseNote { - code?: Maybe; - - message?: Maybe; - - note: NoteResult; -} - -export interface ResponseTimeline { - code?: Maybe; - - message?: Maybe; - - timeline: TimelineResult; -} - -export interface ResponseFavoriteTimeline { - code?: Maybe; - - message?: Maybe; - - savedObjectId: string; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - - version: string; - - favorite?: Maybe; -} - -export interface EventEcsFields { - action?: Maybe; - - category?: Maybe; - - code?: Maybe; - - created?: Maybe; - - dataset?: Maybe; - - duration?: Maybe; - - end?: Maybe; - - hash?: Maybe; - - id?: Maybe; - - kind?: Maybe; - - module?: Maybe; - - original?: Maybe; - - outcome?: Maybe; - - risk_score?: Maybe; - - risk_score_norm?: Maybe; - - severity?: Maybe; - - start?: Maybe; - - timezone?: Maybe; - - type?: Maybe; -} - -export interface Location { - lon?: Maybe; - - lat?: Maybe; -} - -export interface GeoEcsFields { - city_name?: Maybe; - - continent_name?: Maybe; - - country_iso_code?: Maybe; - - country_name?: Maybe; - - location?: Maybe; - - region_iso_code?: Maybe; - - region_name?: Maybe; -} - -export interface PrimarySecondary { - primary?: Maybe; - - secondary?: Maybe; - - type?: Maybe; -} - -export interface Summary { - actor?: Maybe; - - object?: Maybe; - - how?: Maybe; - - message_type?: Maybe; - - sequence?: Maybe; -} - -export interface AgentEcsField { - type?: Maybe; -} - -export interface AuditdData { - acct?: Maybe; - - terminal?: Maybe; - - op?: Maybe; -} - -export interface AuditdEcsFields { - result?: Maybe; - - session?: Maybe; - - data?: Maybe; - - summary?: Maybe; - - sequence?: Maybe; -} - -export interface OsEcsFields { - platform?: Maybe; - - name?: Maybe; - - full?: Maybe; - - family?: Maybe; - - version?: Maybe; - - kernel?: Maybe; -} - -export interface HostEcsFields { - architecture?: Maybe; - - id?: Maybe; - - ip?: Maybe; - - mac?: Maybe; - - name?: Maybe; - - os?: Maybe; - - type?: Maybe; -} - -export interface Thread { - id?: Maybe; - - start?: Maybe; -} - -export interface ProcessHashData { - md5?: Maybe; - - sha1?: Maybe; - - sha256?: Maybe; -} - -export interface ProcessEcsFields { - hash?: Maybe; - - pid?: Maybe; - - name?: Maybe; - - ppid?: Maybe; - - args?: Maybe; - - entity_id?: Maybe; - - executable?: Maybe; - - title?: Maybe; - - thread?: Maybe; - - working_directory?: Maybe; -} - -export interface SourceEcsFields { - bytes?: Maybe; - - ip?: Maybe; - - port?: Maybe; - - domain?: Maybe; - - geo?: Maybe; - - packets?: Maybe; -} - -export interface DestinationEcsFields { - bytes?: Maybe; - - ip?: Maybe; - - port?: Maybe; - - domain?: Maybe; - - geo?: Maybe; - - packets?: Maybe; -} - -export interface DnsQuestionData { - name?: Maybe; - - type?: Maybe; -} - -export interface DnsEcsFields { - question?: Maybe; - - resolved_ip?: Maybe; - - response_code?: Maybe; -} - -export interface EndgameEcsFields { - exit_code?: Maybe; - - file_name?: Maybe; - - file_path?: Maybe; - - logon_type?: Maybe; - - parent_process_name?: Maybe; - - pid?: Maybe; - - process_name?: Maybe; - - subject_domain_name?: Maybe; - - subject_logon_id?: Maybe; - - subject_user_name?: Maybe; - - target_domain_name?: Maybe; - - target_logon_id?: Maybe; - - target_user_name?: Maybe; -} - -export interface SuricataAlertData { - signature?: Maybe; - - signature_id?: Maybe; -} - -export interface SuricataEveData { - alert?: Maybe; - - flow_id?: Maybe; - - proto?: Maybe; -} - -export interface SuricataEcsFields { - eve?: Maybe; -} - -export interface TlsJa3Data { - hash?: Maybe; -} - -export interface FingerprintData { - sha1?: Maybe; -} - -export interface TlsClientCertificateData { - fingerprint?: Maybe; -} - -export interface TlsServerCertificateData { - fingerprint?: Maybe; -} - -export interface TlsFingerprintsData { - ja3?: Maybe; -} - -export interface TlsEcsFields { - client_certificate?: Maybe; - - fingerprints?: Maybe; - - server_certificate?: Maybe; -} - -export interface ZeekConnectionData { - local_resp?: Maybe; - - local_orig?: Maybe; - - missed_bytes?: Maybe; - - state?: Maybe; - - history?: Maybe; -} - -export interface ZeekNoticeData { - suppress_for?: Maybe; - - msg?: Maybe; - - note?: Maybe; - - sub?: Maybe; - - dst?: Maybe; - - dropped?: Maybe; - - peer_descr?: Maybe; -} - -export interface ZeekDnsData { - AA?: Maybe; - - qclass_name?: Maybe; - - RD?: Maybe; - - qtype_name?: Maybe; - - rejected?: Maybe; - - qtype?: Maybe; - - query?: Maybe; - - trans_id?: Maybe; - - qclass?: Maybe; - - RA?: Maybe; - - TC?: Maybe; -} - -export interface FileFields { - name?: Maybe; - - path?: Maybe; - - target_path?: Maybe; - - extension?: Maybe; - - type?: Maybe; - - device?: Maybe; - - inode?: Maybe; - - uid?: Maybe; - - owner?: Maybe; - - gid?: Maybe; - - group?: Maybe; - - mode?: Maybe; - - size?: Maybe; - - mtime?: Maybe; - - ctime?: Maybe; -} - -export interface ZeekHttpData { - resp_mime_types?: Maybe; - - trans_depth?: Maybe; - - status_msg?: Maybe; - - resp_fuids?: Maybe; - - tags?: Maybe; -} - -export interface HttpBodyData { - content?: Maybe; - - bytes?: Maybe; -} - -export interface HttpRequestData { - method?: Maybe; - - body?: Maybe; - - referrer?: Maybe; - - bytes?: Maybe; -} - -export interface HttpResponseData { - status_code?: Maybe; - - body?: Maybe; - - bytes?: Maybe; -} - -export interface HttpEcsFields { - version?: Maybe; - - request?: Maybe; - - response?: Maybe; -} - -export interface UrlEcsFields { - domain?: Maybe; - - original?: Maybe; - - username?: Maybe; - - password?: Maybe; -} - -export interface ZeekFileData { - session_ids?: Maybe; - - timedout?: Maybe; - - local_orig?: Maybe; - - tx_host?: Maybe; - - source?: Maybe; - - is_orig?: Maybe; - - overflow_bytes?: Maybe; - - sha1?: Maybe; - - duration?: Maybe; - - depth?: Maybe; - - analyzers?: Maybe; - - mime_type?: Maybe; - - rx_host?: Maybe; - - total_bytes?: Maybe; - - fuid?: Maybe; - - seen_bytes?: Maybe; - - missing_bytes?: Maybe; - - md5?: Maybe; -} - -export interface ZeekSslData { - cipher?: Maybe; - - established?: Maybe; - - resumed?: Maybe; - - version?: Maybe; -} - -export interface ZeekEcsFields { - session_id?: Maybe; - - connection?: Maybe; - - notice?: Maybe; - - dns?: Maybe; - - http?: Maybe; - - files?: Maybe; - - ssl?: Maybe; -} - -export interface UserEcsFields { - domain?: Maybe; - - id?: Maybe; - - name?: Maybe; - - full_name?: Maybe; - - email?: Maybe; - - hash?: Maybe; - - group?: Maybe; -} - -export interface WinlogEcsFields { - event_id?: Maybe; -} - -export interface NetworkEcsField { - bytes?: Maybe; - - community_id?: Maybe; - - direction?: Maybe; - - packets?: Maybe; - - protocol?: Maybe; - - transport?: Maybe; -} - -export interface PackageEcsFields { - arch?: Maybe; - - entity_id?: Maybe; - - name?: Maybe; - - size?: Maybe; - - summary?: Maybe; - - version?: Maybe; -} - -export interface AuditEcsFields { - package?: Maybe; -} - -export interface SshEcsFields { - method?: Maybe; - - signature?: Maybe; -} - -export interface AuthEcsFields { - ssh?: Maybe; -} - -export interface SystemEcsField { - audit?: Maybe; - - auth?: Maybe; -} - -export interface RuleField { - id?: Maybe; - - rule_id?: Maybe; - - false_positives: string[]; - - saved_id?: Maybe; - - timeline_id?: Maybe; - - timeline_title?: Maybe; - - max_signals?: Maybe; - - risk_score?: Maybe; - - output_index?: Maybe; - - description?: Maybe; - - from?: Maybe; - - immutable?: Maybe; - - index?: Maybe; - - interval?: Maybe; - - language?: Maybe; - - query?: Maybe; - - references?: Maybe; - - severity?: Maybe; - - tags?: Maybe; - - threat?: Maybe; - - type?: Maybe; - - size?: Maybe; - - to?: Maybe; - - enabled?: Maybe; - - filters?: Maybe; - - created_at?: Maybe; - - updated_at?: Maybe; - - created_by?: Maybe; - - updated_by?: Maybe; - - version?: Maybe; - - note?: Maybe; - - threshold?: Maybe; - - exceptions_list?: Maybe; -} - -export interface SignalField { - rule?: Maybe; - - original_time?: Maybe; - - status?: Maybe; -} - -export interface RuleEcsField { - reference?: Maybe; -} - -export interface Ecs { - _id: string; - - _index?: Maybe; - - agent?: Maybe; - - auditd?: Maybe; - - destination?: Maybe; - - dns?: Maybe; - - endgame?: Maybe; - - event?: Maybe; - - geo?: Maybe; - - host?: Maybe; - - network?: Maybe; - - rule?: Maybe; - - signal?: Maybe; - - source?: Maybe; - - suricata?: Maybe; - - tls?: Maybe; - - zeek?: Maybe; - - http?: Maybe; - - url?: Maybe; - - timestamp?: Maybe; - - message?: Maybe; - - user?: Maybe; - - winlog?: Maybe; - - process?: Maybe; - - file?: Maybe; - - system?: Maybe; -} - -export interface EcsEdges { - node: Ecs; - - cursor: CursorType; -} - -export interface CursorType { - value?: Maybe; - - tiebreaker?: Maybe; -} - -/** A descriptor of a field in an index */ -export interface IndexField { - /** Where the field belong */ - category: string; - /** Example of field's value */ - example?: Maybe; - /** whether the field's belong to an alias index */ - indexes: (Maybe)[]; - /** The name of the field */ - name: string; - /** The type of the field's values as recognized by Kibana */ - type: string; - /** Whether the field's values can be efficiently searched for */ - searchable: boolean; - /** Whether the field's values can be aggregated */ - aggregatable: boolean; - /** Description of the field */ - description?: Maybe; - - format?: Maybe; - /** the elastic type as mapped in the index */ - esTypes?: Maybe; - - subType?: Maybe; -} - -export interface PageInfo { - endCursor?: Maybe; - - hasNextPage?: Maybe; -} - -export interface Inspect { - dsl: string[]; - - response: string[]; -} - -export interface PageInfoPaginated { - activePage: number; - - fakeTotalCount: number; - - showMorePagesIndicator: boolean; -} - -// ==================================================== -// Arguments -// ==================================================== - -export interface GetNoteQueryArgs { - id: string; -} -export interface GetNotesByTimelineIdQueryArgs { - timelineId: string; -} -export interface GetNotesByEventIdQueryArgs { - eventId: string; -} -export interface GetAllNotesQueryArgs { - pageInfo?: Maybe; - - search?: Maybe; - - sort?: Maybe; -} -export interface GetAllPinnedEventsByTimelineIdQueryArgs { - timelineId: string; -} -export interface SourceQueryArgs { - /** The id of the source */ - id: string; -} -export interface GetOneTimelineQueryArgs { - id: string; - - timelineType?: Maybe; -} -export interface GetAllTimelineQueryArgs { - pageInfo: PageInfoTimeline; - - search?: Maybe; - - sort?: Maybe; - - onlyUserFavorite?: Maybe; - - timelineType?: Maybe; - - status?: Maybe; -} -export interface IndicesExistSourceStatusArgs { - defaultIndex: string[]; -} -export interface IndexFieldsSourceStatusArgs { - defaultIndex: string[]; -} -export interface PersistNoteMutationArgs { - noteId?: Maybe; - - version?: Maybe; - - note: NoteInput; -} -export interface DeleteNoteMutationArgs { - id: string[]; -} -export interface DeleteNoteByTimelineIdMutationArgs { - timelineId: string; - - version?: Maybe; -} -export interface PersistPinnedEventOnTimelineMutationArgs { - pinnedEventId?: Maybe; - - eventId: string; - - timelineId?: Maybe; -} -export interface DeletePinnedEventOnTimelineMutationArgs { - id: string[]; -} -export interface DeleteAllPinnedEventsOnTimelineMutationArgs { - timelineId: string; -} -export interface PersistTimelineMutationArgs { - id?: Maybe; - - version?: Maybe; - - timeline: TimelineInput; -} -export interface PersistFavoriteMutationArgs { - timelineId?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; -} -export interface DeleteTimelineMutationArgs { - id: string[]; -} - -import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; - -export type Resolver = ( - parent: Parent, - args: Args, - context: TContext, - info: GraphQLResolveInfo -) => Promise | Result; - -export interface ISubscriptionResolverObject { - subscribe( - parent: P, - args: Args, - context: TContext, - info: GraphQLResolveInfo - ): AsyncIterator | Promise>; - resolve?( - parent: P, - args: Args, - context: TContext, - info: GraphQLResolveInfo - ): R | Result | Promise; -} - -export type SubscriptionResolver = - | ((...args: any[]) => ISubscriptionResolverObject) - | ISubscriptionResolverObject; - -export type TypeResolveFn = ( - parent: Parent, - context: TContext, - info: GraphQLResolveInfo -) => Maybe; - -export type NextResolverFn = () => Promise; - -export type DirectiveResolverFn = ( - next: NextResolverFn, - source: any, - args: TArgs, - context: TContext, - info: GraphQLResolveInfo -) => TResult | Promise; - -export namespace QueryResolvers { - export interface Resolvers { - getNote?: GetNoteResolver; - - getNotesByTimelineId?: GetNotesByTimelineIdResolver; - - getNotesByEventId?: GetNotesByEventIdResolver; - - getAllNotes?: GetAllNotesResolver; - - getAllPinnedEventsByTimelineId?: GetAllPinnedEventsByTimelineIdResolver< - PinnedEvent[], - TypeParent, - TContext - >; - /** Get a security data source by id */ - source?: SourceResolver; - /** Get a list of all security data sources */ - allSources?: AllSourcesResolver; - - getOneTimeline?: GetOneTimelineResolver; - - getAllTimeline?: GetAllTimelineResolver; - } - - export type GetNoteResolver = Resolver< - R, - Parent, - TContext, - GetNoteArgs - >; - export interface GetNoteArgs { - id: string; - } - - export type GetNotesByTimelineIdResolver< - R = NoteResult[], - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface GetNotesByTimelineIdArgs { - timelineId: string; - } - - export type GetNotesByEventIdResolver< - R = NoteResult[], - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface GetNotesByEventIdArgs { - eventId: string; - } - - export type GetAllNotesResolver< - R = ResponseNotes, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface GetAllNotesArgs { - pageInfo?: Maybe; - - search?: Maybe; - - sort?: Maybe; - } - - export type GetAllPinnedEventsByTimelineIdResolver< - R = PinnedEvent[], - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface GetAllPinnedEventsByTimelineIdArgs { - timelineId: string; - } - - export type SourceResolver = Resolver< - R, - Parent, - TContext, - SourceArgs - >; - export interface SourceArgs { - /** The id of the source */ - id: string; - } - - export type AllSourcesResolver = Resolver< - R, - Parent, - TContext - >; - export type GetOneTimelineResolver< - R = TimelineResult, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface GetOneTimelineArgs { - id: string; - - timelineType?: Maybe; - } - - export type GetAllTimelineResolver< - R = ResponseTimelines, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface GetAllTimelineArgs { - pageInfo: PageInfoTimeline; - - search?: Maybe; - - sort?: Maybe; - - onlyUserFavorite?: Maybe; - - timelineType?: Maybe; - - status?: Maybe; - } -} - -export namespace NoteResultResolvers { - export interface Resolvers { - eventId?: EventIdResolver, TypeParent, TContext>; - - note?: NoteResolver, TypeParent, TContext>; - - timelineId?: TimelineIdResolver, TypeParent, TContext>; - - noteId?: NoteIdResolver; - - created?: CreatedResolver, TypeParent, TContext>; - - createdBy?: CreatedByResolver, TypeParent, TContext>; - - timelineVersion?: TimelineVersionResolver, TypeParent, TContext>; - - updated?: UpdatedResolver, TypeParent, TContext>; - - updatedBy?: UpdatedByResolver, TypeParent, TContext>; - - version?: VersionResolver, TypeParent, TContext>; - } - - export type EventIdResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type NoteResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type TimelineIdResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type NoteIdResolver = Resolver< - R, - Parent, - TContext - >; - export type CreatedResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type CreatedByResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type TimelineVersionResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type UpdatedResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type UpdatedByResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = Maybe, - Parent = NoteResult, - TContext = SiemContext - > = Resolver; -} - -export namespace ResponseNotesResolvers { - export interface Resolvers { - notes?: NotesResolver; - - totalCount?: TotalCountResolver, TypeParent, TContext>; - } - - export type NotesResolver< - R = NoteResult[], - Parent = ResponseNotes, - TContext = SiemContext - > = Resolver; - export type TotalCountResolver< - R = Maybe, - Parent = ResponseNotes, - TContext = SiemContext - > = Resolver; -} - -export namespace PinnedEventResolvers { - export interface Resolvers { - code?: CodeResolver, TypeParent, TContext>; - - message?: MessageResolver, TypeParent, TContext>; - - pinnedEventId?: PinnedEventIdResolver; - - eventId?: EventIdResolver, TypeParent, TContext>; - - timelineId?: TimelineIdResolver, TypeParent, TContext>; - - timelineVersion?: TimelineVersionResolver, TypeParent, TContext>; - - created?: CreatedResolver, TypeParent, TContext>; - - createdBy?: CreatedByResolver, TypeParent, TContext>; - - updated?: UpdatedResolver, TypeParent, TContext>; - - updatedBy?: UpdatedByResolver, TypeParent, TContext>; - - version?: VersionResolver, TypeParent, TContext>; - } - - export type CodeResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type MessageResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type PinnedEventIdResolver< - R = string, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type EventIdResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type TimelineIdResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type TimelineVersionResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type CreatedResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type CreatedByResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type UpdatedResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type UpdatedByResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = Maybe, - Parent = PinnedEvent, - TContext = SiemContext - > = Resolver; -} - -export namespace SourceResolvers { - export interface Resolvers { - /** The id of the source */ - id?: IdResolver; - /** The raw configuration of the source */ - configuration?: ConfigurationResolver; - /** The status of the source */ - status?: StatusResolver; - } - - export type IdResolver = Resolver< - R, - Parent, - TContext - >; - export type ConfigurationResolver< - R = SourceConfiguration, - Parent = Source, - TContext = SiemContext - > = Resolver; - export type StatusResolver = Resolver< - R, - Parent, - TContext - >; -} -/** A set of configuration options for a security data source */ -export namespace SourceConfigurationResolvers { - export interface Resolvers { - /** The field mapping to use for this source */ - fields?: FieldsResolver; - } - - export type FieldsResolver< - R = SourceFields, - Parent = SourceConfiguration, - TContext = SiemContext - > = Resolver; -} -/** A mapping of semantic fields to their document counterparts */ -export namespace SourceFieldsResolvers { - export interface Resolvers { - /** The field to identify a container by */ - container?: ContainerResolver; - /** The fields to identify a host by */ - host?: HostResolver; - /** The fields that may contain the log event message. The first field found win. */ - message?: MessageResolver; - /** The field to identify a pod by */ - pod?: PodResolver; - /** The field to use as a tiebreaker for log events that have identical timestamps */ - tiebreaker?: TiebreakerResolver; - /** The field to use as a timestamp for metrics and logs */ - timestamp?: TimestampResolver; - } - - export type ContainerResolver< - R = string, - Parent = SourceFields, - TContext = SiemContext - > = Resolver; - export type HostResolver = Resolver< - R, - Parent, - TContext - >; - export type MessageResolver< - R = string[], - Parent = SourceFields, - TContext = SiemContext - > = Resolver; - export type PodResolver = Resolver< - R, - Parent, - TContext - >; - export type TiebreakerResolver< - R = string, - Parent = SourceFields, - TContext = SiemContext - > = Resolver; - export type TimestampResolver< - R = string, - Parent = SourceFields, - TContext = SiemContext - > = Resolver; -} -/** The status of an infrastructure data source */ -export namespace SourceStatusResolvers { - export interface Resolvers { - /** Whether the configured alias or wildcard pattern resolve to any auditbeat indices */ - indicesExist?: IndicesExistResolver; - /** The list of fields defined in the index mappings */ - indexFields?: IndexFieldsResolver; - } - - export type IndicesExistResolver< - R = boolean, - Parent = SourceStatus, - TContext = SiemContext - > = Resolver; - export interface IndicesExistArgs { - defaultIndex: string[]; - } - - export type IndexFieldsResolver< - R = string[], - Parent = SourceStatus, - TContext = SiemContext - > = Resolver; - export interface IndexFieldsArgs { - defaultIndex: string[]; - } -} - -export namespace TimelineResultResolvers { - export interface Resolvers { - columns?: ColumnsResolver, TypeParent, TContext>; - - created?: CreatedResolver, TypeParent, TContext>; - - createdBy?: CreatedByResolver, TypeParent, TContext>; - - dataProviders?: DataProvidersResolver, TypeParent, TContext>; - - dateRange?: DateRangeResolver, TypeParent, TContext>; - - description?: DescriptionResolver, TypeParent, TContext>; - - eqlOptions?: EqlOptionsResolver, TypeParent, TContext>; - - eventIdToNoteIds?: EventIdToNoteIdsResolver, TypeParent, TContext>; - - eventType?: EventTypeResolver, TypeParent, TContext>; - - excludedRowRendererIds?: ExcludedRowRendererIdsResolver< - Maybe, - TypeParent, - TContext - >; - - favorite?: FavoriteResolver, TypeParent, TContext>; - - filters?: FiltersResolver, TypeParent, TContext>; - - kqlMode?: KqlModeResolver, TypeParent, TContext>; - - kqlQuery?: KqlQueryResolver, TypeParent, TContext>; - - indexNames?: IndexNamesResolver, TypeParent, TContext>; - - notes?: NotesResolver, TypeParent, TContext>; - - noteIds?: NoteIdsResolver, TypeParent, TContext>; - - pinnedEventIds?: PinnedEventIdsResolver, TypeParent, TContext>; - - pinnedEventsSaveObject?: PinnedEventsSaveObjectResolver< - Maybe, - TypeParent, - TContext - >; - - savedQueryId?: SavedQueryIdResolver, TypeParent, TContext>; - - savedObjectId?: SavedObjectIdResolver; - - sort?: SortResolver, TypeParent, TContext>; - - status?: StatusResolver, TypeParent, TContext>; - - title?: TitleResolver, TypeParent, TContext>; - - templateTimelineId?: TemplateTimelineIdResolver, TypeParent, TContext>; - - templateTimelineVersion?: TemplateTimelineVersionResolver, TypeParent, TContext>; - - timelineType?: TimelineTypeResolver, TypeParent, TContext>; - - updated?: UpdatedResolver, TypeParent, TContext>; - - updatedBy?: UpdatedByResolver, TypeParent, TContext>; - - version?: VersionResolver; - } - - export type ColumnsResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type CreatedResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type CreatedByResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type DataProvidersResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type DateRangeResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type DescriptionResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type EqlOptionsResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type EventIdToNoteIdsResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type EventTypeResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type ExcludedRowRendererIdsResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type FavoriteResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type FiltersResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type KqlModeResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type KqlQueryResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type IndexNamesResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type NotesResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type NoteIdsResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type PinnedEventIdsResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type PinnedEventsSaveObjectResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type SavedQueryIdResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type SavedObjectIdResolver< - R = string, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type SortResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type StatusResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type TitleResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type TemplateTimelineIdResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type TemplateTimelineVersionResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type TimelineTypeResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type UpdatedResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type UpdatedByResolver< - R = Maybe, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = string, - Parent = TimelineResult, - TContext = SiemContext - > = Resolver; -} - -export namespace ColumnHeaderResultResolvers { - export interface Resolvers { - aggregatable?: AggregatableResolver, TypeParent, TContext>; - - category?: CategoryResolver, TypeParent, TContext>; - - columnHeaderType?: ColumnHeaderTypeResolver, TypeParent, TContext>; - - description?: DescriptionResolver, TypeParent, TContext>; - - example?: ExampleResolver, TypeParent, TContext>; - - indexes?: IndexesResolver, TypeParent, TContext>; - - id?: IdResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - placeholder?: PlaceholderResolver, TypeParent, TContext>; - - searchable?: SearchableResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - } - - export type AggregatableResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type CategoryResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type ColumnHeaderTypeResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type DescriptionResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type ExampleResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type IndexesResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type IdResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type PlaceholderResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type SearchableResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = ColumnHeaderResult, - TContext = SiemContext - > = Resolver; -} - -export namespace DataProviderResultResolvers { - export interface Resolvers { - id?: IdResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - enabled?: EnabledResolver, TypeParent, TContext>; - - excluded?: ExcludedResolver, TypeParent, TContext>; - - kqlQuery?: KqlQueryResolver, TypeParent, TContext>; - - queryMatch?: QueryMatchResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - - and?: AndResolver, TypeParent, TContext>; - } - - export type IdResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type EnabledResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type ExcludedResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type KqlQueryResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type QueryMatchResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; - export type AndResolver< - R = Maybe, - Parent = DataProviderResult, - TContext = SiemContext - > = Resolver; -} - -export namespace QueryMatchResultResolvers { - export interface Resolvers { - field?: FieldResolver, TypeParent, TContext>; - - displayField?: DisplayFieldResolver, TypeParent, TContext>; - - value?: ValueResolver, TypeParent, TContext>; - - displayValue?: DisplayValueResolver, TypeParent, TContext>; - - operator?: OperatorResolver, TypeParent, TContext>; - } - - export type FieldResolver< - R = Maybe, - Parent = QueryMatchResult, - TContext = SiemContext - > = Resolver; - export type DisplayFieldResolver< - R = Maybe, - Parent = QueryMatchResult, - TContext = SiemContext - > = Resolver; - export type ValueResolver< - R = Maybe, - Parent = QueryMatchResult, - TContext = SiemContext - > = Resolver; - export type DisplayValueResolver< - R = Maybe, - Parent = QueryMatchResult, - TContext = SiemContext - > = Resolver; - export type OperatorResolver< - R = Maybe, - Parent = QueryMatchResult, - TContext = SiemContext - > = Resolver; -} - -export namespace DateRangePickerResultResolvers { - export interface Resolvers { - start?: StartResolver, TypeParent, TContext>; - - end?: EndResolver, TypeParent, TContext>; - } - - export type StartResolver< - R = Maybe, - Parent = DateRangePickerResult, - TContext = SiemContext - > = Resolver; - export type EndResolver< - R = Maybe, - Parent = DateRangePickerResult, - TContext = SiemContext - > = Resolver; -} - -export namespace EqlOptionsResultResolvers { - export interface Resolvers { - eventCategoryField?: EventCategoryFieldResolver, TypeParent, TContext>; - - tiebreakerField?: TiebreakerFieldResolver, TypeParent, TContext>; - - timestampField?: TimestampFieldResolver, TypeParent, TContext>; - - query?: QueryResolver, TypeParent, TContext>; - - size?: SizeResolver, TypeParent, TContext>; - } - - export type EventCategoryFieldResolver< - R = Maybe, - Parent = EqlOptionsResult, - TContext = SiemContext - > = Resolver; - export type TiebreakerFieldResolver< - R = Maybe, - Parent = EqlOptionsResult, - TContext = SiemContext - > = Resolver; - export type TimestampFieldResolver< - R = Maybe, - Parent = EqlOptionsResult, - TContext = SiemContext - > = Resolver; - export type QueryResolver< - R = Maybe, - Parent = EqlOptionsResult, - TContext = SiemContext - > = Resolver; - export type SizeResolver< - R = Maybe, - Parent = EqlOptionsResult, - TContext = SiemContext - > = Resolver; -} - -export namespace FavoriteTimelineResultResolvers { - export interface Resolvers { - fullName?: FullNameResolver, TypeParent, TContext>; - - userName?: UserNameResolver, TypeParent, TContext>; - - favoriteDate?: FavoriteDateResolver, TypeParent, TContext>; - } - - export type FullNameResolver< - R = Maybe, - Parent = FavoriteTimelineResult, - TContext = SiemContext - > = Resolver; - export type UserNameResolver< - R = Maybe, - Parent = FavoriteTimelineResult, - TContext = SiemContext - > = Resolver; - export type FavoriteDateResolver< - R = Maybe, - Parent = FavoriteTimelineResult, - TContext = SiemContext - > = Resolver; -} - -export namespace FilterTimelineResultResolvers { - export interface Resolvers { - exists?: ExistsResolver, TypeParent, TContext>; - - meta?: MetaResolver, TypeParent, TContext>; - - match_all?: MatchAllResolver, TypeParent, TContext>; - - missing?: MissingResolver, TypeParent, TContext>; - - query?: QueryResolver, TypeParent, TContext>; - - range?: RangeResolver, TypeParent, TContext>; - - script?: ScriptResolver, TypeParent, TContext>; - } - - export type ExistsResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; - export type MetaResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; - export type MatchAllResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; - export type MissingResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; - export type QueryResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; - export type RangeResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; - export type ScriptResolver< - R = Maybe, - Parent = FilterTimelineResult, - TContext = SiemContext - > = Resolver; -} - -export namespace FilterMetaTimelineResultResolvers { - export interface Resolvers { - alias?: AliasResolver, TypeParent, TContext>; - - controlledBy?: ControlledByResolver, TypeParent, TContext>; - - disabled?: DisabledResolver, TypeParent, TContext>; - - field?: FieldResolver, TypeParent, TContext>; - - formattedValue?: FormattedValueResolver, TypeParent, TContext>; - - index?: IndexResolver, TypeParent, TContext>; - - key?: KeyResolver, TypeParent, TContext>; - - negate?: NegateResolver, TypeParent, TContext>; - - params?: ParamsResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - - value?: ValueResolver, TypeParent, TContext>; - } - - export type AliasResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type ControlledByResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type DisabledResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type FieldResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type FormattedValueResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type IndexResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type KeyResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type NegateResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type ParamsResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; - export type ValueResolver< - R = Maybe, - Parent = FilterMetaTimelineResult, - TContext = SiemContext - > = Resolver; -} - -export namespace SerializedFilterQueryResultResolvers { - export interface Resolvers { - filterQuery?: FilterQueryResolver, TypeParent, TContext>; - } - - export type FilterQueryResolver< - R = Maybe, - Parent = SerializedFilterQueryResult, - TContext = SiemContext - > = Resolver; -} - -export namespace SerializedKueryQueryResultResolvers { - export interface Resolvers { - kuery?: KueryResolver, TypeParent, TContext>; - - serializedQuery?: SerializedQueryResolver, TypeParent, TContext>; - } - - export type KueryResolver< - R = Maybe, - Parent = SerializedKueryQueryResult, - TContext = SiemContext - > = Resolver; - export type SerializedQueryResolver< - R = Maybe, - Parent = SerializedKueryQueryResult, - TContext = SiemContext - > = Resolver; -} - -export namespace KueryFilterQueryResultResolvers { - export interface Resolvers { - kind?: KindResolver, TypeParent, TContext>; - - expression?: ExpressionResolver, TypeParent, TContext>; - } - - export type KindResolver< - R = Maybe, - Parent = KueryFilterQueryResult, - TContext = SiemContext - > = Resolver; - export type ExpressionResolver< - R = Maybe, - Parent = KueryFilterQueryResult, - TContext = SiemContext - > = Resolver; -} - -export namespace ResponseTimelinesResolvers { - export interface Resolvers { - timeline?: TimelineResolver<(Maybe)[], TypeParent, TContext>; - - totalCount?: TotalCountResolver, TypeParent, TContext>; - - defaultTimelineCount?: DefaultTimelineCountResolver, TypeParent, TContext>; - - templateTimelineCount?: TemplateTimelineCountResolver, TypeParent, TContext>; - - elasticTemplateTimelineCount?: ElasticTemplateTimelineCountResolver< - Maybe, - TypeParent, - TContext - >; - - customTemplateTimelineCount?: CustomTemplateTimelineCountResolver< - Maybe, - TypeParent, - TContext - >; - - favoriteCount?: FavoriteCountResolver, TypeParent, TContext>; - } - - export type TimelineResolver< - R = (Maybe)[], - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; - export type TotalCountResolver< - R = Maybe, - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; - export type DefaultTimelineCountResolver< - R = Maybe, - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; - export type TemplateTimelineCountResolver< - R = Maybe, - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; - export type ElasticTemplateTimelineCountResolver< - R = Maybe, - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; - export type CustomTemplateTimelineCountResolver< - R = Maybe, - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; - export type FavoriteCountResolver< - R = Maybe, - Parent = ResponseTimelines, - TContext = SiemContext - > = Resolver; -} - -export namespace MutationResolvers { - export interface Resolvers { - /** Persists a note */ - persistNote?: PersistNoteResolver; - - deleteNote?: DeleteNoteResolver, TypeParent, TContext>; - - deleteNoteByTimelineId?: DeleteNoteByTimelineIdResolver, TypeParent, TContext>; - /** Persists a pinned event in a timeline */ - persistPinnedEventOnTimeline?: PersistPinnedEventOnTimelineResolver< - Maybe, - TypeParent, - TContext - >; - /** Remove a pinned events in a timeline */ - deletePinnedEventOnTimeline?: DeletePinnedEventOnTimelineResolver< - boolean, - TypeParent, - TContext - >; - /** Remove all pinned events in a timeline */ - deleteAllPinnedEventsOnTimeline?: DeleteAllPinnedEventsOnTimelineResolver< - boolean, - TypeParent, - TContext - >; - /** Persists a timeline */ - persistTimeline?: PersistTimelineResolver; - - persistFavorite?: PersistFavoriteResolver; - - deleteTimeline?: DeleteTimelineResolver; - } - - export type PersistNoteResolver = Resolver< - R, - Parent, - TContext, - PersistNoteArgs - >; - export interface PersistNoteArgs { - noteId?: Maybe; - - version?: Maybe; - - note: NoteInput; - } - - export type DeleteNoteResolver< - R = Maybe, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface DeleteNoteArgs { - id: string[]; - } - - export type DeleteNoteByTimelineIdResolver< - R = Maybe, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface DeleteNoteByTimelineIdArgs { - timelineId: string; - - version?: Maybe; - } - - export type PersistPinnedEventOnTimelineResolver< - R = Maybe, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface PersistPinnedEventOnTimelineArgs { - pinnedEventId?: Maybe; - - eventId: string; - - timelineId?: Maybe; - } - - export type DeletePinnedEventOnTimelineResolver< - R = boolean, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface DeletePinnedEventOnTimelineArgs { - id: string[]; - } - - export type DeleteAllPinnedEventsOnTimelineResolver< - R = boolean, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface DeleteAllPinnedEventsOnTimelineArgs { - timelineId: string; - } - - export type PersistTimelineResolver< - R = ResponseTimeline, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface PersistTimelineArgs { - id?: Maybe; - - version?: Maybe; - - timeline: TimelineInput; - } - - export type PersistFavoriteResolver< - R = ResponseFavoriteTimeline, - Parent = {}, - TContext = SiemContext - > = Resolver; - export interface PersistFavoriteArgs { - timelineId?: Maybe; - - templateTimelineId?: Maybe; - - templateTimelineVersion?: Maybe; - - timelineType?: Maybe; - } - - export type DeleteTimelineResolver = Resolver< - R, - Parent, - TContext, - DeleteTimelineArgs - >; - export interface DeleteTimelineArgs { - id: string[]; - } -} - -export namespace ResponseNoteResolvers { - export interface Resolvers { - code?: CodeResolver, TypeParent, TContext>; - - message?: MessageResolver, TypeParent, TContext>; - - note?: NoteResolver; - } - - export type CodeResolver< - R = Maybe, - Parent = ResponseNote, - TContext = SiemContext - > = Resolver; - export type MessageResolver< - R = Maybe, - Parent = ResponseNote, - TContext = SiemContext - > = Resolver; - export type NoteResolver< - R = NoteResult, - Parent = ResponseNote, - TContext = SiemContext - > = Resolver; -} - -export namespace ResponseTimelineResolvers { - export interface Resolvers { - code?: CodeResolver, TypeParent, TContext>; - - message?: MessageResolver, TypeParent, TContext>; - - timeline?: TimelineResolver; - } - - export type CodeResolver< - R = Maybe, - Parent = ResponseTimeline, - TContext = SiemContext - > = Resolver; - export type MessageResolver< - R = Maybe, - Parent = ResponseTimeline, - TContext = SiemContext - > = Resolver; - export type TimelineResolver< - R = TimelineResult, - Parent = ResponseTimeline, - TContext = SiemContext - > = Resolver; -} - -export namespace ResponseFavoriteTimelineResolvers { - export interface Resolvers { - code?: CodeResolver, TypeParent, TContext>; - - message?: MessageResolver, TypeParent, TContext>; - - savedObjectId?: SavedObjectIdResolver; - - templateTimelineId?: TemplateTimelineIdResolver, TypeParent, TContext>; - - templateTimelineVersion?: TemplateTimelineVersionResolver, TypeParent, TContext>; - - timelineType?: TimelineTypeResolver, TypeParent, TContext>; - - version?: VersionResolver; - - favorite?: FavoriteResolver, TypeParent, TContext>; - } - - export type CodeResolver< - R = Maybe, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type MessageResolver< - R = Maybe, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type SavedObjectIdResolver< - R = string, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type TemplateTimelineIdResolver< - R = Maybe, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type TemplateTimelineVersionResolver< - R = Maybe, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type TimelineTypeResolver< - R = Maybe, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = string, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; - export type FavoriteResolver< - R = Maybe, - Parent = ResponseFavoriteTimeline, - TContext = SiemContext - > = Resolver; -} - -export namespace EventEcsFieldsResolvers { - export interface Resolvers { - action?: ActionResolver, TypeParent, TContext>; - - category?: CategoryResolver, TypeParent, TContext>; - - code?: CodeResolver, TypeParent, TContext>; - - created?: CreatedResolver, TypeParent, TContext>; - - dataset?: DatasetResolver, TypeParent, TContext>; - - duration?: DurationResolver, TypeParent, TContext>; - - end?: EndResolver, TypeParent, TContext>; - - hash?: HashResolver, TypeParent, TContext>; - - id?: IdResolver, TypeParent, TContext>; - - kind?: KindResolver, TypeParent, TContext>; - - module?: ModuleResolver, TypeParent, TContext>; - - original?: OriginalResolver, TypeParent, TContext>; - - outcome?: OutcomeResolver, TypeParent, TContext>; - - risk_score?: RiskScoreResolver, TypeParent, TContext>; - - risk_score_norm?: RiskScoreNormResolver, TypeParent, TContext>; - - severity?: SeverityResolver, TypeParent, TContext>; - - start?: StartResolver, TypeParent, TContext>; - - timezone?: TimezoneResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - } - - export type ActionResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type CategoryResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type CodeResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type CreatedResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type DatasetResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type DurationResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type EndResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type HashResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type IdResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type KindResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type ModuleResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type OriginalResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type OutcomeResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type RiskScoreResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type RiskScoreNormResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type SeverityResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type StartResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type TimezoneResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = EventEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace LocationResolvers { - export interface Resolvers { - lon?: LonResolver, TypeParent, TContext>; - - lat?: LatResolver, TypeParent, TContext>; - } - - export type LonResolver< - R = Maybe, - Parent = Location, - TContext = SiemContext - > = Resolver; - export type LatResolver< - R = Maybe, - Parent = Location, - TContext = SiemContext - > = Resolver; -} - -export namespace GeoEcsFieldsResolvers { - export interface Resolvers { - city_name?: CityNameResolver, TypeParent, TContext>; - - continent_name?: ContinentNameResolver, TypeParent, TContext>; - - country_iso_code?: CountryIsoCodeResolver, TypeParent, TContext>; - - country_name?: CountryNameResolver, TypeParent, TContext>; - - location?: LocationResolver, TypeParent, TContext>; - - region_iso_code?: RegionIsoCodeResolver, TypeParent, TContext>; - - region_name?: RegionNameResolver, TypeParent, TContext>; - } - - export type CityNameResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; - export type ContinentNameResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; - export type CountryIsoCodeResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; - export type CountryNameResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; - export type LocationResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; - export type RegionIsoCodeResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; - export type RegionNameResolver< - R = Maybe, - Parent = GeoEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace PrimarySecondaryResolvers { - export interface Resolvers { - primary?: PrimaryResolver, TypeParent, TContext>; - - secondary?: SecondaryResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - } - - export type PrimaryResolver< - R = Maybe, - Parent = PrimarySecondary, - TContext = SiemContext - > = Resolver; - export type SecondaryResolver< - R = Maybe, - Parent = PrimarySecondary, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = PrimarySecondary, - TContext = SiemContext - > = Resolver; -} - -export namespace SummaryResolvers { - export interface Resolvers { - actor?: ActorResolver, TypeParent, TContext>; - - object?: ObjectResolver, TypeParent, TContext>; - - how?: HowResolver, TypeParent, TContext>; - - message_type?: MessageTypeResolver, TypeParent, TContext>; - - sequence?: SequenceResolver, TypeParent, TContext>; - } - - export type ActorResolver< - R = Maybe, - Parent = Summary, - TContext = SiemContext - > = Resolver; - export type ObjectResolver< - R = Maybe, - Parent = Summary, - TContext = SiemContext - > = Resolver; - export type HowResolver< - R = Maybe, - Parent = Summary, - TContext = SiemContext - > = Resolver; - export type MessageTypeResolver< - R = Maybe, - Parent = Summary, - TContext = SiemContext - > = Resolver; - export type SequenceResolver< - R = Maybe, - Parent = Summary, - TContext = SiemContext - > = Resolver; -} - -export namespace AgentEcsFieldResolvers { - export interface Resolvers { - type?: TypeResolver, TypeParent, TContext>; - } - - export type TypeResolver< - R = Maybe, - Parent = AgentEcsField, - TContext = SiemContext - > = Resolver; -} - -export namespace AuditdDataResolvers { - export interface Resolvers { - acct?: AcctResolver, TypeParent, TContext>; - - terminal?: TerminalResolver, TypeParent, TContext>; - - op?: OpResolver, TypeParent, TContext>; - } - - export type AcctResolver< - R = Maybe, - Parent = AuditdData, - TContext = SiemContext - > = Resolver; - export type TerminalResolver< - R = Maybe, - Parent = AuditdData, - TContext = SiemContext - > = Resolver; - export type OpResolver< - R = Maybe, - Parent = AuditdData, - TContext = SiemContext - > = Resolver; -} - -export namespace AuditdEcsFieldsResolvers { - export interface Resolvers { - result?: ResultResolver, TypeParent, TContext>; - - session?: SessionResolver, TypeParent, TContext>; - - data?: DataResolver, TypeParent, TContext>; - - summary?: SummaryResolver, TypeParent, TContext>; - - sequence?: SequenceResolver, TypeParent, TContext>; - } - - export type ResultResolver< - R = Maybe, - Parent = AuditdEcsFields, - TContext = SiemContext - > = Resolver; - export type SessionResolver< - R = Maybe, - Parent = AuditdEcsFields, - TContext = SiemContext - > = Resolver; - export type DataResolver< - R = Maybe, - Parent = AuditdEcsFields, - TContext = SiemContext - > = Resolver; - export type SummaryResolver< - R = Maybe, - Parent = AuditdEcsFields, - TContext = SiemContext - > = Resolver; - export type SequenceResolver< - R = Maybe, - Parent = AuditdEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace OsEcsFieldsResolvers { - export interface Resolvers { - platform?: PlatformResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - full?: FullResolver, TypeParent, TContext>; - - family?: FamilyResolver, TypeParent, TContext>; - - version?: VersionResolver, TypeParent, TContext>; - - kernel?: KernelResolver, TypeParent, TContext>; - } - - export type PlatformResolver< - R = Maybe, - Parent = OsEcsFields, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = OsEcsFields, - TContext = SiemContext - > = Resolver; - export type FullResolver< - R = Maybe, - Parent = OsEcsFields, - TContext = SiemContext - > = Resolver; - export type FamilyResolver< - R = Maybe, - Parent = OsEcsFields, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = Maybe, - Parent = OsEcsFields, - TContext = SiemContext - > = Resolver; - export type KernelResolver< - R = Maybe, - Parent = OsEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace HostEcsFieldsResolvers { - export interface Resolvers { - architecture?: ArchitectureResolver, TypeParent, TContext>; - - id?: IdResolver, TypeParent, TContext>; - - ip?: IpResolver, TypeParent, TContext>; - - mac?: MacResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - os?: OsResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - } - - export type ArchitectureResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; - export type IdResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; - export type IpResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; - export type MacResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; - export type OsResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = HostEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace ThreadResolvers { - export interface Resolvers { - id?: IdResolver, TypeParent, TContext>; - - start?: StartResolver, TypeParent, TContext>; - } - - export type IdResolver< - R = Maybe, - Parent = Thread, - TContext = SiemContext - > = Resolver; - export type StartResolver< - R = Maybe, - Parent = Thread, - TContext = SiemContext - > = Resolver; -} - -export namespace ProcessHashDataResolvers { - export interface Resolvers { - md5?: Md5Resolver, TypeParent, TContext>; - - sha1?: Sha1Resolver, TypeParent, TContext>; - - sha256?: Sha256Resolver, TypeParent, TContext>; - } - - export type Md5Resolver< - R = Maybe, - Parent = ProcessHashData, - TContext = SiemContext - > = Resolver; - export type Sha1Resolver< - R = Maybe, - Parent = ProcessHashData, - TContext = SiemContext - > = Resolver; - export type Sha256Resolver< - R = Maybe, - Parent = ProcessHashData, - TContext = SiemContext - > = Resolver; -} - -export namespace ProcessEcsFieldsResolvers { - export interface Resolvers { - hash?: HashResolver, TypeParent, TContext>; - - pid?: PidResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - ppid?: PpidResolver, TypeParent, TContext>; - - args?: ArgsResolver, TypeParent, TContext>; - - entity_id?: EntityIdResolver, TypeParent, TContext>; - - executable?: ExecutableResolver, TypeParent, TContext>; - - title?: TitleResolver, TypeParent, TContext>; - - thread?: ThreadResolver, TypeParent, TContext>; - - working_directory?: WorkingDirectoryResolver, TypeParent, TContext>; - } - - export type HashResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type PidResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type PpidResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type ArgsResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type EntityIdResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type ExecutableResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type TitleResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type ThreadResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; - export type WorkingDirectoryResolver< - R = Maybe, - Parent = ProcessEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace SourceEcsFieldsResolvers { - export interface Resolvers { - bytes?: BytesResolver, TypeParent, TContext>; - - ip?: IpResolver, TypeParent, TContext>; - - port?: PortResolver, TypeParent, TContext>; - - domain?: DomainResolver, TypeParent, TContext>; - - geo?: GeoResolver, TypeParent, TContext>; - - packets?: PacketsResolver, TypeParent, TContext>; - } - - export type BytesResolver< - R = Maybe, - Parent = SourceEcsFields, - TContext = SiemContext - > = Resolver; - export type IpResolver< - R = Maybe, - Parent = SourceEcsFields, - TContext = SiemContext - > = Resolver; - export type PortResolver< - R = Maybe, - Parent = SourceEcsFields, - TContext = SiemContext - > = Resolver; - export type DomainResolver< - R = Maybe, - Parent = SourceEcsFields, - TContext = SiemContext - > = Resolver; - export type GeoResolver< - R = Maybe, - Parent = SourceEcsFields, - TContext = SiemContext - > = Resolver; - export type PacketsResolver< - R = Maybe, - Parent = SourceEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace DestinationEcsFieldsResolvers { - export interface Resolvers { - bytes?: BytesResolver, TypeParent, TContext>; - - ip?: IpResolver, TypeParent, TContext>; - - port?: PortResolver, TypeParent, TContext>; - - domain?: DomainResolver, TypeParent, TContext>; - - geo?: GeoResolver, TypeParent, TContext>; - - packets?: PacketsResolver, TypeParent, TContext>; - } - - export type BytesResolver< - R = Maybe, - Parent = DestinationEcsFields, - TContext = SiemContext - > = Resolver; - export type IpResolver< - R = Maybe, - Parent = DestinationEcsFields, - TContext = SiemContext - > = Resolver; - export type PortResolver< - R = Maybe, - Parent = DestinationEcsFields, - TContext = SiemContext - > = Resolver; - export type DomainResolver< - R = Maybe, - Parent = DestinationEcsFields, - TContext = SiemContext - > = Resolver; - export type GeoResolver< - R = Maybe, - Parent = DestinationEcsFields, - TContext = SiemContext - > = Resolver; - export type PacketsResolver< - R = Maybe, - Parent = DestinationEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace DnsQuestionDataResolvers { - export interface Resolvers { - name?: NameResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - } - - export type NameResolver< - R = Maybe, - Parent = DnsQuestionData, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = DnsQuestionData, - TContext = SiemContext - > = Resolver; -} - -export namespace DnsEcsFieldsResolvers { - export interface Resolvers { - question?: QuestionResolver, TypeParent, TContext>; - - resolved_ip?: ResolvedIpResolver, TypeParent, TContext>; - - response_code?: ResponseCodeResolver, TypeParent, TContext>; - } - - export type QuestionResolver< - R = Maybe, - Parent = DnsEcsFields, - TContext = SiemContext - > = Resolver; - export type ResolvedIpResolver< - R = Maybe, - Parent = DnsEcsFields, - TContext = SiemContext - > = Resolver; - export type ResponseCodeResolver< - R = Maybe, - Parent = DnsEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace EndgameEcsFieldsResolvers { - export interface Resolvers { - exit_code?: ExitCodeResolver, TypeParent, TContext>; - - file_name?: FileNameResolver, TypeParent, TContext>; - - file_path?: FilePathResolver, TypeParent, TContext>; - - logon_type?: LogonTypeResolver, TypeParent, TContext>; - - parent_process_name?: ParentProcessNameResolver, TypeParent, TContext>; - - pid?: PidResolver, TypeParent, TContext>; - - process_name?: ProcessNameResolver, TypeParent, TContext>; - - subject_domain_name?: SubjectDomainNameResolver, TypeParent, TContext>; - - subject_logon_id?: SubjectLogonIdResolver, TypeParent, TContext>; - - subject_user_name?: SubjectUserNameResolver, TypeParent, TContext>; - - target_domain_name?: TargetDomainNameResolver, TypeParent, TContext>; - - target_logon_id?: TargetLogonIdResolver, TypeParent, TContext>; - - target_user_name?: TargetUserNameResolver, TypeParent, TContext>; - } - - export type ExitCodeResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type FileNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type FilePathResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type LogonTypeResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type ParentProcessNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type PidResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type ProcessNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type SubjectDomainNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type SubjectLogonIdResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type SubjectUserNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type TargetDomainNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type TargetLogonIdResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; - export type TargetUserNameResolver< - R = Maybe, - Parent = EndgameEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace SuricataAlertDataResolvers { - export interface Resolvers { - signature?: SignatureResolver, TypeParent, TContext>; - - signature_id?: SignatureIdResolver, TypeParent, TContext>; - } - - export type SignatureResolver< - R = Maybe, - Parent = SuricataAlertData, - TContext = SiemContext - > = Resolver; - export type SignatureIdResolver< - R = Maybe, - Parent = SuricataAlertData, - TContext = SiemContext - > = Resolver; -} - -export namespace SuricataEveDataResolvers { - export interface Resolvers { - alert?: AlertResolver, TypeParent, TContext>; - - flow_id?: FlowIdResolver, TypeParent, TContext>; - - proto?: ProtoResolver, TypeParent, TContext>; - } - - export type AlertResolver< - R = Maybe, - Parent = SuricataEveData, - TContext = SiemContext - > = Resolver; - export type FlowIdResolver< - R = Maybe, - Parent = SuricataEveData, - TContext = SiemContext - > = Resolver; - export type ProtoResolver< - R = Maybe, - Parent = SuricataEveData, - TContext = SiemContext - > = Resolver; -} - -export namespace SuricataEcsFieldsResolvers { - export interface Resolvers { - eve?: EveResolver, TypeParent, TContext>; - } - - export type EveResolver< - R = Maybe, - Parent = SuricataEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace TlsJa3DataResolvers { - export interface Resolvers { - hash?: HashResolver, TypeParent, TContext>; - } - - export type HashResolver< - R = Maybe, - Parent = TlsJa3Data, - TContext = SiemContext - > = Resolver; -} - -export namespace FingerprintDataResolvers { - export interface Resolvers { - sha1?: Sha1Resolver, TypeParent, TContext>; - } - - export type Sha1Resolver< - R = Maybe, - Parent = FingerprintData, - TContext = SiemContext - > = Resolver; -} - -export namespace TlsClientCertificateDataResolvers { - export interface Resolvers { - fingerprint?: FingerprintResolver, TypeParent, TContext>; - } - - export type FingerprintResolver< - R = Maybe, - Parent = TlsClientCertificateData, - TContext = SiemContext - > = Resolver; -} - -export namespace TlsServerCertificateDataResolvers { - export interface Resolvers { - fingerprint?: FingerprintResolver, TypeParent, TContext>; - } - - export type FingerprintResolver< - R = Maybe, - Parent = TlsServerCertificateData, - TContext = SiemContext - > = Resolver; -} - -export namespace TlsFingerprintsDataResolvers { - export interface Resolvers { - ja3?: Ja3Resolver, TypeParent, TContext>; - } - - export type Ja3Resolver< - R = Maybe, - Parent = TlsFingerprintsData, - TContext = SiemContext - > = Resolver; -} - -export namespace TlsEcsFieldsResolvers { - export interface Resolvers { - client_certificate?: ClientCertificateResolver< - Maybe, - TypeParent, - TContext - >; - - fingerprints?: FingerprintsResolver, TypeParent, TContext>; - - server_certificate?: ServerCertificateResolver< - Maybe, - TypeParent, - TContext - >; - } - - export type ClientCertificateResolver< - R = Maybe, - Parent = TlsEcsFields, - TContext = SiemContext - > = Resolver; - export type FingerprintsResolver< - R = Maybe, - Parent = TlsEcsFields, - TContext = SiemContext - > = Resolver; - export type ServerCertificateResolver< - R = Maybe, - Parent = TlsEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekConnectionDataResolvers { - export interface Resolvers { - local_resp?: LocalRespResolver, TypeParent, TContext>; - - local_orig?: LocalOrigResolver, TypeParent, TContext>; - - missed_bytes?: MissedBytesResolver, TypeParent, TContext>; - - state?: StateResolver, TypeParent, TContext>; - - history?: HistoryResolver, TypeParent, TContext>; - } - - export type LocalRespResolver< - R = Maybe, - Parent = ZeekConnectionData, - TContext = SiemContext - > = Resolver; - export type LocalOrigResolver< - R = Maybe, - Parent = ZeekConnectionData, - TContext = SiemContext - > = Resolver; - export type MissedBytesResolver< - R = Maybe, - Parent = ZeekConnectionData, - TContext = SiemContext - > = Resolver; - export type StateResolver< - R = Maybe, - Parent = ZeekConnectionData, - TContext = SiemContext - > = Resolver; - export type HistoryResolver< - R = Maybe, - Parent = ZeekConnectionData, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekNoticeDataResolvers { - export interface Resolvers { - suppress_for?: SuppressForResolver, TypeParent, TContext>; - - msg?: MsgResolver, TypeParent, TContext>; - - note?: NoteResolver, TypeParent, TContext>; - - sub?: SubResolver, TypeParent, TContext>; - - dst?: DstResolver, TypeParent, TContext>; - - dropped?: DroppedResolver, TypeParent, TContext>; - - peer_descr?: PeerDescrResolver, TypeParent, TContext>; - } - - export type SuppressForResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; - export type MsgResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; - export type NoteResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; - export type SubResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; - export type DstResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; - export type DroppedResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; - export type PeerDescrResolver< - R = Maybe, - Parent = ZeekNoticeData, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekDnsDataResolvers { - export interface Resolvers { - AA?: AaResolver, TypeParent, TContext>; - - qclass_name?: QclassNameResolver, TypeParent, TContext>; - - RD?: RdResolver, TypeParent, TContext>; - - qtype_name?: QtypeNameResolver, TypeParent, TContext>; - - rejected?: RejectedResolver, TypeParent, TContext>; - - qtype?: QtypeResolver, TypeParent, TContext>; - - query?: QueryResolver, TypeParent, TContext>; - - trans_id?: TransIdResolver, TypeParent, TContext>; - - qclass?: QclassResolver, TypeParent, TContext>; - - RA?: RaResolver, TypeParent, TContext>; - - TC?: TcResolver, TypeParent, TContext>; - } - - export type AaResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type QclassNameResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type RdResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type QtypeNameResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type RejectedResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type QtypeResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type QueryResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type TransIdResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type QclassResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type RaResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; - export type TcResolver< - R = Maybe, - Parent = ZeekDnsData, - TContext = SiemContext - > = Resolver; -} - -export namespace FileFieldsResolvers { - export interface Resolvers { - name?: NameResolver, TypeParent, TContext>; - - path?: PathResolver, TypeParent, TContext>; - - target_path?: TargetPathResolver, TypeParent, TContext>; - - extension?: ExtensionResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - - device?: DeviceResolver, TypeParent, TContext>; - - inode?: InodeResolver, TypeParent, TContext>; - - uid?: UidResolver, TypeParent, TContext>; - - owner?: OwnerResolver, TypeParent, TContext>; - - gid?: GidResolver, TypeParent, TContext>; - - group?: GroupResolver, TypeParent, TContext>; - - mode?: ModeResolver, TypeParent, TContext>; - - size?: SizeResolver, TypeParent, TContext>; - - mtime?: MtimeResolver, TypeParent, TContext>; - - ctime?: CtimeResolver, TypeParent, TContext>; - } - - export type NameResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type PathResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type TargetPathResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type ExtensionResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type DeviceResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type InodeResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type UidResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type OwnerResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type GidResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type GroupResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type ModeResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type SizeResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type MtimeResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; - export type CtimeResolver< - R = Maybe, - Parent = FileFields, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekHttpDataResolvers { - export interface Resolvers { - resp_mime_types?: RespMimeTypesResolver, TypeParent, TContext>; - - trans_depth?: TransDepthResolver, TypeParent, TContext>; - - status_msg?: StatusMsgResolver, TypeParent, TContext>; - - resp_fuids?: RespFuidsResolver, TypeParent, TContext>; - - tags?: TagsResolver, TypeParent, TContext>; - } - - export type RespMimeTypesResolver< - R = Maybe, - Parent = ZeekHttpData, - TContext = SiemContext - > = Resolver; - export type TransDepthResolver< - R = Maybe, - Parent = ZeekHttpData, - TContext = SiemContext - > = Resolver; - export type StatusMsgResolver< - R = Maybe, - Parent = ZeekHttpData, - TContext = SiemContext - > = Resolver; - export type RespFuidsResolver< - R = Maybe, - Parent = ZeekHttpData, - TContext = SiemContext - > = Resolver; - export type TagsResolver< - R = Maybe, - Parent = ZeekHttpData, - TContext = SiemContext - > = Resolver; -} - -export namespace HttpBodyDataResolvers { - export interface Resolvers { - content?: ContentResolver, TypeParent, TContext>; - - bytes?: BytesResolver, TypeParent, TContext>; - } - - export type ContentResolver< - R = Maybe, - Parent = HttpBodyData, - TContext = SiemContext - > = Resolver; - export type BytesResolver< - R = Maybe, - Parent = HttpBodyData, - TContext = SiemContext - > = Resolver; -} - -export namespace HttpRequestDataResolvers { - export interface Resolvers { - method?: MethodResolver, TypeParent, TContext>; - - body?: BodyResolver, TypeParent, TContext>; - - referrer?: ReferrerResolver, TypeParent, TContext>; - - bytes?: BytesResolver, TypeParent, TContext>; - } - - export type MethodResolver< - R = Maybe, - Parent = HttpRequestData, - TContext = SiemContext - > = Resolver; - export type BodyResolver< - R = Maybe, - Parent = HttpRequestData, - TContext = SiemContext - > = Resolver; - export type ReferrerResolver< - R = Maybe, - Parent = HttpRequestData, - TContext = SiemContext - > = Resolver; - export type BytesResolver< - R = Maybe, - Parent = HttpRequestData, - TContext = SiemContext - > = Resolver; -} - -export namespace HttpResponseDataResolvers { - export interface Resolvers { - status_code?: StatusCodeResolver, TypeParent, TContext>; - - body?: BodyResolver, TypeParent, TContext>; - - bytes?: BytesResolver, TypeParent, TContext>; - } - - export type StatusCodeResolver< - R = Maybe, - Parent = HttpResponseData, - TContext = SiemContext - > = Resolver; - export type BodyResolver< - R = Maybe, - Parent = HttpResponseData, - TContext = SiemContext - > = Resolver; - export type BytesResolver< - R = Maybe, - Parent = HttpResponseData, - TContext = SiemContext - > = Resolver; -} - -export namespace HttpEcsFieldsResolvers { - export interface Resolvers { - version?: VersionResolver, TypeParent, TContext>; - - request?: RequestResolver, TypeParent, TContext>; - - response?: ResponseResolver, TypeParent, TContext>; - } - - export type VersionResolver< - R = Maybe, - Parent = HttpEcsFields, - TContext = SiemContext - > = Resolver; - export type RequestResolver< - R = Maybe, - Parent = HttpEcsFields, - TContext = SiemContext - > = Resolver; - export type ResponseResolver< - R = Maybe, - Parent = HttpEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace UrlEcsFieldsResolvers { - export interface Resolvers { - domain?: DomainResolver, TypeParent, TContext>; - - original?: OriginalResolver, TypeParent, TContext>; - - username?: UsernameResolver, TypeParent, TContext>; - - password?: PasswordResolver, TypeParent, TContext>; - } - - export type DomainResolver< - R = Maybe, - Parent = UrlEcsFields, - TContext = SiemContext - > = Resolver; - export type OriginalResolver< - R = Maybe, - Parent = UrlEcsFields, - TContext = SiemContext - > = Resolver; - export type UsernameResolver< - R = Maybe, - Parent = UrlEcsFields, - TContext = SiemContext - > = Resolver; - export type PasswordResolver< - R = Maybe, - Parent = UrlEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekFileDataResolvers { - export interface Resolvers { - session_ids?: SessionIdsResolver, TypeParent, TContext>; - - timedout?: TimedoutResolver, TypeParent, TContext>; - - local_orig?: LocalOrigResolver, TypeParent, TContext>; - - tx_host?: TxHostResolver, TypeParent, TContext>; - - source?: SourceResolver, TypeParent, TContext>; - - is_orig?: IsOrigResolver, TypeParent, TContext>; - - overflow_bytes?: OverflowBytesResolver, TypeParent, TContext>; - - sha1?: Sha1Resolver, TypeParent, TContext>; - - duration?: DurationResolver, TypeParent, TContext>; - - depth?: DepthResolver, TypeParent, TContext>; - - analyzers?: AnalyzersResolver, TypeParent, TContext>; - - mime_type?: MimeTypeResolver, TypeParent, TContext>; - - rx_host?: RxHostResolver, TypeParent, TContext>; - - total_bytes?: TotalBytesResolver, TypeParent, TContext>; - - fuid?: FuidResolver, TypeParent, TContext>; - - seen_bytes?: SeenBytesResolver, TypeParent, TContext>; - - missing_bytes?: MissingBytesResolver, TypeParent, TContext>; - - md5?: Md5Resolver, TypeParent, TContext>; - } - - export type SessionIdsResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type TimedoutResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type LocalOrigResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type TxHostResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type SourceResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type IsOrigResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type OverflowBytesResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type Sha1Resolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type DurationResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type DepthResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type AnalyzersResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type MimeTypeResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type RxHostResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type TotalBytesResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type FuidResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type SeenBytesResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type MissingBytesResolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; - export type Md5Resolver< - R = Maybe, - Parent = ZeekFileData, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekSslDataResolvers { - export interface Resolvers { - cipher?: CipherResolver, TypeParent, TContext>; - - established?: EstablishedResolver, TypeParent, TContext>; - - resumed?: ResumedResolver, TypeParent, TContext>; - - version?: VersionResolver, TypeParent, TContext>; - } - - export type CipherResolver< - R = Maybe, - Parent = ZeekSslData, - TContext = SiemContext - > = Resolver; - export type EstablishedResolver< - R = Maybe, - Parent = ZeekSslData, - TContext = SiemContext - > = Resolver; - export type ResumedResolver< - R = Maybe, - Parent = ZeekSslData, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = Maybe, - Parent = ZeekSslData, - TContext = SiemContext - > = Resolver; -} - -export namespace ZeekEcsFieldsResolvers { - export interface Resolvers { - session_id?: SessionIdResolver, TypeParent, TContext>; - - connection?: ConnectionResolver, TypeParent, TContext>; - - notice?: NoticeResolver, TypeParent, TContext>; - - dns?: DnsResolver, TypeParent, TContext>; - - http?: HttpResolver, TypeParent, TContext>; - - files?: FilesResolver, TypeParent, TContext>; - - ssl?: SslResolver, TypeParent, TContext>; - } - - export type SessionIdResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; - export type ConnectionResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; - export type NoticeResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; - export type DnsResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; - export type HttpResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; - export type FilesResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; - export type SslResolver< - R = Maybe, - Parent = ZeekEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace UserEcsFieldsResolvers { - export interface Resolvers { - domain?: DomainResolver, TypeParent, TContext>; - - id?: IdResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - full_name?: FullNameResolver, TypeParent, TContext>; - - email?: EmailResolver, TypeParent, TContext>; - - hash?: HashResolver, TypeParent, TContext>; - - group?: GroupResolver, TypeParent, TContext>; - } - - export type DomainResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; - export type IdResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; - export type FullNameResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; - export type EmailResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; - export type HashResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; - export type GroupResolver< - R = Maybe, - Parent = UserEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace WinlogEcsFieldsResolvers { - export interface Resolvers { - event_id?: EventIdResolver, TypeParent, TContext>; - } - - export type EventIdResolver< - R = Maybe, - Parent = WinlogEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace NetworkEcsFieldResolvers { - export interface Resolvers { - bytes?: BytesResolver, TypeParent, TContext>; - - community_id?: CommunityIdResolver, TypeParent, TContext>; - - direction?: DirectionResolver, TypeParent, TContext>; - - packets?: PacketsResolver, TypeParent, TContext>; - - protocol?: ProtocolResolver, TypeParent, TContext>; - - transport?: TransportResolver, TypeParent, TContext>; - } - - export type BytesResolver< - R = Maybe, - Parent = NetworkEcsField, - TContext = SiemContext - > = Resolver; - export type CommunityIdResolver< - R = Maybe, - Parent = NetworkEcsField, - TContext = SiemContext - > = Resolver; - export type DirectionResolver< - R = Maybe, - Parent = NetworkEcsField, - TContext = SiemContext - > = Resolver; - export type PacketsResolver< - R = Maybe, - Parent = NetworkEcsField, - TContext = SiemContext - > = Resolver; - export type ProtocolResolver< - R = Maybe, - Parent = NetworkEcsField, - TContext = SiemContext - > = Resolver; - export type TransportResolver< - R = Maybe, - Parent = NetworkEcsField, - TContext = SiemContext - > = Resolver; -} - -export namespace PackageEcsFieldsResolvers { - export interface Resolvers { - arch?: ArchResolver, TypeParent, TContext>; - - entity_id?: EntityIdResolver, TypeParent, TContext>; - - name?: NameResolver, TypeParent, TContext>; - - size?: SizeResolver, TypeParent, TContext>; - - summary?: SummaryResolver, TypeParent, TContext>; - - version?: VersionResolver, TypeParent, TContext>; - } - - export type ArchResolver< - R = Maybe, - Parent = PackageEcsFields, - TContext = SiemContext - > = Resolver; - export type EntityIdResolver< - R = Maybe, - Parent = PackageEcsFields, - TContext = SiemContext - > = Resolver; - export type NameResolver< - R = Maybe, - Parent = PackageEcsFields, - TContext = SiemContext - > = Resolver; - export type SizeResolver< - R = Maybe, - Parent = PackageEcsFields, - TContext = SiemContext - > = Resolver; - export type SummaryResolver< - R = Maybe, - Parent = PackageEcsFields, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = Maybe, - Parent = PackageEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace AuditEcsFieldsResolvers { - export interface Resolvers { - package?: PackageResolver, TypeParent, TContext>; - } - - export type PackageResolver< - R = Maybe, - Parent = AuditEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace SshEcsFieldsResolvers { - export interface Resolvers { - method?: MethodResolver, TypeParent, TContext>; - - signature?: SignatureResolver, TypeParent, TContext>; - } - - export type MethodResolver< - R = Maybe, - Parent = SshEcsFields, - TContext = SiemContext - > = Resolver; - export type SignatureResolver< - R = Maybe, - Parent = SshEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace AuthEcsFieldsResolvers { - export interface Resolvers { - ssh?: SshResolver, TypeParent, TContext>; - } - - export type SshResolver< - R = Maybe, - Parent = AuthEcsFields, - TContext = SiemContext - > = Resolver; -} - -export namespace SystemEcsFieldResolvers { - export interface Resolvers { - audit?: AuditResolver, TypeParent, TContext>; - - auth?: AuthResolver, TypeParent, TContext>; - } - - export type AuditResolver< - R = Maybe, - Parent = SystemEcsField, - TContext = SiemContext - > = Resolver; - export type AuthResolver< - R = Maybe, - Parent = SystemEcsField, - TContext = SiemContext - > = Resolver; -} - -export namespace RuleFieldResolvers { - export interface Resolvers { - id?: IdResolver, TypeParent, TContext>; - - rule_id?: RuleIdResolver, TypeParent, TContext>; - - false_positives?: FalsePositivesResolver; - - saved_id?: SavedIdResolver, TypeParent, TContext>; - - timeline_id?: TimelineIdResolver, TypeParent, TContext>; - - timeline_title?: TimelineTitleResolver, TypeParent, TContext>; - - max_signals?: MaxSignalsResolver, TypeParent, TContext>; - - risk_score?: RiskScoreResolver, TypeParent, TContext>; - - output_index?: OutputIndexResolver, TypeParent, TContext>; - - description?: DescriptionResolver, TypeParent, TContext>; - - from?: FromResolver, TypeParent, TContext>; - - immutable?: ImmutableResolver, TypeParent, TContext>; - - index?: IndexResolver, TypeParent, TContext>; - - interval?: IntervalResolver, TypeParent, TContext>; - - language?: LanguageResolver, TypeParent, TContext>; - - query?: QueryResolver, TypeParent, TContext>; - - references?: ReferencesResolver, TypeParent, TContext>; - - severity?: SeverityResolver, TypeParent, TContext>; - - tags?: TagsResolver, TypeParent, TContext>; - - threat?: ThreatResolver, TypeParent, TContext>; - - type?: TypeResolver, TypeParent, TContext>; - - size?: SizeResolver, TypeParent, TContext>; - - to?: ToResolver, TypeParent, TContext>; - - enabled?: EnabledResolver, TypeParent, TContext>; - - filters?: FiltersResolver, TypeParent, TContext>; - - created_at?: CreatedAtResolver, TypeParent, TContext>; - - updated_at?: UpdatedAtResolver, TypeParent, TContext>; - - created_by?: CreatedByResolver, TypeParent, TContext>; - - updated_by?: UpdatedByResolver, TypeParent, TContext>; - - version?: VersionResolver, TypeParent, TContext>; - - note?: NoteResolver, TypeParent, TContext>; - - threshold?: ThresholdResolver, TypeParent, TContext>; - - exceptions_list?: ExceptionsListResolver, TypeParent, TContext>; - } - - export type IdResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type RuleIdResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type FalsePositivesResolver< - R = string[], - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type SavedIdResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type TimelineIdResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type TimelineTitleResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type MaxSignalsResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type RiskScoreResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type OutputIndexResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type DescriptionResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type FromResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type ImmutableResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type IndexResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type IntervalResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type LanguageResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type QueryResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type ReferencesResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type SeverityResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type TagsResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type ThreatResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type TypeResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type SizeResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type ToResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type EnabledResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type FiltersResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type CreatedAtResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type UpdatedAtResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type CreatedByResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type UpdatedByResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type VersionResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type NoteResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type ThresholdResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; - export type ExceptionsListResolver< - R = Maybe, - Parent = RuleField, - TContext = SiemContext - > = Resolver; -} - -export namespace SignalFieldResolvers { - export interface Resolvers { - rule?: RuleResolver, TypeParent, TContext>; - - original_time?: OriginalTimeResolver, TypeParent, TContext>; - - status?: StatusResolver, TypeParent, TContext>; - } - - export type RuleResolver< - R = Maybe, - Parent = SignalField, - TContext = SiemContext - > = Resolver; - export type OriginalTimeResolver< - R = Maybe, - Parent = SignalField, - TContext = SiemContext - > = Resolver; - export type StatusResolver< - R = Maybe, - Parent = SignalField, - TContext = SiemContext - > = Resolver; -} - -export namespace RuleEcsFieldResolvers { - export interface Resolvers { - reference?: ReferenceResolver, TypeParent, TContext>; - } - - export type ReferenceResolver< - R = Maybe, - Parent = RuleEcsField, - TContext = SiemContext - > = Resolver; -} - -export namespace EcsResolvers { - export interface Resolvers { - _id?: _IdResolver; - - _index?: _IndexResolver, TypeParent, TContext>; - - agent?: AgentResolver, TypeParent, TContext>; - - auditd?: AuditdResolver, TypeParent, TContext>; - - destination?: DestinationResolver, TypeParent, TContext>; - - dns?: DnsResolver, TypeParent, TContext>; - - endgame?: EndgameResolver, TypeParent, TContext>; - - event?: EventResolver, TypeParent, TContext>; - - geo?: GeoResolver, TypeParent, TContext>; - - host?: HostResolver, TypeParent, TContext>; - - network?: NetworkResolver, TypeParent, TContext>; - - rule?: RuleResolver, TypeParent, TContext>; - - signal?: SignalResolver, TypeParent, TContext>; - - source?: SourceResolver, TypeParent, TContext>; - - suricata?: SuricataResolver, TypeParent, TContext>; - - tls?: TlsResolver, TypeParent, TContext>; - - zeek?: ZeekResolver, TypeParent, TContext>; - - http?: HttpResolver, TypeParent, TContext>; - - url?: UrlResolver, TypeParent, TContext>; - - timestamp?: TimestampResolver, TypeParent, TContext>; - - message?: MessageResolver, TypeParent, TContext>; - - user?: UserResolver, TypeParent, TContext>; - - winlog?: WinlogResolver, TypeParent, TContext>; - - process?: ProcessResolver, TypeParent, TContext>; - - file?: FileResolver, TypeParent, TContext>; - - system?: SystemResolver, TypeParent, TContext>; - } - - export type _IdResolver = Resolver< - R, - Parent, - TContext - >; - export type _IndexResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type AgentResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type AuditdResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type DestinationResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type DnsResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type EndgameResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type EventResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type GeoResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type HostResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type NetworkResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type RuleResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type SignalResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type SourceResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type SuricataResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type TlsResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type ZeekResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type HttpResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type UrlResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type TimestampResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type MessageResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type UserResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type WinlogResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type ProcessResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; - export type FileResolver, Parent = Ecs, TContext = SiemContext> = Resolver< - R, - Parent, - TContext - >; - export type SystemResolver< - R = Maybe, - Parent = Ecs, - TContext = SiemContext - > = Resolver; -} - -export namespace EcsEdgesResolvers { - export interface Resolvers { - node?: NodeResolver; - - cursor?: CursorResolver; - } - - export type NodeResolver = Resolver< - R, - Parent, - TContext - >; - export type CursorResolver = Resolver< - R, - Parent, - TContext - >; -} - -export namespace CursorTypeResolvers { - export interface Resolvers { - value?: ValueResolver, TypeParent, TContext>; - - tiebreaker?: TiebreakerResolver, TypeParent, TContext>; - } - - export type ValueResolver< - R = Maybe, - Parent = CursorType, - TContext = SiemContext - > = Resolver; - export type TiebreakerResolver< - R = Maybe, - Parent = CursorType, - TContext = SiemContext - > = Resolver; -} -/** A descriptor of a field in an index */ -export namespace IndexFieldResolvers { - export interface Resolvers { - /** Where the field belong */ - category?: CategoryResolver; - /** Example of field's value */ - example?: ExampleResolver, TypeParent, TContext>; - /** whether the field's belong to an alias index */ - indexes?: IndexesResolver<(Maybe)[], TypeParent, TContext>; - /** The name of the field */ - name?: NameResolver; - /** The type of the field's values as recognized by Kibana */ - type?: TypeResolver; - /** Whether the field's values can be efficiently searched for */ - searchable?: SearchableResolver; - /** Whether the field's values can be aggregated */ - aggregatable?: AggregatableResolver; - /** Description of the field */ - description?: DescriptionResolver, TypeParent, TContext>; - - format?: FormatResolver, TypeParent, TContext>; - /** the elastic type as mapped in the index */ - esTypes?: EsTypesResolver, TypeParent, TContext>; - - subType?: SubTypeResolver, TypeParent, TContext>; - } - - export type CategoryResolver = Resolver< - R, - Parent, - TContext - >; - export type ExampleResolver< - R = Maybe, - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type IndexesResolver< - R = (Maybe)[], - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type NameResolver = Resolver< - R, - Parent, - TContext - >; - export type TypeResolver = Resolver< - R, - Parent, - TContext - >; - export type SearchableResolver< - R = boolean, - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type AggregatableResolver< - R = boolean, - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type DescriptionResolver< - R = Maybe, - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type FormatResolver< - R = Maybe, - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type EsTypesResolver< - R = Maybe, - Parent = IndexField, - TContext = SiemContext - > = Resolver; - export type SubTypeResolver< - R = Maybe, - Parent = IndexField, - TContext = SiemContext - > = Resolver; -} - -export namespace PageInfoResolvers { - export interface Resolvers { - endCursor?: EndCursorResolver, TypeParent, TContext>; - - hasNextPage?: HasNextPageResolver, TypeParent, TContext>; - } - - export type EndCursorResolver< - R = Maybe, - Parent = PageInfo, - TContext = SiemContext - > = Resolver; - export type HasNextPageResolver< - R = Maybe, - Parent = PageInfo, - TContext = SiemContext - > = Resolver; -} - -export namespace InspectResolvers { - export interface Resolvers { - dsl?: DslResolver; - - response?: ResponseResolver; - } - - export type DslResolver = Resolver< - R, - Parent, - TContext - >; - export type ResponseResolver = Resolver< - R, - Parent, - TContext - >; -} - -export namespace PageInfoPaginatedResolvers { - export interface Resolvers { - activePage?: ActivePageResolver; - - fakeTotalCount?: FakeTotalCountResolver; - - showMorePagesIndicator?: ShowMorePagesIndicatorResolver; - } - - export type ActivePageResolver< - R = number, - Parent = PageInfoPaginated, - TContext = SiemContext - > = Resolver; - export type FakeTotalCountResolver< - R = number, - Parent = PageInfoPaginated, - TContext = SiemContext - > = Resolver; - export type ShowMorePagesIndicatorResolver< - R = boolean, - Parent = PageInfoPaginated, - TContext = SiemContext - > = Resolver; -} - -/** Directs the executor to skip this field or fragment when the `if` argument is true. */ -export type SkipDirectiveResolver = DirectiveResolverFn< - Result, - SkipDirectiveArgs, - SiemContext ->; -export interface SkipDirectiveArgs { - /** Skipped when true. */ - if: boolean; -} - -/** Directs the executor to include this field or fragment only when the `if` argument is true. */ -export type IncludeDirectiveResolver = DirectiveResolverFn< - Result, - IncludeDirectiveArgs, - SiemContext ->; -export interface IncludeDirectiveArgs { - /** Included when true. */ - if: boolean; -} - -/** Marks an element of a GraphQL schema as no longer supported. */ -export type DeprecatedDirectiveResolver = DirectiveResolverFn< - Result, - DeprecatedDirectiveArgs, - SiemContext ->; -export interface DeprecatedDirectiveArgs { - /** Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/). */ - reason?: string; -} - -export interface ToAnyScalarConfig extends GraphQLScalarTypeConfig { - name: 'ToAny'; -} -export interface ToStringArrayScalarConfig extends GraphQLScalarTypeConfig { - name: 'ToStringArray'; -} -export interface ToStringArrayNoNullableScalarConfig - extends GraphQLScalarTypeConfig { - name: 'ToStringArrayNoNullable'; -} -export interface ToDateArrayScalarConfig extends GraphQLScalarTypeConfig { - name: 'ToDateArray'; -} -export interface ToNumberArrayScalarConfig extends GraphQLScalarTypeConfig { - name: 'ToNumberArray'; -} -export interface ToBooleanArrayScalarConfig extends GraphQLScalarTypeConfig { - name: 'ToBooleanArray'; -} -export interface DateScalarConfig extends GraphQLScalarTypeConfig { - name: 'Date'; -} -export interface ToIFieldSubTypeNonNullableScalarConfig - extends GraphQLScalarTypeConfig { - name: 'ToIFieldSubTypeNonNullable'; -} - -export type IResolvers = { - Query?: QueryResolvers.Resolvers; - NoteResult?: NoteResultResolvers.Resolvers; - ResponseNotes?: ResponseNotesResolvers.Resolvers; - PinnedEvent?: PinnedEventResolvers.Resolvers; - Source?: SourceResolvers.Resolvers; - SourceConfiguration?: SourceConfigurationResolvers.Resolvers; - SourceFields?: SourceFieldsResolvers.Resolvers; - SourceStatus?: SourceStatusResolvers.Resolvers; - TimelineResult?: TimelineResultResolvers.Resolvers; - ColumnHeaderResult?: ColumnHeaderResultResolvers.Resolvers; - DataProviderResult?: DataProviderResultResolvers.Resolvers; - QueryMatchResult?: QueryMatchResultResolvers.Resolvers; - DateRangePickerResult?: DateRangePickerResultResolvers.Resolvers; - EqlOptionsResult?: EqlOptionsResultResolvers.Resolvers; - FavoriteTimelineResult?: FavoriteTimelineResultResolvers.Resolvers; - FilterTimelineResult?: FilterTimelineResultResolvers.Resolvers; - FilterMetaTimelineResult?: FilterMetaTimelineResultResolvers.Resolvers; - SerializedFilterQueryResult?: SerializedFilterQueryResultResolvers.Resolvers; - SerializedKueryQueryResult?: SerializedKueryQueryResultResolvers.Resolvers; - KueryFilterQueryResult?: KueryFilterQueryResultResolvers.Resolvers; - ResponseTimelines?: ResponseTimelinesResolvers.Resolvers; - Mutation?: MutationResolvers.Resolvers; - ResponseNote?: ResponseNoteResolvers.Resolvers; - ResponseTimeline?: ResponseTimelineResolvers.Resolvers; - ResponseFavoriteTimeline?: ResponseFavoriteTimelineResolvers.Resolvers; - EventEcsFields?: EventEcsFieldsResolvers.Resolvers; - Location?: LocationResolvers.Resolvers; - GeoEcsFields?: GeoEcsFieldsResolvers.Resolvers; - PrimarySecondary?: PrimarySecondaryResolvers.Resolvers; - Summary?: SummaryResolvers.Resolvers; - AgentEcsField?: AgentEcsFieldResolvers.Resolvers; - AuditdData?: AuditdDataResolvers.Resolvers; - AuditdEcsFields?: AuditdEcsFieldsResolvers.Resolvers; - OsEcsFields?: OsEcsFieldsResolvers.Resolvers; - HostEcsFields?: HostEcsFieldsResolvers.Resolvers; - Thread?: ThreadResolvers.Resolvers; - ProcessHashData?: ProcessHashDataResolvers.Resolvers; - ProcessEcsFields?: ProcessEcsFieldsResolvers.Resolvers; - SourceEcsFields?: SourceEcsFieldsResolvers.Resolvers; - DestinationEcsFields?: DestinationEcsFieldsResolvers.Resolvers; - DnsQuestionData?: DnsQuestionDataResolvers.Resolvers; - DnsEcsFields?: DnsEcsFieldsResolvers.Resolvers; - EndgameEcsFields?: EndgameEcsFieldsResolvers.Resolvers; - SuricataAlertData?: SuricataAlertDataResolvers.Resolvers; - SuricataEveData?: SuricataEveDataResolvers.Resolvers; - SuricataEcsFields?: SuricataEcsFieldsResolvers.Resolvers; - TlsJa3Data?: TlsJa3DataResolvers.Resolvers; - FingerprintData?: FingerprintDataResolvers.Resolvers; - TlsClientCertificateData?: TlsClientCertificateDataResolvers.Resolvers; - TlsServerCertificateData?: TlsServerCertificateDataResolvers.Resolvers; - TlsFingerprintsData?: TlsFingerprintsDataResolvers.Resolvers; - TlsEcsFields?: TlsEcsFieldsResolvers.Resolvers; - ZeekConnectionData?: ZeekConnectionDataResolvers.Resolvers; - ZeekNoticeData?: ZeekNoticeDataResolvers.Resolvers; - ZeekDnsData?: ZeekDnsDataResolvers.Resolvers; - FileFields?: FileFieldsResolvers.Resolvers; - ZeekHttpData?: ZeekHttpDataResolvers.Resolvers; - HttpBodyData?: HttpBodyDataResolvers.Resolvers; - HttpRequestData?: HttpRequestDataResolvers.Resolvers; - HttpResponseData?: HttpResponseDataResolvers.Resolvers; - HttpEcsFields?: HttpEcsFieldsResolvers.Resolvers; - UrlEcsFields?: UrlEcsFieldsResolvers.Resolvers; - ZeekFileData?: ZeekFileDataResolvers.Resolvers; - ZeekSslData?: ZeekSslDataResolvers.Resolvers; - ZeekEcsFields?: ZeekEcsFieldsResolvers.Resolvers; - UserEcsFields?: UserEcsFieldsResolvers.Resolvers; - WinlogEcsFields?: WinlogEcsFieldsResolvers.Resolvers; - NetworkEcsField?: NetworkEcsFieldResolvers.Resolvers; - PackageEcsFields?: PackageEcsFieldsResolvers.Resolvers; - AuditEcsFields?: AuditEcsFieldsResolvers.Resolvers; - SshEcsFields?: SshEcsFieldsResolvers.Resolvers; - AuthEcsFields?: AuthEcsFieldsResolvers.Resolvers; - SystemEcsField?: SystemEcsFieldResolvers.Resolvers; - RuleField?: RuleFieldResolvers.Resolvers; - SignalField?: SignalFieldResolvers.Resolvers; - RuleEcsField?: RuleEcsFieldResolvers.Resolvers; - Ecs?: EcsResolvers.Resolvers; - EcsEdges?: EcsEdgesResolvers.Resolvers; - CursorType?: CursorTypeResolvers.Resolvers; - IndexField?: IndexFieldResolvers.Resolvers; - PageInfo?: PageInfoResolvers.Resolvers; - Inspect?: InspectResolvers.Resolvers; - PageInfoPaginated?: PageInfoPaginatedResolvers.Resolvers; - ToAny?: GraphQLScalarType; - ToStringArray?: GraphQLScalarType; - ToStringArrayNoNullable?: GraphQLScalarType; - ToDateArray?: GraphQLScalarType; - ToNumberArray?: GraphQLScalarType; - ToBooleanArray?: GraphQLScalarType; - Date?: GraphQLScalarType; - ToIFieldSubTypeNonNullable?: GraphQLScalarType; -} & { [typeName: string]: never }; - -export type IDirectiveResolvers = { - skip?: SkipDirectiveResolver; - include?: IncludeDirectiveResolver; - deprecated?: DeprecatedDirectiveResolver; -} & { [directiveName: string]: never }; diff --git a/x-pack/plugins/security_solution/server/init_server.ts b/x-pack/plugins/security_solution/server/init_server.ts deleted file mode 100644 index d2810bf71f8ae..0000000000000 --- a/x-pack/plugins/security_solution/server/init_server.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IResolvers, makeExecutableSchema } from 'graphql-tools'; - -import { schemas } from './graphql'; -import { createScalarToStringArrayValueResolvers } from './graphql/ecs'; -import { createNoteResolvers } from './graphql/note'; -import { createPinnedEventResolvers } from './graphql/pinned_event'; -import { createScalarDateResolvers } from './graphql/scalar_date'; -import { createScalarToAnyValueResolvers } from './graphql/scalar_to_any'; -import { createScalarToBooleanArrayValueResolvers } from './graphql/scalar_to_boolean_array'; -import { createScalarToDateArrayValueResolvers } from './graphql/scalar_to_date_array'; -import { createScalarToNumberArrayValueResolvers } from './graphql/scalar_to_number_array'; -import { createSourceStatusResolvers } from './graphql/source_status'; -import { createSourcesResolvers } from './graphql/sources'; -import { createTimelineResolvers } from './graphql/timeline'; -import { AppBackendLibs } from './lib/types'; - -export const initServer = (libs: AppBackendLibs) => { - const schema = makeExecutableSchema({ - resolvers: [ - createNoteResolvers(libs) as IResolvers, - createPinnedEventResolvers(libs) as IResolvers, - createSourcesResolvers(libs) as IResolvers, - createScalarToStringArrayValueResolvers() as IResolvers, - createScalarDateResolvers() as IResolvers, - createScalarToDateArrayValueResolvers() as IResolvers, - createScalarToAnyValueResolvers() as IResolvers, - createScalarToBooleanArrayValueResolvers() as IResolvers, - createScalarToNumberArrayValueResolvers() as IResolvers, - createSourcesResolvers(libs) as IResolvers, - createSourceStatusResolvers(libs) as IResolvers, - createTimelineResolvers(libs) as IResolvers, - ], - typeDefs: schemas, - }); - - libs.framework.registerGraphQLEndpoint('/api/solutions/security/graphql', schema); -}; diff --git a/x-pack/plugins/security_solution/server/lib/compose/kibana.ts b/x-pack/plugins/security_solution/server/lib/compose/kibana.ts index 01318c87f8b3f..9be922ecf8db2 100644 --- a/x-pack/plugins/security_solution/server/lib/compose/kibana.ts +++ b/x-pack/plugins/security_solution/server/lib/compose/kibana.ts @@ -23,7 +23,7 @@ export function compose( plugins: SetupPlugins, endpointContext: EndpointAppContext ): AppBackendLibs { - const framework = new KibanaBackendFrameworkAdapter(core, plugins); + const framework = new KibanaBackendFrameworkAdapter(); const sources = new Sources(new ConfigurationSourcesAdapter()); const sourceStatus = new SourceStatus(new ElasticsearchSourceStatusAdapter(framework)); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/delete_timeline_by_timeline_id.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/delete_timeline_by_timeline_id.sh index 6271fd69cca5e..844ff61c4cd89 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/delete_timeline_by_timeline_id.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/delete_timeline_by_timeline_id.sh @@ -17,6 +17,6 @@ curl -s -k \ -H "Content-Type: application/json" \ -H 'kbn-xsrf: 123' \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ - -X POST "${KIBANA_URL}${SPACE_URL}/api/solutions/security/graphql" \ - -d '{"operationName":"DeleteTimelineMutation","variables":{"id":["'$1'"]},"query":"mutation DeleteTimelineMutation($id: [ID!]!) {\n deleteTimeline(id: $id)\n}\n"}' + -X DELETE "${KIBANA_URL}${SPACE_URL}/api/timeline" \ + -d '{"savedObjectIds": ["'$1'"]}' diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/find_timeline_by_filter.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/find_timeline_by_filter.sh index 721f3d888727e..d3b67120772f4 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/find_timeline_by_filter.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/find_timeline_by_filter.sh @@ -15,7 +15,7 @@ STATUS=${1:-active} TIMELINE_TYPE=${2:-default} # Example get all timelines: -# sh ./timelines/find_timeline_by_filter.sh active +# sh ./timelines/find_timeline_by_filter.sh active default # Example get all prepackaged timeline templates: # ./timelines/find_timeline_by_filter.sh immutable template @@ -27,8 +27,7 @@ curl -s -k \ -H "Content-Type: application/json" \ -H 'kbn-xsrf: 123' \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ - -X POST "${KIBANA_URL}${SPACE_URL}/api/solutions/security/graphql" \ - -d '{"operationName":"GetAllTimeline","variables":{"onlyUserFavorite":false,"pageInfo":{"pageIndex":1,"pageSize":10},"search":"","sort":{"sortField":"updated","sortOrder":"desc"},"status":"'$STATUS'","timelineType":"'$TIMELINE_TYPE'"},"query":"query GetAllTimeline($pageInfo: PageInfoTimeline!, $search: String, $sort: SortTimeline, $onlyUserFavorite: Boolean, $timelineType: TimelineType, $status: TimelineStatus) {\n getAllTimeline(pageInfo: $pageInfo, search: $search, sort: $sort, onlyUserFavorite: $onlyUserFavorite, timelineType: $timelineType, status: $status) {\n totalCount\n defaultTimelineCount\n templateTimelineCount\n elasticTemplateTimelineCount\n customTemplateTimelineCount\n favoriteCount\n timeline {\n savedObjectId\n description\n favorite {\n fullName\n userName\n favoriteDate\n __typename\n }\n eventIdToNoteIds {\n eventId\n note\n timelineId\n noteId\n created\n createdBy\n timelineVersion\n updated\n updatedBy\n version\n __typename\n }\n notes {\n eventId\n note\n timelineId\n timelineVersion\n noteId\n created\n createdBy\n updated\n updatedBy\n version\n __typename\n }\n noteIds\n pinnedEventIds\n status\n title\n timelineType\n templateTimelineId\n templateTimelineVersion\n created\n createdBy\n updated\n updatedBy\n version\n __typename\n }\n __typename\n }\n}\n"}' \ + -X GET "${KIBANA_URL}${SPACE_URL}/api/timelines?only_user_favorite=false&status=$STATUS&timeline_type=$TIMELINE_TYPE" \ | jq . diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/get_all_timelines.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/get_all_timelines.sh index fdf3488ab7c9d..d07f47db6b3a4 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/get_all_timelines.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/timelines/get_all_timelines.sh @@ -16,5 +16,5 @@ curl -s -k \ -H "Content-Type: application/json" \ -H 'kbn-xsrf: 123' \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ - -X GET "${KIBANA_URL}${SPACE_URL}/api/timeline" \ + -X GET "${KIBANA_URL}${SPACE_URL}/api/timelines" \ | jq . diff --git a/x-pack/plugins/security_solution/server/lib/framework/kibana_framework_adapter.ts b/x-pack/plugins/security_solution/server/lib/framework/kibana_framework_adapter.ts index 6306b26161b38..56c1c802fdd68 100644 --- a/x-pack/plugins/security_solution/server/lib/framework/kibana_framework_adapter.ts +++ b/x-pack/plugins/security_solution/server/lib/framework/kibana_framework_adapter.ts @@ -5,21 +5,10 @@ * 2.0. */ -import { GraphQLSchema } from 'graphql'; -import { runHttpQuery } from 'apollo-server-core'; -import { schema as configSchema } from '@kbn/config-schema'; -import type { - CoreSetup, - KibanaResponseFactory, - KibanaRequest, -} from '../../../../../../src/core/server'; +import type { KibanaRequest } from '../../../../../../src/core/server'; import { IndexPatternsFetcher, UI_SETTINGS } from '../../../../../../src/plugins/data/server'; import { AuthenticatedUser } from '../../../../security/common/model'; -import { SetupPlugins } from '../../plugin'; -import type { - SecuritySolutionRequestHandlerContext, - SecuritySolutionPluginRouter, -} from '../../types'; +import type { SecuritySolutionRequestHandlerContext } from '../../types'; import { FrameworkAdapter, @@ -27,17 +16,8 @@ import { FrameworkRequest, internalFrameworkRequest, } from './types'; -import { buildSiemResponse } from '../detection_engine/routes/utils'; export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { - private router: SecuritySolutionPluginRouter; - private security: SetupPlugins['security']; - - constructor(core: CoreSetup, plugins: SetupPlugins) { - this.router = core.http.createRouter(); - this.security = plugins.security; - } - public async callWithRequest( req: FrameworkRequest, endpoint: string, @@ -60,67 +40,6 @@ export class KibanaBackendFrameworkAdapter implements FrameworkAdapter { }); } - public registerGraphQLEndpoint(routePath: string, schema: GraphQLSchema): void { - this.router.post( - { - path: routePath, - validate: { body: configSchema.object({}, { unknowns: 'allow' }) }, - options: { - tags: ['access:securitySolution'], - }, - }, - async (context, request, response) => { - try { - const user = await this.getCurrentUserInfo(request); - const gqlResponse = await runHttpQuery([request], { - method: 'POST', - options: (req: KibanaRequest) => ({ - context: { req: wrapRequest(req, context, user) }, - schema, - }), - query: request.body, - }); - - return response.ok({ - body: gqlResponse, - headers: { - 'content-type': 'application/json', - }, - }); - } catch (error) { - return this.handleError(error, response); - } - } - ); - } - - private async getCurrentUserInfo(request: KibanaRequest): Promise { - try { - const user = (await this.security?.authc.getCurrentUser(request)) ?? null; - return user; - } catch { - return null; - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private handleError(error: any, response: KibanaResponseFactory) { - const siemResponse = buildSiemResponse(response); - - if (error.name === 'HttpQueryError') { - return siemResponse.error({ - statusCode: error.statusCode, - headers: error.headers, - body: error.message, - }); - } - - return siemResponse.error({ - statusCode: 500, - body: error.message, - }); - } - public getIndexPatternsService(request: FrameworkRequest): FrameworkIndexPatternsService { return new IndexPatternsFetcher(request.context.core.elasticsearch.client.asCurrentUser, true); } diff --git a/x-pack/plugins/security_solution/server/lib/framework/types.ts b/x-pack/plugins/security_solution/server/lib/framework/types.ts index b3f55a7a0ffa2..34012f8f15d16 100644 --- a/x-pack/plugins/security_solution/server/lib/framework/types.ts +++ b/x-pack/plugins/security_solution/server/lib/framework/types.ts @@ -6,27 +6,25 @@ */ import { IndicesGetMappingParams } from 'elasticsearch'; -import { GraphQLSchema } from 'graphql'; import { KibanaRequest } from '../../../../../../src/core/server'; import { AuthenticatedUser } from '../../../../security/common/model'; import { ESQuery } from '../../../common/typed_json'; import type { SecuritySolutionRequestHandlerContext } from '../../types'; import { + DocValueFieldsInput, PaginationInput, PaginationInputPaginated, SortField, - SourceConfiguration, TimerangeInput, - DocValueFieldsInput, -} from '../../graphql/types'; +} from '../../../common/search_strategy'; +import { SourceConfiguration } from '../sources'; export * from '../../utils/typed_resolvers'; export const internalFrameworkRequest = Symbol('internalFrameworkRequest'); export interface FrameworkAdapter { - registerGraphQLEndpoint(routePath: string, schema: GraphQLSchema): void; callWithRequest( req: FrameworkRequest, method: 'search', diff --git a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts index 2cdcb92baed08..cda97954563f3 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/__mocks__/request_responses.ts @@ -19,11 +19,7 @@ import { SavedTimeline, TimelineType, TimelineStatus } from '../../../../common/ import { requestMock } from '../../detection_engine/routes/__mocks__'; -import { - patchTimelineSchema, - createTimelineSchema, - GetTimelineByIdSchemaQuery, -} from '../schemas/timelines'; +import { patchTimelineSchema, createTimelineSchema, GetTimelineQuery } from '../schemas/timelines'; import { getReadables } from '../utils/common'; @@ -185,7 +181,7 @@ export const cleanDraftTimelinesRequest = (timelineType: TimelineType) => }, }); -export const getTimelineRequest = (query?: GetTimelineByIdSchemaQuery) => +export const getTimelineRequest = (query?: GetTimelineQuery) => requestMock.create({ method: 'get', path: TIMELINE_URL, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md b/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md index ee57d5bb3d031..defbf8be8b7c3 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/README.md @@ -619,5 +619,817 @@ kbn-version: 8.0.0 } ``` +## Get timelines / timeline templates api + +#### GET /api/timelines + + +##### Authorization + +Type: Basic Auth +username: Your Kibana username +password: Your Kibana password + + +##### Request header + +``` +Content-Type: application/json +kbn-version: 8.0.0 +``` + +##### Query params + +optional: +only_user_favorite={boolean} +page_index={number} +page_size={number} +search={string} +sort_field={title|description|updated|created} +sort_order={asc|desc} +status={active|draft|immutable} +timeline_type={default|template} + +##### example +api/timelines?page_size=10&page_index=1&sort_field=updated&sort_order=desc&timeline_type=default + +##### Response + +```json +{ + "totalCount": 2, + "timeline": [ + { + "savedObjectId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", + "version": "WzM1NzQ4NywzXQ==", + "columns": [ + { + "columnHeaderType": "not-filtered", + "id": "@timestamp", + "type": "number" + }, + { + "columnHeaderType": "not-filtered", + "id": "message" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.category" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.action" + }, + { + "columnHeaderType": "not-filtered", + "id": "host.name" + }, + { + "columnHeaderType": "not-filtered", + "id": "source.ip" + }, + { + "columnHeaderType": "not-filtered", + "id": "destination.ip" + }, + { + "columnHeaderType": "not-filtered", + "id": "user.name" + } + ], + "dataProviders": [ + { + "excluded": false, + "and": [], + "kqlQuery": "", + "name": "", + "queryMatch": { + "field": "host.name", + "value": "", + "operator": ":*" + }, + "id": "timeline-1-db9f4fc8-9420-420e-8e67-b12dd36691f6", + "type": "default", + "enabled": true + } + ], + "description": "", + "eqlOptions": { + "tiebreakerField": "", + "size": 100, + "query": "", + "eventCategoryField": "event.category", + "timestampField": "@timestamp" + }, + "eventType": "all", + "excludedRowRendererIds": [], + "filters": [], + "kqlMode": "filter", + "kqlQuery": { + "filterQuery": null + }, + "indexNames": [ + ".siem-signals-angelachuang-default", + "auditbeat-*", + "endgame-*", + "filebeat-*", + "logs-*", + "packetbeat-*", + "winlogbeat-*" + ], + "title": "timeline - Duplicate", + "timelineType": "default", + "templateTimelineVersion": null, + "templateTimelineId": null, + "dateRange": { + "start": "2021-03-25T05:38:55.593Z", + "end": "2021-03-26T15:59:59.999Z" + }, + "savedQueryId": null, + "sort": [ + { + "columnType": "number", + "sortDirection": "desc", + "columnId": "@timestamp" + } + ], + "status": "active", + "created": 1616757027458, + "createdBy": "angela", + "updated": 1616758738320, + "updatedBy": "angela", + "favorite": [], + "eventIdToNoteIds": [ + { + "noteId": "e6f3a9a0-8e23-11eb-ad8a-a192243e45e8", + "version": "WzM1NzQ4MywzXQ==", + "eventId": "QN84bngBYJMSg9tnAi1V", + "note": "note!", + "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", + "created": 1616757041466, + "createdBy": "angela", + "updated": 1616757041466, + "updatedBy": "angela" + } + ], + "noteIds": [ + "221524f0-8e24-11eb-ad8a-a192243e45e8" + ], + "notes": [ + { + "noteId": "e6f3a9a0-8e23-11eb-ad8a-a192243e45e8", + "version": "WzM1NzQ4MywzXQ==", + "eventId": "QN84bngBYJMSg9tnAi1V", + "note": "note!", + "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", + "created": 1616757041466, + "createdBy": "angela", + "updated": 1616757041466, + "updatedBy": "angela" + }, + { + "noteId": "221524f0-8e24-11eb-ad8a-a192243e45e8", + "version": "WzM1NzQ4NiwzXQ==", + "note": "global note!", + "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", + "created": 1616757140671, + "createdBy": "angela", + "updated": 1616757140671, + "updatedBy": "angela" + } + ], + "pinnedEventIds": [ + "QN84bngBYJMSg9tnAi1V", + "P984bngBYJMSg9tnAi1V" + ], + "pinnedEventsSaveObject": [ + { + "pinnedEventId": "e85339a0-8e23-11eb-ad8a-a192243e45e8", + "version": "WzM1NzQ4NCwzXQ==", + "eventId": "QN84bngBYJMSg9tnAi1V", + "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", + "created": 1616757043770, + "createdBy": "angela", + "updated": 1616757043770, + "updatedBy": "angela" + }, + { + "pinnedEventId": "2945cfe0-8e24-11eb-ad8a-a192243e45e8", + "version": "WzM1NzQ4NSwzXQ==", + "eventId": "P984bngBYJMSg9tnAi1V", + "timelineId": "de9a3620-8e23-11eb-ad8a-a192243e45e8", + "created": 1616757152734, + "createdBy": "angela", + "updated": 1616757152734, + "updatedBy": "angela" + } + ] + }, + { + "savedObjectId": "48870270-8e1f-11eb-9cbd-7f6324a02fb7", + "version": "WzM1NzQ4MiwzXQ==", + "columns": [ + { + "columnHeaderType": "not-filtered", + "id": "@timestamp", + "type": "number" + }, + { + "columnHeaderType": "not-filtered", + "id": "message" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.category" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.action" + }, + { + "columnHeaderType": "not-filtered", + "id": "host.name" + }, + { + "columnHeaderType": "not-filtered", + "id": "source.ip" + }, + { + "columnHeaderType": "not-filtered", + "id": "destination.ip" + }, + { + "columnHeaderType": "not-filtered", + "id": "user.name" + } + ], + "dataProviders": [ + { + "excluded": false, + "and": [], + "kqlQuery": "", + "name": "", + "queryMatch": { + "field": "host.name", + "value": "", + "operator": ":*" + }, + "id": "timeline-1-db9f4fc8-9420-420e-8e67-b12dd36691f6", + "type": "default", + "enabled": true + } + ], + "description": "", + "eventType": "all", + "filters": [], + "kqlMode": "filter", + "timelineType": "default", + "kqlQuery": { + "filterQuery": null + }, + "title": "timeline", + "sort": [ + { + "columnType": "number", + "sortDirection": "desc", + "columnId": "@timestamp" + } + ], + "status": "active", + "created": 1616755057686, + "createdBy": "angela", + "updated": 1616756755376, + "updatedBy": "angela", + "templateTimelineId": null, + "templateTimelineVersion": null, + "excludedRowRendererIds": [], + "dateRange": { + "start": "2021-03-25T16:00:00.000Z", + "end": "2021-03-26T15:59:59.999Z" + }, + "indexNames": [ + "auditbeat-*", + "endgame-*", + "filebeat-*", + "logs-*", + "packetbeat-*", + "winlogbeat-*", + ".siem-signals-angelachuang-default" + ], + "eqlOptions": { + "tiebreakerField": "", + "size": 100, + "query": "", + "eventCategoryField": "event.category", + "timestampField": "@timestamp" + }, + "savedQueryId": null, + "favorite": [ + { + "favoriteDate": 1616756755376, + "keySearch": "YW5nZWxh", + "fullName": "Angela", + "userName": "angela" + } + ], + "eventIdToNoteIds": [], + "noteIds": [], + "notes": [], + "pinnedEventIds": [], + "pinnedEventsSaveObject": [] + } + ], + "defaultTimelineCount": 2, + "templateTimelineCount": 4, + "elasticTemplateTimelineCount": 3, + "customTemplateTimelineCount": 1, + "favoriteCount": 1 +} +``` + +## Get timeline api + +#### GET /api/id?id={savedObjectId} + +##### Authorization + +Type: Basic Auth +username: Your Kibana username +password: Your Kibana password + + +##### Request header + +``` +Content-Type: application/json +kbn-version: 8.0.0 +``` + +##### Response +```json +{ + "data": { + "getOneTimeline": { + "savedObjectId": "48870270-8e1f-11eb-9cbd-7f6324a02fb7", + "version": "WzM1NzQ4MiwzXQ==", + "columns": [ + { + "columnHeaderType": "not-filtered", + "id": "@timestamp", + "type": "number" + }, + { + "columnHeaderType": "not-filtered", + "id": "message" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.category" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.action" + }, + { + "columnHeaderType": "not-filtered", + "id": "host.name" + }, + { + "columnHeaderType": "not-filtered", + "id": "source.ip" + }, + { + "columnHeaderType": "not-filtered", + "id": "destination.ip" + }, + { + "columnHeaderType": "not-filtered", + "id": "user.name" + } + ], + "dataProviders": [ + { + "excluded": false, + "and": [], + "kqlQuery": "", + "name": "", + "queryMatch": { + "field": "host.name", + "value": "", + "operator": ":*" + }, + "id": "timeline-1-db9f4fc8-9420-420e-8e67-b12dd36691f6", + "type": "default", + "enabled": true + } + ], + "description": "", + "eventType": "all", + "filters": [], + "kqlMode": "filter", + "timelineType": "default", + "kqlQuery": { + "filterQuery": null + }, + "title": "timeline", + "sort": [ + { + "columnType": "number", + "sortDirection": "desc", + "columnId": "@timestamp" + } + ], + "status": "active", + "created": 1616755057686, + "createdBy": "angela", + "updated": 1616756755376, + "updatedBy": "angela", + "templateTimelineId": null, + "templateTimelineVersion": null, + "excludedRowRendererIds": [], + "dateRange": { + "start": "2021-03-25T16:00:00.000Z", + "end": "2021-03-26T15:59:59.999Z" + }, + "indexNames": [ + "auditbeat-*", + "endgame-*", + "filebeat-*", + "logs-*", + "packetbeat-*", + "winlogbeat-*", + ".siem-signals-angelachuang-default" + ], + "eqlOptions": { + "tiebreakerField": "", + "size": 100, + "query": "", + "eventCategoryField": "event.category", + "timestampField": "@timestamp" + }, + "savedQueryId": null, + "favorite": [ + { + "favoriteDate": 1616756755376, + "keySearch": "YW5nZWxh", + "fullName": "Angela", + "userName": "angela" + } + ], + "eventIdToNoteIds": [], + "noteIds": [], + "notes": [], + "pinnedEventIds": [], + "pinnedEventsSaveObject": [] + } + } +} +``` + + +## Get timeline template api + +#### GET /api/timeline?template_timeline_id={templateTimelineId} + +##### Authorization + +Type: Basic Auth +username: Your Kibana username +password: Your Kibana password + + +##### Request header + +``` +Content-Type: application/json +kbn-version: 8.0.0 +``` + +##### Response +```json +{ + "data": { + "getOneTimeline": { + "savedObjectId": "bf662160-9788-11eb-8277-3516cc4109c3", + "version": "WzM1NzU2MCwzXQ==", + "columns": [ + { + "columnHeaderType": "not-filtered", + "id": "@timestamp" + }, + { + "columnHeaderType": "not-filtered", + "id": "signal.rule.description" + }, + { + "columnHeaderType": "not-filtered", + "id": "event.action" + }, + { + "columnHeaderType": "not-filtered", + "id": "process.name" + }, + { + "aggregatable": true, + "description": "The working directory of the process.", + "columnHeaderType": "not-filtered", + "id": "process.working_directory", + "category": "process", + "type": "string", + "example": "/home/alice" + }, + { + "aggregatable": true, + "description": "Array of process arguments, starting with the absolute path to\nthe executable.\n\nMay be filtered to protect sensitive information.", + "columnHeaderType": "not-filtered", + "id": "process.args", + "category": "process", + "type": "string", + "example": "[\"/usr/bin/ssh\",\"-l\",\"user\",\"10.0.0.16\"]" + }, + { + "columnHeaderType": "not-filtered", + "id": "process.pid" + }, + { + "aggregatable": true, + "description": "Absolute path to the process executable.", + "columnHeaderType": "not-filtered", + "id": "process.parent.executable", + "category": "process", + "type": "string", + "example": "/usr/bin/ssh" + }, + { + "aggregatable": true, + "description": "Array of process arguments.\n\nMay be filtered to protect sensitive information.", + "columnHeaderType": "not-filtered", + "id": "process.parent.args", + "category": "process", + "type": "string", + "example": "[\"ssh\",\"-l\",\"user\",\"10.0.0.16\"]" + }, + { + "aggregatable": true, + "description": "Process id.", + "columnHeaderType": "not-filtered", + "id": "process.parent.pid", + "category": "process", + "type": "number", + "example": "4242" + }, + { + "aggregatable": true, + "description": "Short name or login of the user.", + "columnHeaderType": "not-filtered", + "id": "user.name", + "category": "user", + "type": "string", + "example": "albert" + }, + { + "aggregatable": true, + "description": "Name of the host.\n\nIt can contain what `hostname` returns on Unix systems, the fully qualified\ndomain name, or a name specified by the user. The sender decides which value\nto use.", + "columnHeaderType": "not-filtered", + "id": "host.name", + "category": "host", + "type": "string" + } + ], + "dataProviders": [ + { + "excluded": false, + "and": [], + "kqlQuery": "", + "name": "{process.name}", + "queryMatch": { + "displayValue": null, + "field": "process.name", + "displayField": null, + "value": "{process.name}", + "operator": ":" + }, + "id": "timeline-1-8622010a-61fb-490d-b162-beac9c36a853", + "type": "template", + "enabled": true + } + ], + "description": "", + "eqlOptions": { + "eventCategoryField": "event.category", + "tiebreakerField": "", + "timestampField": "@timestamp", + "query": "", + "size": 100 + }, + "eventType": "all", + "excludedRowRendererIds": [], + "filters": [], + "kqlMode": "filter", + "kqlQuery": { + "filterQuery": { + "kuery": { + "kind": "kuery", + "expression": "" + }, + "serializedQuery": "" + } + }, + "indexNames": [], + "title": "Generic Process Timeline - Duplicate", + "timelineType": "template", + "templateTimelineVersion": 1, + "templateTimelineId": "94dd7443-97ea-4461-864d-fa96803ec111", + "dateRange": { + "start": "2021-04-06T07:57:57.922Z", + "end": "2021-04-07T07:57:57.922Z" + }, + "savedQueryId": null, + "sort": [ + { + "sortDirection": "desc", + "columnId": "@timestamp" + } + ], + "status": "active", + "created": 1617789914742, + "createdBy": "angela", + "updated": 1617790158569, + "updatedBy": "angela", + "favorite": [ + { + "favoriteDate": 1617790158569, + "keySearch": "YW5nZWxh", + "fullName": "Angela", + "userName": "angela" + } + ], + "eventIdToNoteIds": [], + "noteIds": [], + "notes": [], + "pinnedEventIds": [], + "pinnedEventsSaveObject": [] + } + } +} +``` + +## Delete timeline api + +#### DELETE /api/timeline + +##### Authorization + +Type: Basic Auth +username: Your Kibana username +password: Your Kibana password + + +##### Request header + +``` + +Content-Type: application/json + +kbn-version: 8.0.0 + +``` + +##### Request body + +```json +{ + "savedObjectIds": [savedObjectId1, savedObjectId2] +} +``` + +##### Response +```json +{"data":{"deleteTimeline":true}} +``` + +## Persist note api + +#### POST /api/note + +##### Authorization + +Type: Basic Auth +username: Your Kibana username +password: Your Kibana password + + +##### Request header + +``` +Content-Type: application/json +kbn-version: 8.0.0 +``` + +##### Request body + +```json +{ + "note": { + "timelineId": {timeline id that the note is linked to}, + "eventId" (optional): {event id the note is linked to. Not available is it is a global note}, + "note"(optional): {note content}, + }, + "noteId"(optional): note savedObjectId, + "version" (optional): note savedObjectVersion +} +``` +##### Example +```json +{ + "noteId": null, + "version": null, + "note": { + "eventId": "Q9tqqXgBc4D54_cxJnHV", + "note": "note", + "timelineId": "1ec3b430-908e-11eb-94fa-c9122cbc0213" + } +} +``` + +##### Response +``` +{ + "data": { + "persistNote": { + "code": 200, + "message": "success", + "note": { + "noteId": "fe8f6980-97ad-11eb-862e-850f4426d3d0", + "version": "WzM1MDAyNSwzXQ==", + "eventId": "UNtqqXgBc4D54_cxIGi-", + "note": "event note", + "timelineId": "1ec3b430-908e-11eb-94fa-c9122cbc0213", + "created": 1617805912088, + "createdBy": "angela", + "updated": 1617805912088, + "updatedBy": "angela" + } + } + } +} +``` + +## Persist pinned event api + +#### POST /api/pinned_event + +##### Authorization + +Type: Basic Auth +username: Your Kibana username +password: Your Kibana password + + +##### Request header + +``` +Content-Type: application/json +kbn-version: 8.0.0 +``` + +##### Request body + +```json +{ + "eventId": {event which is pinned} + "pinnedEventId" (optional): {pinned event savedObjectId} + "timelineId": {timeline which this pinned event is linked to} +} +``` + +##### example + +``` +{ + "eventId":"UdtqqXgBc4D54_cxIGi", + "pinnedEventId":null, + "timelineId":"1ec3b430-908e-11eb-94fa-c9122cbc0213" +} +``` + +##### Response +```json +{ + "data": { + "persistPinnedEventOnTimeline": { + "pinnedEventId": "5b8f1720-97ae-11eb-862e-850f4426d3d0", + "version": "WzM1MDA1OSwzXQ==", + "eventId": "UdtqqXgBc4D54_cxIGi-", + "timelineId": "1ec3b430-908e-11eb-94fa-c9122cbc0213", + "created": 1617806068114, + "createdBy": "angela", + "updated": 1617806068114, + "updatedBy": "angela" + } + } +} +``` + diff --git a/x-pack/plugins/security_solution/common/graphql/root/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/index.ts similarity index 83% rename from x-pack/plugins/security_solution/common/graphql/root/index.ts rename to x-pack/plugins/security_solution/server/lib/timeline/routes/notes/index.ts index 194a6bc1a12c9..2b8b6eb55fd94 100644 --- a/x-pack/plugins/security_solution/common/graphql/root/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { rootSchema } from './schema.gql'; +export { persistNoteRoute } from './persist_note'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts new file mode 100644 index 0000000000000..cb7d984ade40b --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SecuritySolutionPluginRouter } from '../../../../types'; + +import { NOTE_URL } from '../../../../../common/constants'; + +import { SetupPlugins } from '../../../../plugin'; +import { buildRouteValidationWithExcess } from '../../../../utils/build_validation/route_validation'; +import { ConfigType } from '../../../..'; + +import { transformError, buildSiemResponse } from '../../../detection_engine/routes/utils'; + +import { buildFrameworkRequest } from '../../utils/common'; +import { persistNoteSchema } from '../../schemas/notes'; +import { persistNote } from '../../saved_object/notes'; + +export const persistNoteRoute = ( + router: SecuritySolutionPluginRouter, + config: ConfigType, + security: SetupPlugins['security'] +) => { + router.patch( + { + path: NOTE_URL, + validate: { + body: buildRouteValidationWithExcess(persistNoteSchema), + }, + options: { + tags: ['access:securitySolution'], + }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + try { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const { note } = request.body; + const noteId = request.body?.noteId ?? null; + const version = request.body?.version ?? null; + + const res = await persistNote( + frameworkRequest, + noteId, + version, + { + ...note, + timelineId: note.timelineId || null, + }, + true + ); + + return response.ok({ + body: { data: { persistNote: res } }, + }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } + } + ); +}; diff --git a/x-pack/plugins/security_solution/common/graphql/shared/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/index.ts similarity index 79% rename from x-pack/plugins/security_solution/common/graphql/shared/index.ts rename to x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/index.ts index 4cf18cd629d62..448906196e34a 100644 --- a/x-pack/plugins/security_solution/common/graphql/shared/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './schema.gql'; +export { persistPinnedEventRoute } from './persist_pinned_event'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts new file mode 100644 index 0000000000000..53ac002721c6e --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SecuritySolutionPluginRouter } from '../../../../types'; + +import { PINNED_EVENT_URL } from '../../../../../common/constants'; + +import { SetupPlugins } from '../../../../plugin'; +import { buildRouteValidationWithExcess } from '../../../../utils/build_validation/route_validation'; +import { ConfigType } from '../../../..'; + +import { transformError, buildSiemResponse } from '../../../detection_engine/routes/utils'; + +import { buildFrameworkRequest } from '../../utils/common'; +import { persistPinnedEventSchema } from '../../schemas/pinned_events'; +import { persistPinnedEventOnTimeline } from '../../saved_object/pinned_events'; + +export const persistPinnedEventRoute = ( + router: SecuritySolutionPluginRouter, + config: ConfigType, + security: SetupPlugins['security'] +) => { + router.patch( + { + path: PINNED_EVENT_URL, + validate: { + body: buildRouteValidationWithExcess(persistPinnedEventSchema), + }, + options: { + tags: ['access:securitySolution'], + }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + try { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const { eventId } = request.body; + const pinnedEventId = request.body?.pinnedEventId ?? null; + const timelineId = request.body?.timelineId ?? null; + + const res = await persistPinnedEventOnTimeline( + frameworkRequest, + pinnedEventId, + eventId, + timelineId + ); + + return response.ok({ + body: { data: { persistPinnedEventOnTimeline: res } }, + }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } + } + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts index 626f3cbed5b77..e202230bf5cce 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.ts @@ -10,9 +10,9 @@ import { isEmpty } from 'lodash/fp'; import moment from 'moment'; import { timeline as timelineLib, pinnedEvent as pinnedEventLib } from '../../../saved_object'; import { FrameworkRequest } from '../../../../framework'; -import { SavedTimeline } from '../../../../../../common/types/timeline'; -import { NoteResult, ResponseTimeline } from '../../../../../graphql/types'; +import { ResponseTimeline, SavedTimeline } from '../../../../../../common/types/timeline'; import { persistNotes } from '../../../saved_object/notes/persist_notes'; +import { NoteResult } from '../../../../../../common/types/timeline/note'; interface CreateTimelineProps { frameworkRequest: FrameworkRequest; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts new file mode 100644 index 0000000000000..7617881b90b7f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; +import { ConfigType } from '../../../../..'; +import { deleteTimelinesSchema } from '../../../schemas/timelines/delete_timelines_schema'; +import { SecuritySolutionPluginRouter } from '../../../../../types'; +import { SetupPlugins } from '../../../../../plugin'; +import { TIMELINE_URL } from '../../../../../../common/constants'; +import { transformError, buildSiemResponse } from '../../../../detection_engine/routes/utils'; +import { buildFrameworkRequest } from '../../../utils/common'; +import { deleteTimeline } from '../../../saved_object/timelines'; + +export const deleteTimelinesRoute = ( + router: SecuritySolutionPluginRouter, + config: ConfigType, + security: SetupPlugins['security'] +) => { + router.delete( + { + path: TIMELINE_URL, + validate: { + body: buildRouteValidationWithExcess(deleteTimelinesSchema), + }, + options: { + tags: ['access:securitySolution'], + }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + try { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const { savedObjectIds } = request.body; + + await deleteTimeline(frameworkRequest, savedObjectIds); + return response.ok({ body: { data: { deleteTimeline: true } } }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } + } + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts index 8c559daa93da9..13a3a3909095a 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.test.ts @@ -12,11 +12,7 @@ import { requestContextMock, createMockConfig, } from '../../../../detection_engine/routes/__mocks__'; -import { - getTimelineOrNull, - getTimelineTemplateOrNull, - getAllTimeline, -} from '../../../saved_object/timelines'; +import { getTimelineOrNull, getTimelineTemplateOrNull } from '../../../saved_object/timelines'; import { mockGetCurrentUser } from '../../../__mocks__/import_timelines'; import { getTimelineRequest } from '../../../__mocks__/request_responses'; @@ -66,11 +62,8 @@ describe('get timeline', () => { expect((getTimelineOrNull as jest.Mock).mock.calls[0][1]).toEqual(id); }); - test('should call getAllTimeline if nither templateTimelineId nor id is given', async () => { - (getAllTimeline as jest.Mock).mockResolvedValue({ totalCount: 3 }); - - await server.inject(getTimelineRequest(), context); - - expect(getAllTimeline as jest.Mock).toHaveBeenCalledTimes(2); + test('should throw error message if nither templateTimelineId nor id is given', async () => { + const res = await server.inject(getTimelineRequest(), context); + expect(res.body.message).toEqual('please provide id or template_timeline_id'); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts index f49110d105765..8d94cd2ef2cce 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timeline/index.ts @@ -16,13 +16,8 @@ import { buildRouteValidationWithExcess } from '../../../../../utils/build_valid import { buildSiemResponse, transformError } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; -import { getTimelineByIdSchemaQuery } from '../../../schemas/timelines'; -import { - getTimelineTemplateOrNull, - getTimelineOrNull, - getAllTimeline, -} from '../../../saved_object/timelines'; -import { TimelineStatus } from '../../../../../../common/types/timeline'; +import { getTimelineQuerySchema } from '../../../schemas/timelines'; +import { getTimelineTemplateOrNull, getTimelineOrNull } from '../../../saved_object/timelines'; export const getTimelineRoute = ( router: SecuritySolutionPluginRouter, @@ -31,8 +26,10 @@ export const getTimelineRoute = ( ) => { router.get( { - path: `${TIMELINE_URL}`, - validate: { query: buildRouteValidationWithExcess(getTimelineByIdSchemaQuery) }, + path: TIMELINE_URL, + validate: { + query: buildRouteValidationWithExcess(getTimelineQuerySchema), + }, options: { tags: ['access:securitySolution'], }, @@ -42,34 +39,18 @@ export const getTimelineRoute = ( const frameworkRequest = await buildFrameworkRequest(context, security, request); const query = request.query ?? {}; const { template_timeline_id: templateTimelineId, id } = query; + let res = null; + if (templateTimelineId != null && id == null) { res = await getTimelineTemplateOrNull(frameworkRequest, templateTimelineId); } else if (templateTimelineId == null && id != null) { res = await getTimelineOrNull(frameworkRequest, id); - } else if (templateTimelineId == null && id == null) { - const tempResult = await getAllTimeline( - frameworkRequest, - false, - { pageSize: 1, pageIndex: 1 }, - null, - null, - TimelineStatus.active, - null - ); - - res = await getAllTimeline( - frameworkRequest, - false, - { pageSize: tempResult?.totalCount ?? 0, pageIndex: 1 }, - null, - null, - TimelineStatus.active, - null - ); + } else { + throw new Error('please provide id or template_timeline_id'); } - return response.ok({ body: res ?? {} }); + return response.ok({ body: res ? { data: { getOneTimeline: res } } : {} }); } catch (err) { const error = transformError(err); const siemResponse = buildSiemResponse(response); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts new file mode 100644 index 0000000000000..a29902934172f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SecurityPluginSetup } from '../../../../../../../security/server'; + +import { + serverMock, + requestContextMock, + createMockConfig, +} from '../../../../detection_engine/routes/__mocks__'; +import { getAllTimeline } from '../../../saved_object/timelines'; + +import { mockGetCurrentUser } from '../../../__mocks__/import_timelines'; +import { getTimelineRequest } from '../../../__mocks__/request_responses'; + +import { getTimelinesRoute } from '.'; + +jest.mock('../../../saved_object/timelines', () => ({ + getAllTimeline: jest.fn(), +})); + +describe('get all timelines', () => { + let server: ReturnType; + let securitySetup: SecurityPluginSetup; + let { context } = requestContextMock.createTools(); + + beforeEach(() => { + jest.resetModules(); + jest.resetAllMocks(); + + server = serverMock.create(); + context = requestContextMock.createTools().context; + + securitySetup = ({ + authc: { + getCurrentUser: jest.fn().mockReturnValue(mockGetCurrentUser), + }, + authz: {}, + } as unknown) as SecurityPluginSetup; + + getTimelinesRoute(server.router, createMockConfig(), securitySetup); + }); + + test('should get the total count', async () => { + await server.inject(getTimelineRequest(), context); + expect((getAllTimeline as jest.Mock).mock.calls[0][2]).toEqual({ pageSize: 1, pageIndex: 1 }); + }); + + test('should get all timelines with total count', async () => { + (getAllTimeline as jest.Mock).mockResolvedValue({ totalCount: 100 }); + await server.inject(getTimelineRequest(), context); + expect((getAllTimeline as jest.Mock).mock.calls[1][2]).toEqual({ pageSize: 100, pageIndex: 1 }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts new file mode 100644 index 0000000000000..51a02db681b0c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/get_timelines/index.ts @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import Boom from '@hapi/boom'; + +import { pipe } from 'fp-ts/lib/pipeable'; +import { fold } from 'fp-ts/lib/Either'; +import { identity } from 'fp-ts/lib/function'; + +import type { SecuritySolutionPluginRouter } from '../../../../../types'; +import { TIMELINES_URL } from '../../../../../../common/constants'; + +import { ConfigType } from '../../../../..'; +import { SetupPlugins } from '../../../../../plugin'; + +import { buildSiemResponse, transformError } from '../../../../detection_engine/routes/utils'; + +import { buildFrameworkRequest, escapeHatch, throwErrors } from '../../../utils/common'; +import { getAllTimeline } from '../../../saved_object/timelines'; +import { getTimelinesQuerySchema } from '../../../schemas/timelines'; + +export const getTimelinesRoute = ( + router: SecuritySolutionPluginRouter, + config: ConfigType, + security: SetupPlugins['security'] +) => { + router.get( + { + path: TIMELINES_URL, + validate: { + query: escapeHatch, + }, + options: { + tags: ['access:securitySolution'], + }, + }, + async (context, request, response) => { + try { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const queryParams = pipe( + getTimelinesQuerySchema.decode(request.query), + fold(throwErrors(Boom.badRequest), identity) + ); + const onlyUserFavorite = queryParams?.only_user_favorite === 'true' ? true : false; + const pageSize = queryParams?.page_size ? parseInt(queryParams.page_size, 10) : null; + const pageIndex = queryParams?.page_index ? parseInt(queryParams.page_index, 10) : null; + const search = queryParams?.search ?? null; + const sortField = queryParams?.sort_field ?? null; + const sortOrder = queryParams?.sort_order ?? null; + const status = queryParams?.status ?? null; + const timelineType = queryParams?.timeline_type ?? null; + const sort = + sortField && sortOrder + ? { + sortField, + sortOrder, + } + : null; + let res = null; + let totalCount = null; + + if (pageSize == null && pageIndex == null) { + const allActiveTimelines = await getAllTimeline( + frameworkRequest, + false, + { pageSize: 1, pageIndex: 1 }, + null, + null, + null, + null + ); + totalCount = allActiveTimelines.totalCount; + } + + res = await getAllTimeline( + frameworkRequest, + onlyUserFavorite, + { + pageSize: pageSize ?? totalCount ?? 1, + pageIndex: pageIndex ?? 1, + }, + search, + sort, + status, + timelineType + ); + + return response.ok({ body: res ?? {} }); + } catch (err) { + const error = transformError(err); + const siemResponse = buildSiemResponse(response); + + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } + } + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts index 1184629e47e87..aeb7463377b1f 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/create_timelines_stream_from_ndjson.ts @@ -9,7 +9,6 @@ import * as rt from 'io-ts'; import { Transform } from 'stream'; import { pipe } from 'fp-ts/lib/pipeable'; import { fold } from 'fp-ts/lib/Either'; -import { failure } from 'io-ts/lib/PathReporter'; import { identity } from 'fp-ts/lib/function'; import { createConcatStream, createSplitStream, createMapStream } from '@kbn/utils'; import { @@ -21,15 +20,12 @@ import { import { ImportTimelineResponse } from './types'; import { ImportTimelinesSchemaRt } from '../../../schemas/timelines/import_timelines_schema'; import { BadRequestError } from '../../../../detection_engine/errors/bad_request_error'; +import { throwErrors } from '../../../utils/common'; type ErrorFactory = (message: string) => Error; export const createPlainError = (message: string) => new Error(message); -export const throwErrors = (createError: ErrorFactory) => (errors: rt.Errors) => { - throw createError(failure(errors).join('\n')); -}; - export const decodeOrThrow = ( runtimeType: rt.Type, createError: ErrorFactory = createPlainError diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts index 21ff77e1edbdd..a19276652e78b 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/helpers.ts @@ -131,6 +131,7 @@ export const importTimelines = async ( timelineType, version, } = parsedTimeline; + const parsedTimelineObject = omit(timelineSavedObjectOmittedFields, parsedTimeline); let newTimeline = null; try { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/types.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/types.ts index cc4221cba1098..2cec338555b30 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/types.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/types.ts @@ -7,9 +7,9 @@ import { BulkError } from '../../../../detection_engine/routes/utils'; import { SavedTimeline } from '../../../../../../common/types/timeline'; -import { NoteResult } from '../../../../../graphql/types'; import { HapiReadableStream } from '../../../../detection_engine/rules/types'; import { TimelineStatusActions } from '../../../utils/common'; +import { NoteResult } from '../../../../../../common/types/timeline/note'; export type ImportedTimeline = SavedTimeline & { savedObjectId: string | null; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/index.ts new file mode 100644 index 0000000000000..ebd0dbba7d197 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +export { createTimelinesRoute } from './create_timelines'; +export { deleteTimelinesRoute } from './delete_timelines'; +export { exportTimelinesRoute } from './export_timelines'; +export { getTimelineRoute } from './get_timeline'; +export { getTimelinesRoute } from './get_timelines'; +export { importTimelinesRoute } from './import_timelines'; +export { patchTimelinesRoute } from './patch_timelines'; +export { persistFavoriteRoute } from './persist_favorite'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts index 8f583dbcc05a8..e0cd1a166dd43 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.test.ts @@ -86,8 +86,8 @@ describe('update timelines', () => { }; }); - const updateTimelinesRoute = jest.requireActual('./index').updateTimelinesRoute; - updateTimelinesRoute(server.router, createMockConfig(), securitySetup); + const patchTimelinesRoute = jest.requireActual('./index').patchTimelinesRoute; + patchTimelinesRoute(server.router, createMockConfig(), securitySetup); const mockRequest = getUpdateTimelinesRequest(updateTimelineWithTimelineId); await server.inject(mockRequest, context); @@ -150,8 +150,8 @@ describe('update timelines', () => { }; }); - const updateTimelinesRoute = jest.requireActual('./index').updateTimelinesRoute; - updateTimelinesRoute(server.router, createMockConfig(), securitySetup); + const patchTimelinesRoute = jest.requireActual('./index').patchTimelinesRoute; + patchTimelinesRoute(server.router, createMockConfig(), securitySetup); }); test('returns error message', async () => { @@ -194,8 +194,8 @@ describe('update timelines', () => { }; }); - const updateTimelinesRoute = jest.requireActual('./index').updateTimelinesRoute; - updateTimelinesRoute(server.router, createMockConfig(), securitySetup); + const patchTimelinesRoute = jest.requireActual('./index').patchTimelinesRoute; + patchTimelinesRoute(server.router, createMockConfig(), securitySetup); const mockRequest = getUpdateTimelinesRequest(updateTemplateTimelineWithTimelineId); await server.inject(mockRequest, context); @@ -270,8 +270,8 @@ describe('update timelines', () => { }; }); - const updateTimelinesRoute = jest.requireActual('./index').updateTimelinesRoute; - updateTimelinesRoute(server.router, createMockConfig(), securitySetup); + const patchTimelinesRoute = jest.requireActual('./index').patchTimelinesRoute; + patchTimelinesRoute(server.router, createMockConfig(), securitySetup); }); test('returns error message', async () => { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts index 61880789eca84..b0142625f5e08 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/patch_timelines/index.ts @@ -20,7 +20,7 @@ import { buildFrameworkRequest, TimelineStatusActions } from '../../../utils/com import { createTimelines } from '../create_timelines'; import { CompareTimelinesStatus } from '../../../utils/compare_timelines_status'; -export const updateTimelinesRoute = ( +export const patchTimelinesRoute = ( router: SecuritySolutionPluginRouter, config: ConfigType, security: SetupPlugins['security'] diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts new file mode 100644 index 0000000000000..2cc3888696248 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SecuritySolutionPluginRouter } from '../../../../../types'; + +import { TIMELINE_FAVORITE_URL } from '../../../../../../common/constants'; + +import { SetupPlugins } from '../../../../../plugin'; +import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; +import { ConfigType } from '../../../../..'; + +import { transformError, buildSiemResponse } from '../../../../detection_engine/routes/utils'; + +import { buildFrameworkRequest } from '../../../utils/common'; +import { persistFavorite } from '../../../saved_object/timelines'; +import { TimelineType } from '../../../../../../common/types/timeline'; +import { persistFavoriteSchema } from '../../../schemas/timelines/persist_favorite_schema'; + +export const persistFavoriteRoute = ( + router: SecuritySolutionPluginRouter, + config: ConfigType, + security: SetupPlugins['security'] +) => { + router.patch( + { + path: TIMELINE_FAVORITE_URL, + validate: { + body: buildRouteValidationWithExcess(persistFavoriteSchema), + }, + options: { + tags: ['access:securitySolution'], + }, + }, + async (context, request, response) => { + const siemResponse = buildSiemResponse(response); + + try { + const frameworkRequest = await buildFrameworkRequest(context, security, request); + const { + timelineId, + templateTimelineId, + templateTimelineVersion, + timelineType, + } = request.body; + + const timeline = await persistFavorite( + frameworkRequest, + timelineId || null, + templateTimelineId || null, + templateTimelineVersion || null, + timelineType || TimelineType.default + ); + + return response.ok({ + body: { + data: { + persistFavorite: timeline, + }, + }, + }); + } catch (err) { + const error = transformError(err); + return siemResponse.error({ + body: error.message, + statusCode: error.statusCode, + }); + } + } + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/get_overridable_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/get_overridable_note.ts index 1ff1c37a16357..6feca76ff53a9 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/get_overridable_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/get_overridable_note.ts @@ -5,11 +5,15 @@ * 2.0. */ -import { SavedNote } from '../../../../../common/types/timeline/note'; -import { NoteResult } from '../../../../graphql/types'; +import { NoteResult, SavedNote } from '../../../../../common/types/timeline/note'; import { FrameworkRequest } from '../../../framework'; import { getNote } from './saved_object'; +/** + * When importing timeline with an existing note by others, we don't want override the owner. + * In this case we can set overrideOwner to false to keep the original author + */ + export const getOverridableNote = async ( frameworkRequest: FrameworkRequest, note: NoteResult, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/index.ts index 9addf0f80e124..34914517da683 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/index.ts @@ -6,8 +6,14 @@ */ import { FrameworkRequest } from '../../../framework'; -import { PageInfoNote, ResponseNote, ResponseNotes, SortNote } from '../../../../graphql/types'; -import { SavedNote, NoteSavedObject } from '../../../../../common/types/timeline/note'; +import { + SavedNote, + NoteSavedObject, + PageInfoNote, + SortNote, + ResponseNotes, + ResponseNote, +} from '../../../../../common/types/timeline/note'; export * from './saved_object'; export interface Notes { diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts index 7f6a355f43df0..58b4e33444d94 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/persist_notes.ts @@ -6,9 +6,9 @@ */ import { FrameworkRequest } from '../../../framework'; -import { NoteResult } from '../../../../graphql/types'; import { persistNote } from './saved_object'; import { getOverridableNote } from './get_overridable_note'; +import { NoteResult } from '../../../../../common/types/timeline/note'; export const persistNotes = async ( frameworkRequest: FrameworkRequest, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts index 8016fdf12881d..91caaa8cc8a8b 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts @@ -20,14 +20,12 @@ import { SavedNote, NoteSavedObjectRuntimeType, NoteSavedObject, -} from '../../../../../common/types/timeline/note'; -import { PageInfoNote, - ResponseNote, - ResponseNotes, SortNote, NoteResult, -} from '../../../../graphql/types'; + ResponseNotes, + ResponseNote, +} from '../../../../../common/types/timeline/note'; import { FrameworkRequest } from '../../../framework'; import { noteSavedObjectType } from '../../saved_object_mappings/notes'; import { convertSavedObjectToSavedTimeline, pickSavedTimeline } from '../timelines'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts index 6467d1d43d807..b3d262b13cbf3 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts @@ -18,14 +18,11 @@ import { PinnedEventSavedObject, PinnedEventSavedObjectRuntimeType, SavedPinnedEvent, + PinnedEvent as PinnedEventResponse, } from '../../../../../common/types/timeline/pinned_event'; +import { PageInfoNote, SortNote } from '../../../../../common/types/timeline/note'; import { FrameworkRequest } from '../../../framework'; -import { - PageInfoNote, - SortNote, - PinnedEvent as PinnedEventResponse, -} from '../../../../graphql/types'; import { pickSavedTimeline } from '../../saved_object/timelines'; import { convertSavedObjectToSavedTimeline } from '../timelines'; import { pinnedEventSavedObjectType } from '../../saved_object_mappings/pinned_events'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts index 61e25d419a0e4..1136753bc8316 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.test.ts @@ -8,15 +8,11 @@ import { FrameworkRequest } from '../../../framework'; import { mockGetTimelineValue, mockSavedObject } from '../../__mocks__/import_timelines'; -import { - convertStringToBase64, - getExistingPrepackagedTimelines, - getAllTimeline, - AllTimelinesResponse, -} from '.'; +import { convertStringToBase64, getExistingPrepackagedTimelines, getAllTimeline } from '.'; import { convertSavedObjectToSavedTimeline } from './convert_saved_object_to_savedtimeline'; import { getNotesByTimelineId } from '../notes/saved_object'; import { getAllPinnedEventsByTimelineId } from '../pinned_events'; +import { AllTimelinesResponse } from '../../../../../common/types/timeline'; jest.mock('./convert_saved_object_to_savedtimeline', () => ({ convertSavedObjectToSavedTimeline: jest.fn(), diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts index 0f624ef5420bc..8904a9103bc02 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts @@ -12,22 +12,21 @@ import { UNAUTHENTICATED_USER } from '../../../../../common/constants'; import { NoteSavedObject } from '../../../../../common/types/timeline/note'; import { PinnedEventSavedObject } from '../../../../../common/types/timeline/pinned_event'; import { + AllTimelinesResponse, + ExportTimelineNotFoundError, + PageInfoTimeline, + ResponseTimelines, + ResponseFavoriteTimeline, + ResponseTimeline, SavedTimeline, + SortTimeline, TimelineSavedObject, TimelineTypeLiteralWithNull, - ExportTimelineNotFoundError, TimelineStatusLiteralWithNull, -} from '../../../../../common/types/timeline'; -import { - ResponseTimeline, - PageInfoTimeline, - SortTimeline, - ResponseFavoriteTimeline, - TimelineResult, TimelineType, TimelineStatus, - Maybe, -} from '../../../../graphql/types'; + TimelineResult, +} from '../../../../../common/types/timeline'; import { FrameworkRequest } from '../../../framework'; import * as note from '../notes/saved_object'; import * as pinnedEvent from '../pinned_events'; @@ -36,22 +35,10 @@ import { pickSavedTimeline } from './pick_saved_timeline'; import { timelineSavedObjectType } from '../../saved_object_mappings/'; import { draftTimelineDefaults } from '../../utils/default_timeline'; import { AuthenticatedUser } from '../../../../../../security/server'; +import { Maybe } from '../../../../../common/search_strategy'; export { pickSavedTimeline } from './pick_saved_timeline'; export { convertSavedObjectToSavedTimeline } from './convert_saved_object_to_savedtimeline'; -interface ResponseTimelines { - timeline: TimelineSavedObject[]; - totalCount: number; -} - -export interface AllTimelinesResponse extends ResponseTimelines { - defaultTimelineCount: number; - templateTimelineCount: number; - elasticTemplateTimelineCount: number; - customTemplateTimelineCount: number; - favoriteCount: number; -} - export interface ResponseTemplateTimeline { code?: Maybe; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/schemas/notes/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/notes/index.ts index de1e357896353..b2fc7a0beb065 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/schemas/notes/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/notes/index.ts @@ -11,3 +11,14 @@ import { SavedNoteRuntimeType } from '../../../../../common/types/timeline/note' export const eventNotes = unionWithNullType(runtimeTypes.array(SavedNoteRuntimeType)); export const globalNotes = unionWithNullType(runtimeTypes.array(SavedNoteRuntimeType)); + +export const persistNoteSchema = runtimeTypes.intersection([ + runtimeTypes.type({ + note: SavedNoteRuntimeType, + }), + runtimeTypes.partial({ + overrideOwner: unionWithNullType(runtimeTypes.boolean), + noteId: unionWithNullType(runtimeTypes.string), + version: unionWithNullType(runtimeTypes.string), + }), +]); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/schemas/pinned_events/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/pinned_events/index.ts index 29afda10dce80..e0bd1f95f5953 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/schemas/pinned_events/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/pinned_events/index.ts @@ -9,3 +9,12 @@ import * as runtimeTypes from 'io-ts'; import { unionWithNullType } from '../../../../../common/utility_types'; export const pinnedEventIds = unionWithNullType(runtimeTypes.array(runtimeTypes.string)); +export const persistPinnedEventSchema = runtimeTypes.intersection([ + runtimeTypes.type({ + eventId: runtimeTypes.string, + }), + runtimeTypes.partial({ + pinnedEventId: unionWithNullType(runtimeTypes.string), + timelineId: unionWithNullType(runtimeTypes.string), + }), +]); diff --git a/x-pack/plugins/security_solution/server/graphql/scalar_date/schema.gql.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/delete_timelines_schema.ts similarity index 68% rename from x-pack/plugins/security_solution/server/graphql/scalar_date/schema.gql.ts rename to x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/delete_timelines_schema.ts index 3c1ba4fedcf36..4aadb73283676 100644 --- a/x-pack/plugins/security_solution/server/graphql/scalar_date/schema.gql.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/delete_timelines_schema.ts @@ -5,8 +5,8 @@ * 2.0. */ -import gql from 'graphql-tag'; +import * as rt from 'io-ts'; -export const dateSchema = gql` - scalar Date -`; +export const deleteTimelinesSchema = rt.type({ + savedObjectIds: rt.array(rt.string), +}); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timeline_by_id_schema.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timeline_schema.ts similarity index 70% rename from x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timeline_by_id_schema.ts rename to x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timeline_schema.ts index 4e6102e2d87e4..cca6886f42025 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timeline_by_id_schema.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timeline_schema.ts @@ -7,9 +7,9 @@ import * as rt from 'io-ts'; -export const getTimelineByIdSchemaQuery = rt.partial({ +export const getTimelineQuerySchema = rt.partial({ template_timeline_id: rt.string, id: rt.string, }); -export type GetTimelineByIdSchemaQuery = rt.TypeOf; +export type GetTimelineQuery = rt.TypeOf; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timelines_schema.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timelines_schema.ts new file mode 100644 index 0000000000000..7353741128435 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/get_timelines_schema.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as rt from 'io-ts'; +import { + direction, + sortFieldTimeline, + TimelineStatusLiteralRt, + TimelineTypeLiteralRt, +} from '../../../../../common/types/timeline'; +import { unionWithNullType } from '../../../../../common/utility_types'; + +const BoolFromString = rt.union([rt.literal('true'), rt.literal('false')]); + +export const getTimelinesQuerySchema = rt.partial({ + only_user_favorite: unionWithNullType(BoolFromString), + page_index: unionWithNullType(rt.string), + page_size: unionWithNullType(rt.string), + search: unionWithNullType(rt.string), + sort_field: sortFieldTimeline, + sort_order: direction, + status: unionWithNullType(TimelineStatusLiteralRt), + timeline_type: unionWithNullType(TimelineTypeLiteralRt), +}); + +export const getTimelinesArgsSchema = rt.partial({ + onlyUserFavorite: unionWithNullType(BoolFromString), + pageIndex: unionWithNullType(rt.string), + pageSize: unionWithNullType(rt.string), + search: unionWithNullType(rt.string), + sortField: sortFieldTimeline, + sortOrder: direction, + status: unionWithNullType(TimelineStatusLiteralRt), + timelineType: unionWithNullType(TimelineTypeLiteralRt), +}); + +export type GetTimelinesArgs = rt.TypeOf; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/index.ts index e85ae2ab4ae86..a88d6a6741517 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/index.ts @@ -6,5 +6,6 @@ */ export * from './create_timelines_schema'; export * from './export_timelines_schema'; -export * from './get_timeline_by_id_schema'; +export * from './get_timeline_schema'; +export * from './get_timelines_schema'; export * from './patch_timelines_schema'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/persist_favorite_schema.ts b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/persist_favorite_schema.ts new file mode 100644 index 0000000000000..9b96e8ce0ca18 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/timeline/schemas/timelines/persist_favorite_schema.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as rt from 'io-ts'; + +import { TimelineTypeLiteralRt } from '../../../../../common/types/timeline'; +import { unionWithNullType } from '../../../../../common/utility_types'; + +export const persistFavoriteSchema = rt.type({ + timelineId: unionWithNullType(rt.string), + templateTimelineId: unionWithNullType(rt.string), + templateTimelineVersion: unionWithNullType(rt.number), + timelineType: unionWithNullType(TimelineTypeLiteralRt), +}); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts b/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts index 443742ae88f0d..18fa84c9cf3ae 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts @@ -4,12 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import * as rt from 'io-ts'; import { set } from '@elastic/safer-lodash-set/fp'; import readline from 'readline'; import fs from 'fs'; import { Readable } from 'stream'; import { createListStream } from '@kbn/utils'; +import { schema } from '@kbn/config-schema'; +import { isObject } from 'lodash/fp'; import { KibanaRequest } from 'src/core/server'; import { SetupPlugins } from '../../../plugin'; @@ -36,6 +38,37 @@ export const buildFrameworkRequest = async ( ); }; +export const escapeHatch = schema.object({}, { unknowns: 'allow' }); + +export const formatErrors = (errors: rt.Errors): string[] => { + const err = errors.map((error) => { + if (error.message != null) { + return error.message; + } else { + const keyContext = error.context + .filter( + (entry) => entry.key != null && !Number.isInteger(+entry.key) && entry.key.trim() !== '' + ) + .map((entry) => entry.key) + .join(','); + + const nameContext = error.context.find((entry) => entry.type?.name?.length > 0); + const suppliedValue = + keyContext !== '' ? keyContext : nameContext != null ? nameContext.type.name : ''; + const value = isObject(error.value) ? JSON.stringify(error.value) : error.value; + return `Invalid value "${value}" supplied to "${suppliedValue}"`; + } + }); + + return [...new Set(err)]; +}; + +type ErrorFactory = (message: string) => Error; + +export const throwErrors = (createError: ErrorFactory) => (errors: rt.Errors) => { + throw createError(formatErrors(errors).join('\n')); +}; + export const getReadables = (dataPath: string): Promise => new Promise((resolved, reject) => { const contents: string[] = []; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 003ba4c8cf190..d0b7e6500c42b 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -36,7 +36,6 @@ import { SpacesPluginSetup as SpacesSetup } from '../../spaces/server'; import { ILicense, LicensingPluginStart } from '../../licensing/server'; import { FleetStartContract } from '../../fleet/server'; import { TaskManagerSetupContract, TaskManagerStartContract } from '../../task_manager/server'; -import { initServer } from './init_server'; import { compose } from './lib/compose/kibana'; import { initRoutes } from './routes'; import { isAlertExecutor } from './lib/detection_engine/signals/types'; @@ -300,8 +299,7 @@ export class Plugin implements IPlugin { const securitySolutionSearchStrategy = securitySolutionSearchStrategyProvider(depsStart.data); diff --git a/x-pack/plugins/security_solution/server/routes/index.ts b/x-pack/plugins/security_solution/server/routes/index.ts index 488816cc6ad90..54090dc886ceb 100644 --- a/x-pack/plugins/security_solution/server/routes/index.ts +++ b/x-pack/plugins/security_solution/server/routes/index.ts @@ -33,16 +33,26 @@ import { importRulesRoute } from '../lib/detection_engine/routes/rules/import_ru import { exportRulesRoute } from '../lib/detection_engine/routes/rules/export_rules_route'; import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/find_rules_status_route'; import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route'; -import { importTimelinesRoute } from '../lib/timeline/routes/timelines/import_timelines'; -import { exportTimelinesRoute } from '../lib/timeline/routes/timelines/export_timelines'; -import { createTimelinesRoute } from '../lib/timeline/routes/timelines/create_timelines'; -import { updateTimelinesRoute } from '../lib/timeline/routes/timelines/patch_timelines'; +import { + createTimelinesRoute, + deleteTimelinesRoute, + exportTimelinesRoute, + getTimelineRoute, + getTimelinesRoute, + importTimelinesRoute, + patchTimelinesRoute, + persistFavoriteRoute, +} from '../lib/timeline/routes/timelines'; import { getDraftTimelinesRoute } from '../lib/timeline/routes/draft_timelines/get_draft_timelines'; import { cleanDraftTimelinesRoute } from '../lib/timeline/routes/draft_timelines/clean_draft_timelines'; + +import { persistNoteRoute } from '../lib/timeline/routes/notes'; + +import { persistPinnedEventRoute } from '../lib/timeline/routes/pinned_events'; + import { SetupPlugins } from '../plugin'; import { ConfigType } from '../config'; import { installPrepackedTimelinesRoute } from '../lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines'; -import { getTimelineRoute } from '../lib/timeline/routes/timelines/get_timeline'; export const initRoutes = ( router: SecuritySolutionPluginRouter, @@ -68,7 +78,7 @@ export const initRoutes = ( deleteRulesBulkRoute(router); createTimelinesRoute(router, config, security); - updateTimelinesRoute(router, config, security); + patchTimelinesRoute(router, config, security); importRulesRoute(router, config, ml); exportRulesRoute(router, config); @@ -76,10 +86,16 @@ export const initRoutes = ( exportTimelinesRoute(router, config, security); getDraftTimelinesRoute(router, config, security); getTimelineRoute(router, config, security); + getTimelinesRoute(router, config, security); cleanDraftTimelinesRoute(router, config, security); + deleteTimelinesRoute(router, config, security); + persistFavoriteRoute(router, config, security); installPrepackedTimelinesRoute(router, config, security); + persistNoteRoute(router, config, security); + persistPinnedEventRoute(router, config, security); + findRulesStatusesRoute(router); // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals diff --git a/x-pack/plugins/security_solution/server/utils/build_query/create_options.test.ts b/x-pack/plugins/security_solution/server/utils/build_query/create_options.test.ts deleted file mode 100644 index 4697f02ad5486..0000000000000 --- a/x-pack/plugins/security_solution/server/utils/build_query/create_options.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { omit } from 'lodash/fp'; - -import { DEFAULT_INDEX_PATTERN } from '../../../common/constants'; -import { Direction } from '../../graphql/types'; -import { RequestOptions } from '../../lib/framework'; - -import { Args, Configuration, createOptions, FieldNodes } from './create_options'; - -describe('createOptions', () => { - let source: Configuration; - let args: Args; - let info: FieldNodes; - beforeEach(() => { - source = { - configuration: { - fields: { - host: 'host-1', - container: 'container-1', - message: ['message-1'], - pod: 'pod-1', - tiebreaker: 'tiebreaker', - timestamp: 'timestamp-1', - }, - }, - }; - args = { - defaultIndex: DEFAULT_INDEX_PATTERN, - pagination: { - limit: 5, - }, - docValueFields: [ - { - field: '@timestamp', - format: 'date_time', - }, - { - field: 'event.end', - format: 'date_time', - }, - ], - timerange: { - from: '2020-07-08T08:00:00.000Z', - to: '2020-07-08T20:00:00.000Z', - interval: '12 hours ago', - }, - sortField: { sortFieldId: 'sort-1', direction: Direction.asc }, - }; - info = { - fieldNodes: [ - { - name: { - kind: 'Name', - value: 'value-1', - }, - kind: 'Field', - }, - ], - }; - }); - - test('should create options given all input including sort field', () => { - const options = createOptions(source, args, info); - const expected: RequestOptions = { - defaultIndex: DEFAULT_INDEX_PATTERN, - sourceConfiguration: { - fields: { - host: 'host-1', - container: 'container-1', - message: ['message-1'], - pod: 'pod-1', - tiebreaker: 'tiebreaker', - timestamp: 'timestamp-1', - }, - }, - sortField: { sortFieldId: 'sort-1', direction: Direction.asc }, - pagination: { - limit: 5, - }, - filterQuery: {}, - docValueFields: [ - { - field: '@timestamp', - format: 'date_time', - }, - { - field: 'event.end', - format: 'date_time', - }, - ], - fields: [], - timerange: { - from: '2020-07-08T08:00:00.000Z', - to: '2020-07-08T20:00:00.000Z', - interval: '12 hours ago', - }, - }; - expect(options).toEqual(expected); - }); - - test('should create options given all input except sorting', () => { - const argsWithoutSort: Args = omit('sortField', args); - const options = createOptions(source, argsWithoutSort, info); - const expected: RequestOptions = { - defaultIndex: DEFAULT_INDEX_PATTERN, - sourceConfiguration: { - fields: { - host: 'host-1', - container: 'container-1', - message: ['message-1'], - pod: 'pod-1', - tiebreaker: 'tiebreaker', - timestamp: 'timestamp-1', - }, - }, - pagination: { - limit: 5, - }, - filterQuery: {}, - docValueFields: [ - { - field: '@timestamp', - format: 'date_time', - }, - { - field: 'event.end', - format: 'date_time', - }, - ], - fields: [], - timerange: { - from: '2020-07-08T08:00:00.000Z', - to: '2020-07-08T20:00:00.000Z', - interval: '12 hours ago', - }, - }; - expect(options).toEqual(expected); - }); - - test('should create options given all input except docValueFields', () => { - const argsWithoutSort: Args = omit('docValueFields', args); - const options = createOptions(source, argsWithoutSort, info); - const expected: RequestOptions = { - defaultIndex: DEFAULT_INDEX_PATTERN, - sourceConfiguration: { - fields: { - host: 'host-1', - container: 'container-1', - message: ['message-1'], - pod: 'pod-1', - tiebreaker: 'tiebreaker', - timestamp: 'timestamp-1', - }, - }, - sortField: { sortFieldId: 'sort-1', direction: Direction.asc }, - pagination: { - limit: 5, - }, - filterQuery: {}, - docValueFields: [], - fields: [], - timerange: { - from: '2020-07-08T08:00:00.000Z', - to: '2020-07-08T20:00:00.000Z', - interval: '12 hours ago', - }, - }; - expect(options).toEqual(expected); - }); -}); diff --git a/x-pack/plugins/security_solution/server/utils/build_query/create_options.ts b/x-pack/plugins/security_solution/server/utils/build_query/create_options.ts deleted file mode 100644 index a882b20f59f47..0000000000000 --- a/x-pack/plugins/security_solution/server/utils/build_query/create_options.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { GraphQLResolveInfo } from 'graphql'; -import { getOr } from 'lodash/fp'; - -import { - PaginationInput, - PaginationInputPaginated, - SortField, - Source, - TimerangeInput, - DocValueFieldsInput, -} from '../../graphql/types'; -import { RequestOptions, RequestOptionsPaginated } from '../../lib/framework'; -import { parseFilterQuery } from '../serialized_query'; - -import { getFields } from '.'; - -export type Configuration = Pick; - -export type FieldNodes = Pick; - -// TODO: Once all the widgets are using sortField, this will be swapped out -// for a generic type Similar to EventsSourceArgs that all GraphQL is using -// and sortField won't be optional and might support multi-sort -export interface Args { - timerange?: TimerangeInput | null; - pagination?: PaginationInput | null; - filterQuery?: string | null; - sortField?: SortField | null; - defaultIndex: string[]; - docValueFields?: DocValueFieldsInput[]; -} -export interface ArgsPaginated { - timerange?: TimerangeInput | null; - pagination?: PaginationInputPaginated | null; - filterQuery?: string | null; - sortField?: SortField | null; - defaultIndex: string[]; - docValueFields?: DocValueFieldsInput[]; -} - -export const createOptions = ( - source: Configuration, - args: Args, - info: FieldNodes, - fieldReplacement: string = 'edges.node.' -): RequestOptions => { - const fields = getFields(getOr([], 'fieldNodes[0]', info)); - return { - defaultIndex: args.defaultIndex, - docValueFields: args.docValueFields ?? [], - sourceConfiguration: source.configuration, - timerange: args.timerange!, - pagination: args.pagination!, - sortField: args.sortField!, - filterQuery: parseFilterQuery(args.filterQuery || ''), - fields: fields - .filter((field) => !field.includes('__typename')) - .map((field) => field.replace(fieldReplacement, '')), - }; -}; - -export const createOptionsPaginated = ( - source: Configuration, - args: ArgsPaginated, - info: FieldNodes, - fieldReplacement: string = 'edges.node.' -): RequestOptionsPaginated => { - const fields = getFields(getOr([], 'fieldNodes[0]', info)); - return { - defaultIndex: args.defaultIndex, - docValueFields: args.docValueFields ?? [], - sourceConfiguration: source.configuration, - timerange: args.timerange!, - pagination: args.pagination!, - sortField: args.sortField!, - filterQuery: parseFilterQuery(args.filterQuery || ''), - fields: fields - .filter((field) => !field.includes('__typename')) - .map((field) => field.replace(fieldReplacement, '')), - }; -}; diff --git a/x-pack/plugins/security_solution/server/utils/serialized_query.ts b/x-pack/plugins/security_solution/server/utils/serialized_query.ts index d323e4a8ed8f5..fb5009eefa318 100644 --- a/x-pack/plugins/security_solution/server/utils/serialized_query.ts +++ b/x-pack/plugins/security_solution/server/utils/serialized_query.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { UserInputError } from 'apollo-server-errors'; import { isEmpty, isPlainObject, isString } from 'lodash/fp'; import { JsonObject } from '../../../../../src/plugins/kibana_utils/common'; @@ -25,9 +24,8 @@ export const parseFilterQuery = (filterQuery: string): JsonObject => { } return {}; } catch (err) { - throw new UserInputError(`Failed to parse query: ${err}`, { - query: filterQuery, - originalError: err, - }); + throw new Error( + `Failed to parse query: ${JSON.stringify(err)}, query: ${JSON.stringify(filterQuery)}` + ); } }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 496452f68aa34..ac2e95c47fc27 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -18341,8 +18341,6 @@ "xpack.securitySolution.containers.detectionEngine.createPrePackagedTimelineSuccesDescription": "Elasticから事前にパッケージ化されているタイムラインテンプレートをインストールしました", "xpack.securitySolution.containers.detectionEngine.rulesAndTimelines": "ルールとタイムラインを取得できませんでした", "xpack.securitySolution.containers.detectionEngine.tagFetchFailDescription": "タグを取得できませんでした", - "xpack.securitySolution.containers.errors.dataFetchFailureTitle": "データの取得に失敗", - "xpack.securitySolution.containers.errors.networkFailureTitle": "ネットワーク障害", "xpack.securitySolution.containers.errors.stopJobFailureTitle": "ジョブ停止エラー", "xpack.securitySolution.customizeEventRenderers.customizeEventRenderersDescription": "イベントレンダラーは、イベントで最も関連性が高い詳細情報を自動的に表示し、ストーリーを明らかにします", "xpack.securitySolution.customizeEventRenderers.customizeEventRenderersTitle": "イベントレンダラーのカスタマイズ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index d2fe57c6b5add..b7645db3b8435 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -18604,8 +18604,6 @@ "xpack.securitySolution.containers.detectionEngine.createPrePackagedTimelineSuccesDescription": "安装 Elastic 预先打包的时间线模板", "xpack.securitySolution.containers.detectionEngine.rulesAndTimelines": "无法提取规则和时间线", "xpack.securitySolution.containers.detectionEngine.tagFetchFailDescription": "无法提取标签", - "xpack.securitySolution.containers.errors.dataFetchFailureTitle": "数据提取失败", - "xpack.securitySolution.containers.errors.networkFailureTitle": "网络故障", "xpack.securitySolution.containers.errors.stopJobFailureTitle": "停止作业失败", "xpack.securitySolution.customizeEventRenderers.customizeEventRenderersDescription": "事件呈现器自动在事件中传送最相关的详情,以揭示其故事", "xpack.securitySolution.customizeEventRenderers.customizeEventRenderersTitle": "定制事件呈现器", diff --git a/x-pack/test/api_integration/apis/security_solution/feature_controls.ts b/x-pack/test/api_integration/apis/security_solution/feature_controls.ts deleted file mode 100644 index da28e28dae769..0000000000000 --- a/x-pack/test/api_integration/apis/security_solution/feature_controls.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import expect from '@kbn/expect'; -import gql from 'graphql-tag'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -const introspectionQuery = gql` - query Schema { - __schema { - queryType { - name - } - } - } -`; - -export default function ({ getService }: FtrProviderContext) { - const security = getService('security'); - const spaces = getService('spaces'); - const clientFactory = getService('securitySolutionGraphQLClientFactory'); - - const expectGraphQL403 = (result: any) => { - expect(result.response).to.be(undefined); - expect(result.error).not.to.be(undefined); - expect(result.error).to.have.property('networkError'); - expect(result.error.networkError).to.have.property('statusCode', 403); - }; - - const expectGraphQLResponse = (result: any) => { - expect(result.error).to.be(undefined); - expect(result.response).to.have.property('data'); - expect(result.response.data).to.be.an('object'); - }; - - const executeGraphQLQuery = async (username: string, password: string, spaceId?: string) => { - const queryOptions = { - query: introspectionQuery, - }; - - const basePath = spaceId ? `/s/${spaceId}` : ''; - - const client = clientFactory({ username, password, basePath }); - let error; - let response; - try { - response = await client.query(queryOptions); - } catch (err) { - error = err; - } - return { - error, - response, - }; - }; - - // FLAKY: https://github.com/elastic/kibana/issues/97355 - describe.skip('feature controls', () => { - it(`APIs can't be accessed by user with no privileges`, async () => { - const username = 'logstash_read'; - const roleName = 'logstash_read'; - const password = `${username}-password`; - try { - await security.role.create(roleName, {}); - - await security.user.create(username, { - password, - roles: [roleName], - full_name: 'a kibana user', - }); - - const graphQLResult = await executeGraphQLQuery(username, password); - expectGraphQL403(graphQLResult); - } finally { - await security.role.delete(roleName); - await security.user.delete(username); - } - }); - - it('APIs can be accessed user with global "all" privileges', async () => { - const username = 'global_all'; - const roleName = 'global_all'; - const password = `${username}-password`; - try { - await security.role.create(roleName, { - kibana: [ - { - base: ['all'], - spaces: ['*'], - }, - ], - }); - - await security.user.create(username, { - password, - roles: [roleName], - full_name: 'a kibana user', - }); - - const graphQLResult = await executeGraphQLQuery(username, password); - expectGraphQLResponse(graphQLResult); - } finally { - await security.role.delete(roleName); - await security.user.delete(username); - } - }); - - // this could be any role which doesn't have access to the siem feature - it(`APIs can't be accessed by user with dashboard "all" privileges`, async () => { - const username = 'dashboard_all'; - const roleName = 'dashboard_all'; - const password = `${username}-password`; - try { - await security.role.create(roleName, { - kibana: [ - { - feature: { - dashboard: ['all'], - }, - spaces: ['*'], - }, - ], - }); - - await security.user.create(username, { - password, - roles: [roleName], - full_name: 'a kibana user', - }); - - const graphQLResult = await executeGraphQLQuery(username, password); - expectGraphQL403(graphQLResult); - } finally { - await security.role.delete(roleName); - await security.user.delete(username); - } - }); - - describe('spaces', () => { - // the following tests create a user_1 which has siem read access to space_1 and dashboard all access to space_2 - const space1Id = 'space_1'; - const space2Id = 'space_2'; - - const roleName = 'user_1'; - const username = 'user_1'; - const password = 'user_1-password'; - - before(async () => { - await spaces.create({ - id: space1Id, - name: space1Id, - disabledFeatures: [], - }); - await spaces.create({ - id: space2Id, - name: space2Id, - disabledFeatures: [], - }); - await security.role.create(roleName, { - kibana: [ - { - feature: { - siem: ['read'], - }, - spaces: [space1Id], - }, - { - feature: { - dashboard: ['all'], - }, - spaces: [space2Id], - }, - ], - }); - await security.user.create(username, { - password, - roles: [roleName], - }); - }); - - after(async () => { - await spaces.delete(space1Id); - await spaces.delete(space2Id); - await security.role.delete(roleName); - await security.user.delete(username); - }); - - it('user_1 can access APIs in space_1', async () => { - const graphQLResult = await executeGraphQLQuery(username, password, space1Id); - expectGraphQLResponse(graphQLResult); - }); - - it(`user_1 can't access APIs in space_2`, async () => { - const graphQLResult = await executeGraphQLQuery(username, password, space2Id); - expectGraphQL403(graphQLResult); - }); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/security_solution/index.js b/x-pack/test/api_integration/apis/security_solution/index.js index 57fc712549859..18c315a3b8c3d 100644 --- a/x-pack/test/api_integration/apis/security_solution/index.js +++ b/x-pack/test/api_integration/apis/security_solution/index.js @@ -22,11 +22,10 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./saved_objects/pinned_events')); loadTestFile(require.resolve('./saved_objects/timeline')); loadTestFile(require.resolve('./sources')); - // loadTestFile(require.resolve('./timeline')); + loadTestFile(require.resolve('./timeline')); loadTestFile(require.resolve('./timeline_details')); loadTestFile(require.resolve('./uncommon_processes')); loadTestFile(require.resolve('./users')); loadTestFile(require.resolve('./tls')); - loadTestFile(require.resolve('./feature_controls')); }); } diff --git a/x-pack/test/api_integration/apis/security_solution/saved_objects/helpers.ts b/x-pack/test/api_integration/apis/security_solution/saved_objects/helpers.ts new file mode 100644 index 0000000000000..7265a2caf7dd8 --- /dev/null +++ b/x-pack/test/api_integration/apis/security_solution/saved_objects/helpers.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import Supertest from 'supertest'; +import supertestAsPromised from 'supertest-as-promised'; +import uuid from 'uuid'; +import { TimelineType } from '../../../../../plugins/security_solution/common/types/timeline'; + +export const createBasicTimeline = async ( + supertest: Supertest.SuperTest, + titleToSaved: string +) => + await supertest + .post('/api/timeline') + .set('kbn-xsrf', 'true') + .send({ + timelineId: null, + version: null, + timeline: { + title: titleToSaved, + }, + }); + +export const createBasicTimelineTemplate = async ( + supertest: Supertest.SuperTest, + titleToSaved: string +) => + await supertest + .post('/api/timeline') + .set('kbn-xsrf', 'true') + .send({ + timelineId: null, + version: null, + timeline: { + title: titleToSaved, + templateTimelineId: uuid.v4(), + templateTimelineVersion: 1, + timelineType: TimelineType.template, + }, + }); diff --git a/x-pack/test/api_integration/apis/security_solution/saved_objects/notes.ts b/x-pack/test/api_integration/apis/security_solution/saved_objects/notes.ts index c2ec448c5b5c9..0d4f3a4fb9ea9 100644 --- a/x-pack/test/api_integration/apis/security_solution/saved_objects/notes.ts +++ b/x-pack/test/api_integration/apis/security_solution/saved_objects/notes.ts @@ -6,14 +6,12 @@ */ import expect from '@kbn/expect'; -import gql from 'graphql-tag'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { persistTimelineNoteMutation } from '../../../../../plugins/security_solution/public/timelines/containers/notes/persist.gql_query'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const client = getService('securitySolutionGraphQLClient'); + const supertest = getService('supertest'); describe('Note - Saved Objects', () => { beforeEach(() => esArchiver.load('empty_kibana')); @@ -22,16 +20,17 @@ export default function ({ getService }: FtrProviderContext) { describe('create a note', () => { it('should return a timelineId, timelineVersion, noteId and version', async () => { const myNote = 'world test'; - const response = await client.mutate({ - mutation: persistTimelineNoteMutation, - variables: { + const response = await supertest + .patch('/api/note') + .set('kbn-xsrf', 'true') + .send({ noteId: null, version: null, note: { note: myNote, timelineId: null }, - }, - }); + }); + const { note, noteId, timelineId, timelineVersion, version } = - response.data && response.data.persistNote.note; + response.body.data && response.body.data.persistNote.note; expect(note).to.be(myNote); expect(noteId).to.not.be.empty(); @@ -42,62 +41,32 @@ export default function ({ getService }: FtrProviderContext) { it('if noteId exist update note and return existing noteId and new version', async () => { const myNote = 'world test'; - const response = await client.mutate({ - mutation: persistTimelineNoteMutation, - variables: { + const response = await supertest + .patch('/api/note') + .set('kbn-xsrf', 'true') + .send({ noteId: null, version: null, note: { note: myNote, timelineId: null }, - }, - }); + }); - const { noteId, timelineId, version } = response.data && response.data.persistNote.note; + const { noteId, timelineId, version } = + response.body.data && response.body.data.persistNote.note; const myNewNote = 'new world test'; - const responseToTest = await client.mutate({ - mutation: persistTimelineNoteMutation, - variables: { + const responseToTest = await supertest + .patch('/api/note') + .set('kbn-xsrf', 'true') + .send({ noteId, version, note: { note: myNewNote, timelineId }, - }, - }); - - expect(responseToTest.data!.persistNote.note.note).to.be(myNewNote); - expect(responseToTest.data!.persistNote.note.noteId).to.be(noteId); - expect(responseToTest.data!.persistNote.note.version).to.not.be.eql(version); - }); - }); - - describe('Delete a note', () => { - it('one note', async () => { - const myNote = 'world test'; - const response = await client.mutate({ - mutation: persistTimelineNoteMutation, - variables: { - noteId: null, - version: null, - note: { note: myNote, timelineId: null }, - }, - }); + }); - const { noteId } = response.data && response.data.persistNote.note; - - const responseToTest = await client.mutate({ - mutation: deleteNoteMutation, - variables: { - id: [noteId], - }, - }); - - expect(responseToTest.data!.deleteNote).to.be(true); + expect(responseToTest.body.data!.persistNote.note.note).to.be(myNewNote); + expect(responseToTest.body.data!.persistNote.note.noteId).to.be(noteId); + expect(responseToTest.body.data!.persistNote.note.version).to.not.be.eql(version); }); }); }); } - -const deleteNoteMutation = gql` - mutation DeleteNoteMutation($id: [ID!]!) { - deleteNote(id: $id) - } -`; diff --git a/x-pack/test/api_integration/apis/security_solution/saved_objects/pinned_events.ts b/x-pack/test/api_integration/apis/security_solution/saved_objects/pinned_events.ts index 3f5bf9df7f06f..b77c654b038c2 100644 --- a/x-pack/test/api_integration/apis/security_solution/saved_objects/pinned_events.ts +++ b/x-pack/test/api_integration/apis/security_solution/saved_objects/pinned_events.ts @@ -8,11 +8,10 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { persistTimelinePinnedEventMutation } from '../../../../../plugins/security_solution/public/timelines/containers/pinned_event/persist.gql_query'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const client = getService('securitySolutionGraphQLClient'); + const supertest = getService('supertest'); describe('Pinned Events - Saved Objects', () => { beforeEach(() => esArchiver.load('empty_kibana')); @@ -20,15 +19,12 @@ export default function ({ getService }: FtrProviderContext) { describe('Pinned an event', () => { it('return a timelineId, timelineVersion, pinnedEventId and version', async () => { - const response = await client.mutate({ - mutation: persistTimelinePinnedEventMutation, - variables: { - pinnedEventId: null, - eventId: 'bv4QSGsB9v5HJNSH-7fi', - }, + const response = await supertest.patch('/api/pinned_event').set('kbn-xsrf', 'true').send({ + pinnedEventId: null, + eventId: 'bv4QSGsB9v5HJNSH-7fi', }); const { eventId, pinnedEventId, timelineId, timelineVersion, version } = - response.data && response.data.persistPinnedEventOnTimeline; + response.body.data && response.body.data.persistPinnedEventOnTimeline; expect(eventId).to.be('bv4QSGsB9v5HJNSH-7fi'); expect(pinnedEventId).to.not.be.empty(); @@ -40,25 +36,21 @@ export default function ({ getService }: FtrProviderContext) { describe('Unpinned an event', () => { it('return null', async () => { - const response = await client.mutate({ - mutation: persistTimelinePinnedEventMutation, - variables: { - pinnedEventId: null, - eventId: 'bv4QSGsB9v5HJNSH-7fi', - }, + const response = await supertest.patch('/api/pinned_event').set('kbn-xsrf', 'true').send({ + pinnedEventId: null, + eventId: 'bv4QSGsB9v5HJNSH-7fi', }); const { eventId, pinnedEventId } = - response.data && response.data.persistPinnedEventOnTimeline; + response.body.data && response.body.data.persistPinnedEventOnTimeline; - const responseToTest = await client.mutate({ - mutation: persistTimelinePinnedEventMutation, - variables: { + const responseToTest = await supertest + .patch('/api/pinned_event') + .set('kbn-xsrf', 'true') + .send({ pinnedEventId, eventId, - }, - }); - - expect(responseToTest.data!.persistPinnedEventOnTimeline).to.be(null); + }); + expect(responseToTest.body.data!.persistPinnedEventOnTimeline).to.be(null); }); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/saved_objects/timeline.ts b/x-pack/test/api_integration/apis/security_solution/saved_objects/timeline.ts index c5e9cfbf936ed..ed1d4719b9073 100644 --- a/x-pack/test/api_integration/apis/security_solution/saved_objects/timeline.ts +++ b/x-pack/test/api_integration/apis/security_solution/saved_objects/timeline.ts @@ -6,19 +6,18 @@ */ import expect from '@kbn/expect'; -import ApolloClient from 'apollo-client'; - import { FtrProviderContext } from '../../../ftr_provider_context'; -import { deleteTimelineMutation } from '../../../../../plugins/security_solution/public/timelines/containers/delete/persist.gql_query'; -import { persistTimelineFavoriteMutation } from '../../../../../plugins/security_solution/public/timelines/containers/favorite/persist.gql_query'; -import { persistTimelineMutation } from '../../../../../plugins/security_solution/public/timelines/containers/persist.gql_query'; -import { TimelineResult } from '../../../../../plugins/security_solution/public/graphql/types'; -import { TimelineType } from '../../../../../plugins/security_solution/common/types/timeline'; +import { + TimelineResult, + TimelineType, +} from '../../../../../plugins/security_solution/common/types/timeline'; + +import { createBasicTimeline } from './helpers'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const client = getService('securitySolutionGraphQLClient'); + const supertest = getService('supertest'); describe('Timeline - Saved Objects', () => { beforeEach(() => esArchiver.load('empty_kibana')); @@ -27,9 +26,9 @@ export default function ({ getService }: FtrProviderContext) { describe('Persist a timeline', () => { it('Create a timeline just with a title', async () => { const titleToSaved = 'hello title'; - const response = await createBasicTimeline(client, titleToSaved); + const response = await createBasicTimeline(supertest, titleToSaved); const { savedObjectId, title, version } = - response.data && response.data.persistTimeline.timeline; + response.body.data && response.body.data.persistTimeline.timeline; expect(title).to.be(titleToSaved); expect(savedObjectId).to.not.be.empty(); @@ -137,13 +136,11 @@ export default function ({ getService }: FtrProviderContext) { dateRange: { start: '2019-06-10T19:43:20.755Z', end: '2019-06-11T19:43:20.756Z' }, sort: { columnId: '@timestamp', sortDirection: 'desc' }, }; - const response = await client.mutate({ - mutation: persistTimelineMutation, - variables: { - timelineId: null, - version: null, - timeline: timelineObject, - }, + + const response = await supertest.post('/api/timeline').set('kbn-xsrf', 'true').send({ + timelineId: null, + version: null, + timeline: timelineObject, }); const { columns, @@ -156,7 +153,8 @@ export default function ({ getService }: FtrProviderContext) { sort, title, version, - } = response.data && omitTypenameInTimeline(response.data.persistTimeline.timeline); + } = + response.body.data && omitTypenameInTimeline(response.body.data.persistTimeline.timeline); expect(columns.map((col: { id: string }) => col.id)).to.eql( timelineObject.columns.map((col) => col.id) @@ -174,235 +172,245 @@ export default function ({ getService }: FtrProviderContext) { it('Update a timeline with a new title', async () => { const titleToSaved = 'hello title'; - const response = await createBasicTimeline(client, titleToSaved); - const { savedObjectId, version } = response.data && response.data.persistTimeline.timeline; + const response = await createBasicTimeline(supertest, titleToSaved); + const { savedObjectId, version } = + response.body.data && response.body.data.persistTimeline.timeline; const newTitle = 'new title'; - const responseToTest = await client.mutate({ - mutation: persistTimelineMutation, - variables: { + + const responseToTest = await supertest + .patch('/api/timeline') + .set('kbn-xsrf', 'true') + .send({ timelineId: savedObjectId, version, timeline: { title: newTitle, }, - }, - }); - - expect(responseToTest.data!.persistTimeline.timeline.savedObjectId).to.eql(savedObjectId); - expect(responseToTest.data!.persistTimeline.timeline.title).to.be(newTitle); - expect(responseToTest.data!.persistTimeline.timeline.version).to.not.be.eql(version); + }); + expect(responseToTest.body.data!.persistTimeline.timeline.savedObjectId).to.eql( + savedObjectId + ); + expect(responseToTest.body.data!.persistTimeline.timeline.title).to.be(newTitle); + expect(responseToTest.body.data!.persistTimeline.timeline.version).to.not.be.eql(version); }); }); describe('Persist favorite', () => { it('to an existing timeline', async () => { const titleToSaved = 'hello title'; - const response = await createBasicTimeline(client, titleToSaved); - const { savedObjectId, version } = response.data && response.data.persistTimeline.timeline; + const response = await createBasicTimeline(supertest, titleToSaved); - const responseToTest = await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { + const { savedObjectId, version } = + response.body.data && response.body.data.persistTimeline.timeline; + + const responseToTest = await supertest + .patch('/api/timeline/_favorite') + .set('kbn-xsrf', 'true') + .send({ timelineId: savedObjectId, templateTimelineId: null, templateTimelineVersion: null, timelineType: TimelineType.default, - }, - }); - - expect(responseToTest.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.data!.persistFavorite.favorite.length).to.be(1); - expect(responseToTest.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.data!.persistFavorite.templateTimelineId).to.be.eql(null); - expect(responseToTest.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); - expect(responseToTest.data!.persistFavorite.timelineType).to.be.eql(TimelineType.default); + }); + + expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.data!.persistFavorite.favorite.length).to.be(1); + expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); + expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql(null); + expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); + expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( + TimelineType.default + ); }); it('to an existing timeline template', async () => { const titleToSaved = 'hello title'; const templateTimelineIdFromStore = 'f4a90a2d-365c-407b-9fef-c1dcb33a6ab3'; const templateTimelineVersionFromStore = 1; - const response = await createBasicTimeline(client, titleToSaved); - const { savedObjectId, version } = response.data && response.data.persistTimeline.timeline; - - const responseToTest = await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { + const response = await createBasicTimeline(supertest, titleToSaved); + const { savedObjectId, version } = + response.body.data && response.body.data.persistTimeline.timeline; + + const responseToTest = await supertest + .patch('/api/timeline/_favorite') + .set('kbn-xsrf', 'true') + .send({ timelineId: savedObjectId, templateTimelineId: templateTimelineIdFromStore, templateTimelineVersion: templateTimelineVersionFromStore, timelineType: TimelineType.template, - }, - }); - - expect(responseToTest.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.data!.persistFavorite.favorite.length).to.be(1); - expect(responseToTest.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.data!.persistFavorite.templateTimelineId).to.be.eql( + }); + expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.data!.persistFavorite.favorite.length).to.be(1); + expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); + expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql( templateTimelineIdFromStore ); - expect(responseToTest.data!.persistFavorite.templateTimelineVersion).to.be.eql( + expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql( templateTimelineVersionFromStore ); - expect(responseToTest.data!.persistFavorite.timelineType).to.be.eql(TimelineType.template); + expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( + TimelineType.template + ); }); it('to Unfavorite an existing timeline', async () => { const titleToSaved = 'hello title'; - const response = await createBasicTimeline(client, titleToSaved); - const { savedObjectId, version } = response.data && response.data.persistTimeline.timeline; - - await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { - timelineId: savedObjectId, - templateTimelineId: null, - templateTimelineVersion: null, - timelineType: TimelineType.default, - }, + const response = await createBasicTimeline(supertest, titleToSaved); + const { savedObjectId, version } = + response.body.data && response.body.data.persistTimeline.timeline; + + await supertest.patch('/api/timeline/_favorite').set('kbn-xsrf', 'true').send({ + timelineId: savedObjectId, + templateTimelineId: null, + templateTimelineVersion: null, + timelineType: TimelineType.default, }); - const responseToTest = await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { + const responseToTest = await supertest + .patch('/api/timeline/_favorite') + .set('kbn-xsrf', 'true') + .send({ timelineId: savedObjectId, templateTimelineId: null, templateTimelineVersion: null, timelineType: TimelineType.default, - }, - }); - - expect(responseToTest.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.data!.persistFavorite.favorite).to.be.empty(); - expect(responseToTest.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.data!.persistFavorite.templateTimelineId).to.be.eql(null); - expect(responseToTest.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); - expect(responseToTest.data!.persistFavorite.timelineType).to.be.eql(TimelineType.default); + }); + + expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.data!.persistFavorite.favorite).to.be.empty(); + expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); + expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql(null); + expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); + expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( + TimelineType.default + ); }); it('to Unfavorite an existing timeline template', async () => { const titleToSaved = 'hello title'; const templateTimelineIdFromStore = 'f4a90a2d-365c-407b-9fef-c1dcb33a6ab3'; const templateTimelineVersionFromStore = 1; - const response = await createBasicTimeline(client, titleToSaved); - const { savedObjectId, version } = response.data && response.data.persistTimeline.timeline; - - await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { - timelineId: savedObjectId, - templateTimelineId: templateTimelineIdFromStore, - templateTimelineVersion: templateTimelineVersionFromStore, - timelineType: TimelineType.template, - }, + const response = await createBasicTimeline(supertest, titleToSaved); + const { savedObjectId, version } = + response.body.data && response.body.data.persistTimeline.timeline; + + await supertest.patch('/api/timeline/_favorite').set('kbn-xsrf', 'true').send({ + timelineId: savedObjectId, + templateTimelineId: templateTimelineIdFromStore, + templateTimelineVersion: templateTimelineVersionFromStore, + timelineType: TimelineType.template, }); - const responseToTest = await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { + const responseToTest = await supertest + .patch('/api/timeline/_favorite') + .set('kbn-xsrf', 'true') + .send({ timelineId: savedObjectId, templateTimelineId: templateTimelineIdFromStore, templateTimelineVersion: templateTimelineVersionFromStore, timelineType: TimelineType.template, - }, - }); + }); - expect(responseToTest.data!.persistFavorite.savedObjectId).to.be(savedObjectId); - expect(responseToTest.data!.persistFavorite.favorite).to.be.empty(); - expect(responseToTest.data!.persistFavorite.version).to.not.be.eql(version); - expect(responseToTest.data!.persistFavorite.templateTimelineId).to.be.eql( + expect(responseToTest.body.data!.persistFavorite.savedObjectId).to.be(savedObjectId); + expect(responseToTest.body.data!.persistFavorite.favorite).to.be.empty(); + expect(responseToTest.body.data!.persistFavorite.version).to.not.be.eql(version); + expect(responseToTest.body.data!.persistFavorite.templateTimelineId).to.be.eql( templateTimelineIdFromStore ); - expect(responseToTest.data!.persistFavorite.templateTimelineVersion).to.be.eql( + expect(responseToTest.body.data!.persistFavorite.templateTimelineVersion).to.be.eql( templateTimelineVersionFromStore ); - expect(responseToTest.data!.persistFavorite.timelineType).to.be.eql(TimelineType.template); + expect(responseToTest.body.data!.persistFavorite.timelineType).to.be.eql( + TimelineType.template + ); }); it('to a timeline without a timelineId', async () => { - const response = await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { + const response = await supertest + .patch('/api/timeline/_favorite') + .set('kbn-xsrf', 'true') + .send({ timelineId: null, templateTimelineId: null, templateTimelineVersion: null, timelineType: TimelineType.default, - }, - }); - - expect(response.data!.persistFavorite.savedObjectId).to.not.be.empty(); - expect(response.data!.persistFavorite.favorite.length).to.be(1); - expect(response.data!.persistFavorite.version).to.not.be.empty(); - expect(response.data!.persistFavorite.templateTimelineId).to.be.eql(null); - expect(response.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); - expect(response.data!.persistFavorite.timelineType).to.be.eql(TimelineType.default); + }); + + expect(response.body.data!.persistFavorite.savedObjectId).to.not.be.empty(); + expect(response.body.data!.persistFavorite.favorite.length).to.be(1); + expect(response.body.data!.persistFavorite.version).to.not.be.empty(); + expect(response.body.data!.persistFavorite.templateTimelineId).to.be.eql(null); + expect(response.body.data!.persistFavorite.templateTimelineVersion).to.be.eql(null); + expect(response.body.data!.persistFavorite.timelineType).to.be.eql(TimelineType.default); }); it('to a timeline template without a timelineId', async () => { const templateTimelineIdFromStore = 'f4a90a2d-365c-407b-9fef-c1dcb33a6ab3'; const templateTimelineVersionFromStore = 1; - const response = await client.mutate({ - mutation: persistTimelineFavoriteMutation, - variables: { + + const response = await supertest + .patch('/api/timeline/_favorite') + .set('kbn-xsrf', 'true') + .send({ timelineId: null, templateTimelineId: templateTimelineIdFromStore, templateTimelineVersion: templateTimelineVersionFromStore, timelineType: TimelineType.template, - }, - }); + }); - expect(response.data!.persistFavorite.savedObjectId).to.not.be.empty(); - expect(response.data!.persistFavorite.favorite.length).to.be(1); - expect(response.data!.persistFavorite.version).to.not.be.empty(); - expect(response.data!.persistFavorite.templateTimelineId).to.be.eql( + expect(response.body.data!.persistFavorite.savedObjectId).to.not.be.empty(); + expect(response.body.data!.persistFavorite.favorite.length).to.be(1); + expect(response.body.data!.persistFavorite.version).to.not.be.empty(); + expect(response.body.data!.persistFavorite.templateTimelineId).to.be.eql( templateTimelineIdFromStore ); - expect(response.data!.persistFavorite.templateTimelineVersion).to.be.eql( + expect(response.body.data!.persistFavorite.templateTimelineVersion).to.be.eql( templateTimelineVersionFromStore ); - expect(response.data!.persistFavorite.timelineType).to.be.eql(TimelineType.template); + expect(response.body.data!.persistFavorite.timelineType).to.be.eql(TimelineType.template); }); }); describe('Delete', () => { it('one timeline', async () => { const titleToSaved = 'hello title'; - const response = await createBasicTimeline(client, titleToSaved); - const { savedObjectId } = response.data && response.data.persistTimeline.timeline; + const response = await createBasicTimeline(supertest, titleToSaved); + const { savedObjectId } = response.body.data && response.body.data.persistTimeline.timeline; - const responseToTest = await client.mutate({ - mutation: deleteTimelineMutation, - variables: { - id: [savedObjectId], - }, - }); + const responseToTest = await supertest + .delete('/api/timeline') + .set('kbn-xsrf', 'true') + .send({ + savedObjectIds: [savedObjectId], + }); - expect(responseToTest.data!.deleteTimeline).to.be(true); + expect(responseToTest.body.data!.deleteTimeline).to.be(true); }); - it('multiple timeline', async () => { + it('multiple timelines', async () => { const titleToSaved = 'hello title'; - const response1 = await createBasicTimeline(client, titleToSaved); + const response1 = await createBasicTimeline(supertest, titleToSaved); const savedObjectId1 = - response1.data && response1.data.persistTimeline.timeline - ? response1.data.persistTimeline.timeline.savedObjectId + response1.body.data && response1.body.data.persistTimeline.timeline + ? response1.body.data.persistTimeline.timeline.savedObjectId : ''; - const response2 = await createBasicTimeline(client, titleToSaved); + const response2 = await createBasicTimeline(supertest, titleToSaved); const savedObjectId2 = - response2.data && response2.data.persistTimeline.timeline - ? response2.data.persistTimeline.timeline.savedObjectId + response2.body.data && response2.body.data.persistTimeline.timeline + ? response2.body.data.persistTimeline.timeline.savedObjectId : ''; - const responseToTest = await client.mutate({ - mutation: deleteTimelineMutation, - variables: { - id: [savedObjectId1, savedObjectId2], - }, - }); + const responseToTest = await supertest + .delete('/api/timeline') + .set('kbn-xsrf', 'true') + .send({ + savedObjectIds: [savedObjectId1, savedObjectId2], + }); - expect(responseToTest.data!.deleteTimeline).to.be(true); + expect(responseToTest.body.data!.deleteTimeline).to.be(true); }); }); }); @@ -413,15 +421,3 @@ const omitTypename = (key: string, value: keyof TimelineResult) => const omitTypenameInTimeline = (timeline: TimelineResult) => JSON.parse(JSON.stringify(timeline), omitTypename); - -const createBasicTimeline = async (client: ApolloClient, titleToSaved: string) => - await client.mutate({ - mutation: persistTimelineMutation, - variables: { - timelineId: null, - version: null, - timeline: { - title: titleToSaved, - }, - }, - }); diff --git a/x-pack/test/api_integration/apis/security_solution/timeline.ts b/x-pack/test/api_integration/apis/security_solution/timeline.ts index 11de9dbff324c..10e082cf44004 100644 --- a/x-pack/test/api_integration/apis/security_solution/timeline.ts +++ b/x-pack/test/api_integration/apis/security_solution/timeline.ts @@ -6,135 +6,54 @@ */ import expect from '@kbn/expect'; +import { + SavedTimeline, + TimelineType, +} from '../../../../plugins/security_solution/common/types/timeline'; -import { Direction } from '../../../../plugins/security_solution/common/search_strategy'; -// @ts-expect-error -import { timelineQuery } from '../../../../plugins/security_solution/public/timelines/containers/index.gql_query'; -// @ts-expect-error -import { GetTimelineQuery } from '../../../../plugins/security_solution/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; +import { createBasicTimeline, createBasicTimelineTemplate } from './saved_objects/helpers'; -const TO = '3000-01-01T00:00:00.000Z'; -const FROM = '2000-01-01T00:00:00.000Z'; +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); -// typical values that have to change after an update from "scripts/es_archiver" -const DATA_COUNT = 2; -const HOST_NAME = 'suricata-sensor-amsterdam'; -const TOTAL_COUNT = 96; -const EDGE_LENGTH = 2; -const CURSOR_ID = '1550608949681'; + describe('Timeline', () => { + it('Make sure that we get Timeline data', async () => { + const titleToSaved = 'hello timeline'; + await createBasicTimeline(supertest, titleToSaved); -const FILTER_VALUE = { - bool: { - filter: [ - { - bool: { - should: [{ match_phrase: { 'host.name': HOST_NAME } }], - minimum_should_match: 1, - }, - }, - { - bool: { - filter: [ - { - bool: { - should: [{ range: { '@timestamp': { gte: FROM } } }], - minimum_should_match: 1, - }, - }, - { - bool: { - should: [{ range: { '@timestamp': { lte: TO } } }], - minimum_should_match: 1, - }, - }, - ], - }, - }, - ], - }, -}; + const resp = await supertest.get('/api/timelines').set('kbn-xsrf', 'true'); -export default function ({ getService }: FtrProviderContext) { - const esArchiver = getService('esArchiver'); - const client = getService('securitySolutionGraphQLClient'); + const timelines = resp.body.timeline; - describe('Timeline', () => { - before(() => esArchiver.load('auditbeat/hosts')); - after(() => esArchiver.unload('auditbeat/hosts')); + expect(timelines.length).to.greaterThan(0); + }); + + it('Make sure that pagination is working in Timeline query', async () => { + const titleToSaved = 'hello timeline'; + await createBasicTimeline(supertest, titleToSaved); - it('Make sure that we get Timeline data', () => { - return client - .query({ - query: timelineQuery, - variables: { - sourceId: 'default', - filterQuery: JSON.stringify(FILTER_VALUE), - pagination: { - limit: 2, - cursor: null, - tiebreaker: null, - }, - sortField: { - sortFieldId: 'timestamp', - direction: Direction.desc, - }, - fieldRequested: ['@timestamp', 'host.name'], - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - timerange: { - from: FROM, - to: TO, - interval: '12h', - }, - wait_for_completion_timeout: '10s', - }, - }) - .then((resp) => { - const timeline = resp.data.source.Timeline; - expect(timeline.edges.length).to.be(EDGE_LENGTH); - expect(timeline.edges[0].node.data.length).to.be(DATA_COUNT); - expect(timeline.totalCount).to.be(TOTAL_COUNT); - expect(timeline.pageInfo.endCursor!.value).to.equal(CURSOR_ID); - }); + const resp = await supertest + .get('/api/timelines?page_size=1&page_index=1') + .set('kbn-xsrf', 'true'); + + const timelines = resp.body.timeline; + + expect(timelines.length).to.equal(1); }); - it('Make sure that pagination is working in Timeline query', () => { - return client - .query({ - query: timelineQuery, - variables: { - sourceId: 'default', - filterQuery: JSON.stringify(FILTER_VALUE), - pagination: { - limit: 2, - cursor: CURSOR_ID, - tiebreaker: '191', - }, - sortField: { - sortFieldId: 'timestamp', - direction: Direction.desc, - }, - fieldRequested: ['@timestamp', 'host.name'], - defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], - docValueFields: [], - inspect: false, - timerange: { - from: FROM, - to: TO, - interval: '12h', - }, - wait_for_completion_timeout: '10s', - }, - }) - .then((resp) => { - const timeline = resp.data.source.Timeline; - expect(timeline.edges.length).to.be(EDGE_LENGTH); - expect(timeline.totalCount).to.be(TOTAL_COUNT); - expect(timeline.edges[0].node.data.length).to.be(DATA_COUNT); - expect(timeline.edges[0]!.node.ecs.host!.name).to.eql([HOST_NAME]); - }); + it('Make sure that we get Timeline template data', async () => { + const titleToSaved = 'hello timeline template'; + await createBasicTimelineTemplate(supertest, titleToSaved); + + const resp = await supertest + .get('/api/timelines?timeline_type=template') + .set('kbn-xsrf', 'true'); + + const templates: SavedTimeline[] = resp.body.timeline; + + expect(templates.length).to.greaterThan(0); + expect(templates.filter((t) => t.timelineType === TimelineType.default).length).to.equal(0); }); }); } diff --git a/x-pack/test/api_integration/services/index.ts b/x-pack/test/api_integration/services/index.ts index 39215d3da673a..bf5eaf9618414 100644 --- a/x-pack/test/api_integration/services/index.ts +++ b/x-pack/test/api_integration/services/index.ts @@ -16,10 +16,7 @@ import { EsSupertestWithoutAuthProvider } from './es_supertest_without_auth'; import { SupertestWithoutAuthProvider } from './supertest_without_auth'; import { UsageAPIProvider } from './usage_api'; -import { - SecuritySolutionGraphQLClientProvider, - SecuritySolutionGraphQLClientFactoryProvider, -} from './security_solution_graphql_client'; + import { InfraOpsSourceConfigurationProvider } from './infraops_source_configuration'; import { InfraLogSourceConfigurationProvider } from './infra_log_source_configuration'; import { MachineLearningProvider } from './ml'; @@ -36,8 +33,6 @@ export const services = { esSupertestWithoutAuth: EsSupertestWithoutAuthProvider, infraOpsSourceConfiguration: InfraOpsSourceConfigurationProvider, infraLogSourceConfiguration: InfraLogSourceConfigurationProvider, - securitySolutionGraphQLClient: SecuritySolutionGraphQLClientProvider, - securitySolutionGraphQLClientFactory: SecuritySolutionGraphQLClientFactoryProvider, supertestWithoutAuth: SupertestWithoutAuthProvider, usageAPI: UsageAPIProvider, ml: MachineLearningProvider, diff --git a/x-pack/test/api_integration/services/security_solution_graphql_client.ts b/x-pack/test/api_integration/services/security_solution_graphql_client.ts deleted file mode 100644 index 35514804f56cf..0000000000000 --- a/x-pack/test/api_integration/services/security_solution_graphql_client.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { format as formatUrl } from 'url'; -import fetch from 'node-fetch'; -import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; -import { ApolloClient } from 'apollo-client'; -import { HttpLink } from 'apollo-link-http'; - -import { FtrProviderContext } from '../ftr_provider_context'; -import introspectionQueryResultData from '../../../plugins/security_solution/public/graphql/introspection.json'; - -interface SecuritySolutionGraphQLClientFactoryOptions { - username?: string; - password?: string; - basePath?: string; -} - -export function SecuritySolutionGraphQLClientProvider(context: FtrProviderContext) { - return SecuritySolutionGraphQLClientFactoryProvider(context)(); -} - -export function SecuritySolutionGraphQLClientFactoryProvider({ getService }: FtrProviderContext) { - const config = getService('config'); - const superAuth: string = config.get('servers.elasticsearch.auth'); - const [superUsername, superPassword] = superAuth.split(':'); - - return function (options?: SecuritySolutionGraphQLClientFactoryOptions) { - const { username = superUsername, password = superPassword, basePath = null } = options || {}; - - const kbnURLWithoutAuth = formatUrl({ ...config.get('servers.kibana'), auth: false }); - - const httpLink = new HttpLink({ - credentials: 'same-origin', - fetch: fetch as any, - headers: { - 'kbn-xsrf': 'xxx', - authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`, - }, - uri: `${kbnURLWithoutAuth}${basePath || ''}/api/solutions/security/graphql`, - }); - - return new ApolloClient({ - cache: new InMemoryCache({ - fragmentMatcher: new IntrospectionFragmentMatcher({ - // @ts-expect-error apollo-cache-inmemory types don't match actual introspection data - introspectionQueryResultData, - }), - }), - link: httpLink, - }); - }; -} diff --git a/yarn.lock b/yarn.lock index 528d7f682ac74..bdc6f78f1e860 100644 --- a/yarn.lock +++ b/yarn.lock @@ -326,7 +326,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.12.7", "@babel/parser@^7.13.0", "@babel/parser@^7.2.0", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.12.10", "@babel/parser@^7.12.11", "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.12.7", "@babel/parser@^7.13.0", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0": version "7.13.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99" integrity sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw== @@ -1163,7 +1163,7 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.12", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.12", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== @@ -1178,7 +1178,7 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.13", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.12", "@babel/types@^7.12.13", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.13.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== @@ -4536,16 +4536,6 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A== -"@types/async@2.0.49": - version "2.0.49" - resolved "https://registry.yarnpkg.com/@types/async/-/async-2.0.49.tgz#92e33d13f74c895cb9a7f38ba97db8431ed14bc0" - integrity sha512-Benr3i5odUkvpFkOpzGqrltGdbSs+EVCkEBGXbuR7uT0VzhXKIkhem6PDzHdx5EonA+rfbB3QvP6aDOw5+zp5Q== - -"@types/babel-types@*": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8" - integrity sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw== - "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": version "7.1.10" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.10.tgz#ca58fc195dd9734e77e57c6f2df565623636ab40" @@ -4590,13 +4580,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/babylon@6.16.5": - version "6.16.5" - resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4" - integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w== - dependencies: - "@types/babel-types" "*" - "@types/base64-js@^1.2.5": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5" @@ -5052,11 +5035,6 @@ resolved "https://registry.yarnpkg.com/@types/is-function/-/is-function-1.0.0.tgz#1b0b819b1636c7baf0d6785d030d12edf70c3e83" integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w== -"@types/is-glob@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/is-glob/-/is-glob-4.0.0.tgz#fb8a2bff539025d4dcd6d5efe7689e03341b876d" - integrity sha512-zC/2EmD8scdsGIeE+Xg7kP7oi9VP90zgMQtm9Cr25av4V+a+k8slQyiT60qSw8KORYrOKlPXfHwoa1bQbRzskQ== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -5398,7 +5376,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@12.12.50", "@types/node@14.14.14", "@types/node@8.10.54", "@types/node@>= 8", "@types/node@>=8.9.0", "@types/node@^10.1.0", "@types/node@^12.0.2": +"@types/node@*", "@types/node@12.12.50", "@types/node@14.14.14", "@types/node@8.10.54", "@types/node@>= 8", "@types/node@>=8.9.0", "@types/node@^10.1.0": version "14.14.14" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae" integrity sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ== @@ -5505,11 +5483,6 @@ dependencies: "@types/node" "*" -"@types/prettier@1.16.1": - version "1.16.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.16.1.tgz#328d1c9b54402e44119398bcb6a31b7bbd606d59" - integrity sha512-db6pZL5QY3JrlCHBhYQzYDci0xnoDuxfseUuguLRr3JNk+bnCfpkK6p8quiUDyO8A0vbpBKkk59Fw125etrNeA== - "@types/prettier@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" @@ -5954,11 +5927,6 @@ dependencies: "@types/node" "*" -"@types/valid-url@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/valid-url/-/valid-url-1.0.2.tgz#60fa435ce24bfd5ba107b8d2a80796aeaf3a8f45" - integrity sha1-YPpDXOJL/VuhB7jSqAeWrq86j0U= - "@types/vfile-message@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/vfile-message/-/vfile-message-2.0.0.tgz#690e46af0fdfc1f9faae00cd049cc888957927d5" @@ -6349,21 +6317,6 @@ resolved "https://registry.yarnpkg.com/@wildpeaks/snapshot-dom/-/snapshot-dom-1.6.0.tgz#83297612bf93b97983beafbe6ae71672642ac884" integrity sha512-fCM5tYK6VZ1nhbk3Q11lkf6UOJlOCRU0oScQ8NV8OYBPC58wQmQaOF9g+rk+yhNYf3beybOBr+ZuiNen3B0Bxw== -"@wry/context@^0.4.0": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.1.tgz#b3e23ca036035cbad0bd9711269352dd03a6fe3c" - integrity sha512-ZpIrDGek+IU9wkID/TYSgcYeLXsSM2VkbfAxO4NjWBGeM/OrA9KyNmy8msYlAEKPmKxi3mIbXg3jcb3f6pqnaQ== - dependencies: - "@types/node" "^12.0.2" - tslib "^1.9.3" - -"@wry/equality@^0.1.2": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.9.tgz#b13e18b7a8053c6858aa6c85b54911fb31e3a909" - integrity sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ== - dependencies: - tslib "^1.9.3" - "@xobotyi/scrollbar-width@1.9.5": version "1.9.5" resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" @@ -6531,14 +6484,6 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -aggregate-error@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-2.1.0.tgz#051a9a733ad2e95ab503d84fb81989e6419b8f09" - integrity sha512-rIZJqC4XACGWwmPpi18IhDjIzXTJ93KQwYHXuyMCa0Ak9mtzLIbykuei+0i5EnGDy6ts8JVnSyRnZc2cVIMvVg== - dependencies: - clean-stack "^2.0.0" - indent-string "^3.0.0" - aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -6729,7 +6674,7 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.0.0, ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -6909,201 +6854,6 @@ apidoc@^0.25.0: nodemon "^2.0.4" winston "^3.3.3" -apollo-cache-control@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.1.tgz#173d14ceb3eb9e7cb53de7eb8b61bee6159d4171" - integrity sha512-XJQs167e9u+e5ybSi51nGYr70NPBbswdvTEHtbtXbwkZ+n9t0SLPvUcoqceayOSwjK1XYOdU/EKPawNdb3rLQA== - dependencies: - graphql-extensions "^0.0.x" - -apollo-cache-inmemory@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.2.tgz#bbf2e4e1eacdf82b2d526f5c2f3b37e5acee3c5e" - integrity sha512-AyCl3PGFv5Qv1w4N9vlg63GBPHXgMCekZy5mhlS042ji0GW84uTySX+r3F61ZX3+KM1vA4m9hQyctrEGiv5XjQ== - dependencies: - apollo-cache "^1.3.2" - apollo-utilities "^1.3.2" - optimism "^0.9.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - -apollo-cache@^1.1.14: - version "1.1.14" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.14.tgz#c7d54cdbc7f544161f78fa5e4bae56650e22f7ad" - integrity sha512-Zmo9nVqpWFogki2QyulX6Xx6KYXMyYWX74grwgsYYUOukl4pIAdtYyK8e874o0QDgzSOq5AYPXjtfkoVpqhCRw== - dependencies: - apollo-utilities "^1.0.18" - -apollo-cache@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.2.tgz#df4dce56240d6c95c613510d7e409f7214e6d26a" - integrity sha512-+KA685AV5ETEJfjZuviRTEImGA11uNBp/MJGnaCvkgr+BYRrGLruVKBv6WvyFod27WEB2sp7SsG8cNBKANhGLg== - dependencies: - apollo-utilities "^1.3.2" - tslib "^1.9.3" - -apollo-client@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.3.8.tgz#0384a7210eb601ab88b1c13750da076fc9255b95" - integrity sha512-X5wsBD1be1P/mScGsH5H+2hIE8d78WAfqOvFvBpP+C+jzJ9387uHLyFmYYMLRRqDQ3ihjI4iSID7KEOW2gyCcQ== - dependencies: - "@types/zen-observable" "^0.8.0" - apollo-cache "^1.1.14" - apollo-link "^1.0.0" - apollo-link-dedup "^1.0.0" - apollo-utilities "^1.0.18" - symbol-observable "^1.0.2" - zen-observable "^0.8.0" - optionalDependencies: - "@types/async" "2.0.49" - -apollo-link-dedup@^1.0.0: - version "1.0.9" - resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.9.tgz#3c4e4af88ef027cbddfdb857c043fd0574051dad" - integrity sha512-RbuEKpmSHVMtoREMPh2wUFTeh65q+0XPVeqgaOP/rGEAfvLyOMvX0vT2nVaejMohoMxuUnfZwpldXaDFWnlVbg== - dependencies: - apollo-link "^1.2.2" - -apollo-link-error@^1.1.7: - version "1.1.10" - resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.10.tgz#ce57f0793f0923b598655de5bf5e028d4cf4fba6" - integrity sha512-itG5UV7mQqaalmRkuRsF0cUS4zW2ja8XCbxkMZnIEeN24X3yoJi5hpJeAaEkXf0KgYNsR0+rmtCQNruWyxDnZQ== - dependencies: - apollo-link "^1.2.11" - apollo-link-http-common "^0.2.13" - tslib "^1.9.3" - -apollo-link-http-common@^0.2.13: - version "0.2.13" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.13.tgz#c688f6baaffdc7b269b2db7ae89dae7c58b5b350" - integrity sha512-Uyg1ECQpTTA691Fwx5e6Rc/6CPSu4TB4pQRTGIpwZ4l5JDOQ+812Wvi/e3IInmzOZpwx5YrrOfXrtN8BrsDXoA== - dependencies: - apollo-link "^1.2.11" - ts-invariant "^0.3.2" - tslib "^1.9.3" - -apollo-link-http-common@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz#304e67705122bf69a9abaded4351b10bc5efd6d9" - integrity sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg== - dependencies: - apollo-link "^1.2.13" - ts-invariant "^0.4.0" - tslib "^1.9.3" - -apollo-link-http@^1.5.16: - version "1.5.16" - resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.16.tgz#44fe760bcc2803b8a7f57fc9269173afb00f3814" - integrity sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw== - dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" - tslib "^1.9.3" - -apollo-link-schema@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/apollo-link-schema/-/apollo-link-schema-1.1.0.tgz#033fda26ffdbfc809d04892de554867f50e2af8e" - integrity sha512-sqWjse5RfrMAhrXecv0WdSLLdF1R5lI4YpbfkioIeJAkB7VB2o+mgA/+onATYKp214MSjloCDWzkvnVpRPFoBw== - dependencies: - apollo-link "^1.2.2" - -apollo-link-state@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.1.tgz#65e9e0e12c67936b8c4b12b8438434f393104579" - integrity sha512-69/til4ENfl/Fvf7br2xSsLSBcxcXPbOHVNkzLLejvUZickl93HLO4/fO+uvoBi4dCYRgN17Zr8FwI41ueRx0g== - dependencies: - apollo-utilities "^1.0.8" - graphql-anywhere "^4.1.0-alpha.0" - -apollo-link@^1.0.0, apollo-link@^1.2.2, apollo-link@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.3.tgz#9bd8d5fe1d88d31dc91dae9ecc22474d451fb70d" - integrity sha512-iL9yS2OfxYhigme5bpTbmRyC+Htt6tyo2fRMHT3K1XRL/C5IQDDz37OjpPy4ndx7WInSvfSZaaOTKFja9VWqSw== - dependencies: - apollo-utilities "^1.0.0" - zen-observable-ts "^0.8.10" - -apollo-link@^1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.11.tgz#493293b747ad3237114ccd22e9f559e5e24a194d" - integrity sha512-PQvRCg13VduLy3X/0L79M6uOpTh5iHdxnxYuo8yL7sJlWybKRJwsv4IcRBJpMFbChOOaHY7Og9wgPo6DLKDKDA== - dependencies: - apollo-utilities "^1.2.1" - ts-invariant "^0.3.2" - tslib "^1.9.3" - zen-observable-ts "^0.8.18" - -apollo-link@^1.2.13: - version "1.2.13" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.13.tgz#dff00fbf19dfcd90fddbc14b6a3f9a771acac6c4" - integrity sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw== - dependencies: - apollo-utilities "^1.3.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - zen-observable-ts "^0.8.20" - -apollo-server-core@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.3.6.tgz#08636243c2de56fa8c267d68dd602cb1fbd323e3" - integrity sha1-CGNiQ8LeVvqMJn1o3WAssfvTI+M= - dependencies: - apollo-cache-control "^0.1.0" - apollo-tracing "^0.1.0" - graphql-extensions "^0.0.x" - -apollo-server-errors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.0.2.tgz#e9cbb1b74d2cd78aed23cd886ca2d0c186323b2b" - integrity sha512-zyWDqAVDCkj9espVsoUpZr9PwDznM8UW6fBfhV+i1br//s2AQb07N6ektZ9pRIEvkhykDZW+8tQbDwAO0vUROg== - -apollo-server-hapi@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/apollo-server-hapi/-/apollo-server-hapi-1.3.6.tgz#44dea128b64c1c10fdd35ac8307896a57ba1f4a8" - integrity sha1-RN6hKLZMHBD901rIMHiWpXuh9Kg= - dependencies: - apollo-server-core "^1.3.6" - apollo-server-module-graphiql "^1.3.4" - boom "^7.1.0" - -apollo-server-module-graphiql@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.3.4.tgz#50399b7c51b7267d0c841529f5173e5fc7304de4" - integrity sha1-UDmbfFG3Jn0MhBUp9Rc+X8cwTeQ= - -apollo-tracing@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.1.4.tgz#5b8ae1b01526b160ee6e552a7f131923a9aedcc7" - integrity sha512-Uv+1nh5AsNmC3m130i2u3IqbS+nrxyVV3KYimH5QKsdPjxxIQB3JAT+jJmpeDxBel8gDVstNmCh82QSLxLSIdQ== - dependencies: - graphql-extensions "~0.0.9" - -apollo-utilities@^1.0.0, apollo-utilities@^1.0.1, apollo-utilities@^1.0.18, apollo-utilities@^1.0.8: - version "1.0.18" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.18.tgz#e4ee91534283fde2b744a26caaea120fe6a94f67" - integrity sha512-hHrmsoMYzzzfUlTOPpxr0qRpTLotMkBIQ93Ub7ki2SWdLfYYKrp6/KB8YOUkbCwXxSFvYSV24ccuwUEqZIaHIA== - dependencies: - fast-json-stable-stringify "^2.0.0" - -apollo-utilities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.2.1.tgz#1c3a1ebf5607d7c8efe7636daaf58e7463b41b3c" - integrity sha512-Zv8Udp9XTSFiN8oyXOjf6PMHepD4yxxReLsl6dPUy5Ths7jti3nmlBzZUOxuTWRwZn0MoclqL7RQ5UEJN8MAxg== - dependencies: - fast-json-stable-stringify "^2.0.0" - ts-invariant "^0.2.1" - tslib "^1.9.3" - -apollo-utilities@^1.3.0, apollo-utilities@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.2.tgz#8cbdcf8b012f664cd6cb5767f6130f5aed9115c9" - integrity sha512-JWNHj8XChz7S4OZghV6yc9FNnzEXj285QYp/nLNh943iObycI5GTDO3NGR9Dth12LRrSFMeDOConPfPln+WGfg== - dependencies: - "@wry/equality" "^0.1.2" - fast-json-stable-stringify "^2.0.0" - ts-invariant "^0.4.0" - tslib "^1.9.3" - app-root-dir@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/app-root-dir/-/app-root-dir-1.0.2.tgz#38187ec2dea7577fff033ffcb12172692ff6e118" @@ -7568,7 +7318,7 @@ async@^1.4.2, async@~1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.1.4, async@^2.6.1, async@^2.6.2: +async@^2.1.4, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -8168,15 +7918,6 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@7.0.0-beta.3: - version "7.0.0-beta.3" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-7.0.0-beta.3.tgz#cd927ca70e0ae8ab05f4aab83778cfb3e6eb20b4" - integrity sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w== - dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" - babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" @@ -8192,11 +7933,6 @@ babelify@10.0.0: resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== -babylon@7.0.0-beta.47: - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" - integrity sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ== - babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -8436,7 +8172,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boom@7.x.x, boom@^7.1.0: +boom@7.x.x: version "7.2.2" resolved "https://registry.yarnpkg.com/boom/-/boom-7.2.2.tgz#ac92101451aa5cea901aed07d881dd32b4f08345" integrity sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A== @@ -9108,7 +8844,7 @@ callsites@^3.1.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@3.0.x, camel-case@^3.0.0: +camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= @@ -9316,30 +9052,6 @@ chance@1.0.18: resolved "https://registry.yarnpkg.com/chance/-/chance-1.0.18.tgz#79788fe6fca4c338bf404321c347eecc80f969ee" integrity sha512-g9YLQVHVZS/3F+zIicfB58vjcxopvYQRp7xHzvyDFDhXH1aRZI/JhwSAO0X5qYiQluoGnaNAU6wByD2KTxJN1A== -change-case@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.1.0.tgz#0e611b7edc9952df2e8513b27b42de72647dd17e" - integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== - dependencies: - camel-case "^3.0.0" - constant-case "^2.0.0" - dot-case "^2.1.0" - header-case "^1.0.0" - is-lower-case "^1.1.0" - is-upper-case "^1.1.0" - lower-case "^1.1.1" - lower-case-first "^1.0.0" - no-case "^2.3.2" - param-case "^2.1.0" - pascal-case "^2.0.0" - path-case "^2.1.0" - sentence-case "^2.1.0" - snake-case "^2.1.0" - swap-case "^1.1.0" - title-case "^2.1.0" - upper-case "^1.1.1" - upper-case-first "^1.1.0" - change-emitter@^0.1.2: version "0.1.6" resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" @@ -9429,7 +9141,7 @@ cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@2.1.2, chokidar@3.4.3, chokidar@^2.0.0, chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.2, chokidar@^2.1.8, chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.3: +chokidar@3.4.3, chokidar@^2.0.0, chokidar@^2.0.4, chokidar@^2.1.1, chokidar@^2.1.2, chokidar@^2.1.8, chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== @@ -9629,11 +9341,6 @@ cli-ux@^4.9.0: treeify "^1.1.0" tslib "^1.9.3" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -9898,11 +9605,6 @@ colorette@^1.2.0, colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== -colornames@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/colornames/-/colornames-1.1.1.tgz#f8889030685c7c4ff9e2a559f5077eb76a816f96" - integrity sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= - colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -9968,11 +9670,6 @@ commander@2.17.x, commander@~2.17.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - commander@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" @@ -9993,7 +9690,7 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -common-tags@1.8.0, common-tags@^1.8.0: +common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== @@ -10169,14 +9866,6 @@ console-log-level@^1.4.1: resolved "https://registry.yarnpkg.com/console-log-level/-/console-log-level-1.4.1.tgz#9c5a6bb9ef1ef65b05aba83028b0ff894cdf630a" integrity sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ== -constant-case@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" - integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= - dependencies: - snake-case "^2.1.0" - upper-case "^1.1.1" - constants-browserify@^1.0.0, constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -10323,7 +10012,7 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.3, core-js@^2.6.9: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== @@ -10513,14 +10202,6 @@ cross-env@^6.0.3: dependencies: cross-spawn "^7.0.0" -cross-fetch@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" - integrity sha1-pH/09/xxLauo9qaVoRyUhEDUVyM= - dependencies: - node-fetch "2.1.2" - whatwg-fetch "2.0.4" - cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -11768,11 +11449,6 @@ dependency-check@^4.1.0: read-package-json "^2.0.10" resolve "^1.1.7" -deprecated-decorator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" - integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= - deprecation@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-1.0.1.tgz#2df79b79005752180816b7b6e079cbd80490d711" @@ -11818,11 +11494,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-indent@5.0.0, detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -11830,6 +11501,11 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= + detect-newline@2.X: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -11898,15 +11574,6 @@ diacritics@^1.3.0: resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1" integrity sha1-PvqHMj67hj5mls67AILUj/PW96E= -diagnostics@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.1.tgz#cab6ac33df70c9d9a727490ae43ac995a769b22a" - integrity sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== - dependencies: - colorspace "1.1.x" - enabled "1.0.x" - kuler "1.0.x" - diff-match-patch@^1.0.0, diff-match-patch@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" @@ -12121,13 +11788,6 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" -dot-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" - integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= - dependencies: - no-case "^2.2.0" - dot-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" @@ -12478,13 +12138,6 @@ emotion@^9.1.2: babel-plugin-emotion "^9.2.11" create-emotion "^9.2.12" -enabled@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-1.0.2.tgz#965f6513d2c2d1c5f4652b64a2e3396467fc2f93" - integrity sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= - dependencies: - env-variable "0.0.x" - enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" @@ -12544,11 +12197,6 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== -env-variable@0.0.x: - version "0.0.5" - resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.5.tgz#913dd830bef11e96a039c038d4130604eba37f88" - integrity sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA== - enzyme-adapter-react-16@^1.15.2: version "1.15.2" resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz#b16db2f0ea424d58a808f9df86ab6212895a4501" @@ -13722,7 +13370,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.9: +fbjs@^0.8.1, fbjs@^0.8.9: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -14721,18 +14369,6 @@ glob-watcher@5.0.3, glob-watcher@^5.0.3: just-debounce "^1.0.0" object.defaults "^1.1.0" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" @@ -15048,219 +14684,11 @@ graphlib@^2.1.8: dependencies: lodash "^4.17.15" -graphql-anywhere@^4.1.0-alpha.0: - version "4.1.16" - resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.16.tgz#82bb59643e30183cfb7b485ed4262a7b39d8a6c1" - integrity sha512-DNQGxrh2p8w4vQwHIW1Sw65ZDbOr6ktQCeol6itH3LeWy1a3IoZ67jxrhgrHM+Upg8oiazvteSr64VRxJ8n5+g== - dependencies: - apollo-utilities "^1.0.18" - -graphql-code-generator@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-code-generator/-/graphql-code-generator-0.18.2.tgz#080d91f8b44d26d7c69069118ac9f775f3fd5971" - integrity sha512-9ifA5T6hM6qo3RVQz7oYld1R6XYyglT/TanYDoweVEX+6iLxgi0rvGFjFcQ45bPDgLyVkQ9LEsEJuL1YxFmrDw== - dependencies: - "@types/babylon" "6.16.5" - "@types/is-glob" "4.0.0" - "@types/prettier" "1.16.1" - "@types/valid-url" "1.0.2" - babel-types "7.0.0-beta.3" - babylon "7.0.0-beta.47" - chalk "2.4.2" - change-case "3.1.0" - chokidar "2.1.2" - commander "2.19.0" - common-tags "1.8.0" - detect-indent "5.0.0" - glob "7.1.3" - graphql-codegen-core "0.18.2" - graphql-config "2.2.1" - graphql-import "0.7.1" - graphql-tag-pluck "0.6.0" - graphql-toolkit "0.2.0" - graphql-tools "4.0.4" - indent-string "3.2.0" - inquirer "6.2.2" - is-glob "4.0.0" - is-valid-path "0.1.1" - js-yaml "3.13.1" - json-to-pretty-yaml "1.2.2" - listr "0.14.3" - listr-update-renderer "0.5.0" - log-symbols "2.2.0" - log-update "2.3.0" - mkdirp "0.5.1" - prettier "1.16.4" - request "2.88.0" - valid-url "1.0.9" - -graphql-codegen-add@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-add/-/graphql-codegen-add-0.18.2.tgz#27625f6b6bcfe29076b5f8b02496425eeb360b46" - integrity sha512-X8i3WEjfI2YYS6giE3BZ0LlOlTnae2btuyjU1TAN7Cec+dOI5XzRz25cPRi6D1Y0++j2h480e60tgXwMORW9pA== - dependencies: - graphql-codegen-core "0.18.2" - -graphql-codegen-core@0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-core/-/graphql-codegen-core-0.18.2.tgz#205b25d2bdb20a35b986495b60d219a8d02ef266" - integrity sha512-fjfIUrDx0KDdr/jYjUs51+07DvcEc5w9tdid/bNezNzT2iJLtmnnmYLR62an3/PKUnKSOAIKLYxFIBOzsFJH9A== - dependencies: - chalk "2.4.2" - change-case "3.1.0" - common-tags "1.8.0" - graphql-tag "2.10.1" - graphql-toolkit "0.2.0" - graphql-tools "4.0.4" - ts-log "2.1.4" - winston "3.2.1" - -graphql-codegen-introspection@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-introspection/-/graphql-codegen-introspection-0.18.2.tgz#1e749e342aebe219271dcf4c5c56357ad300921a" - integrity sha512-L71rDI9gFQdcGNHsOnlW8nOtUXsZCFnXvC+faEwNse4P/OGrRm4jLQU/6/EUk92okFCbLytKWNcq1uxD8fiY1Q== - -graphql-codegen-plugin-helpers@0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-plugin-helpers/-/graphql-codegen-plugin-helpers-0.18.2.tgz#ce03d02ced0bc28ef2f61e0a5205d85ee7e9ccdb" - integrity sha512-WZahfp95RdePwwPWxnxAHgfkXXEQXNrgX9sGrB//uGfj8lygcf7m/rNZQ4iooUzoqBEkTtJpi7bezWCieNcq2A== - dependencies: - graphql-codegen-core "0.18.2" - import-from "2.1.0" - -graphql-codegen-typescript-client@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-typescript-client/-/graphql-codegen-typescript-client-0.18.2.tgz#5478f8af83fac8063362fe2905dac20fe02d5548" - integrity sha512-HffKYPrT5jGIRTiWCTst/X3EBpuOHsheI5tKUEf9NfrR8ySWs6PfqZO5fKCFWZOqC9xn7Y75jFXaeH8tgV5y1g== - dependencies: - graphql-codegen-core "0.18.2" - graphql-codegen-plugin-helpers "0.18.2" - graphql-codegen-typescript-common "0.18.2" - -graphql-codegen-typescript-common@0.18.2, graphql-codegen-typescript-common@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-typescript-common/-/graphql-codegen-typescript-common-0.18.2.tgz#1ccbb3bfa1aeb8664127f881db27c658636465da" - integrity sha512-uGGHd/vgwMlnCNOMQkvMxW8Xz0fqPGjPHROsniRNP1ragsa6KfFBrGu9toHgxv8m3MzC6ZPeoUa3wtwtS9oVnA== - dependencies: - change-case "3.1.0" - common-tags "1.8.0" - graphql-codegen-core "0.18.2" - graphql-codegen-plugin-helpers "0.18.2" - -graphql-codegen-typescript-resolvers@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-typescript-resolvers/-/graphql-codegen-typescript-resolvers-0.18.2.tgz#fa44b2668285184d2976116c2982c17bc6866a23" - integrity sha512-BlS286ap2hsOjx2a7H6WKcwxfQtjRay9d+P/0u4t6zUkjpFSpHWWYgymVopfckrjHCo/8g+THPFCmUgFg34vKQ== - dependencies: - graphql-codegen-plugin-helpers "0.18.2" - graphql-codegen-typescript-common "0.18.2" - -graphql-codegen-typescript-server@^0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/graphql-codegen-typescript-server/-/graphql-codegen-typescript-server-0.18.2.tgz#2e11607512bdf77b152c554afc18f5210c1785ba" - integrity sha512-1marSv3TCry6IsQd+Hdarq/AhDpgJ3Yg+e9Or3Urv7Fkw4YbhtyGp6AkpBK+DMKlyKFPjpLnmjAaHS3hjrCp3Q== - dependencies: - graphql-codegen-typescript-common "0.18.2" - -graphql-config@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.2.1.tgz#5fd0ec77ac7428ca5fb2026cf131be10151a0cb2" - integrity sha512-U8+1IAhw9m6WkZRRcyj8ZarK96R6lQBQ0an4lp76Ps9FyhOXENC5YQOxOFGm5CxPrX2rD0g3Je4zG5xdNJjwzQ== - dependencies: - graphql-import "^0.7.1" - graphql-request "^1.5.0" - js-yaml "^3.10.0" - lodash "^4.17.4" - minimatch "^3.0.4" - -graphql-extensions@^0.0.x, graphql-extensions@~0.0.9: - version "0.0.10" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.10.tgz#34bdb2546d43f6a5bc89ab23c295ec0466c6843d" - integrity sha512-TnQueqUDCYzOSrpQb3q1ngDSP2otJSF+9yNLrQGPzkMsvnQ+v6e2d5tl+B35D4y+XpmvVnAn4T3ZK28mkILveA== - dependencies: - core-js "^2.5.3" - source-map-support "^0.5.1" - -graphql-fields@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/graphql-fields/-/graphql-fields-1.2.1.tgz#3777112af0bd6f55cc3c7b8f6d7748ab7a1b23bb" - integrity sha512-ufg/dxb78IjQUblNfiaEMkZWD1CwcZjdK0nTEW0dBQyNArxKZI7N+zohZdIdqVJcihPWJod1yymx4NM+1bZjTw== - -graphql-import@0.7.1, graphql-import@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.7.1.tgz#4add8d91a5f752d764b0a4a7a461fcd93136f223" - integrity sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw== - dependencies: - lodash "^4.17.4" - resolve-from "^4.0.0" - -graphql-request@^1.5.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" - integrity sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg== - dependencies: - cross-fetch "2.2.2" - -graphql-tag-pluck@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/graphql-tag-pluck/-/graphql-tag-pluck-0.6.0.tgz#d03ab981cd8d31e564d37f8b9bac94a523dc29dd" - integrity sha512-C1SRw5zZtl7CN7mv6Q0abFVSJwG8M+FniFCPqWD+AjQMj9igNPthraMUQ02KSo+j19khR60mksqmFN3BwboFaw== - dependencies: - "@babel/parser" "^7.2.0" - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.2.0" - source-map-support "^0.5.9" - typescript "^3.2.2" - -graphql-tag@2.10.1: - version "2.10.1" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" - integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== - graphql-tag@^2.10.3: version "2.10.3" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== -graphql-toolkit@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/graphql-toolkit/-/graphql-toolkit-0.2.0.tgz#91364b69911d51bc915269a37963f4ea2d5f335c" - integrity sha512-dMwb+V2u6vwJF70tWuqSxgNal9fK1xcB8JtmCJUStVUh+PjfNrlKH1X5e17vJlN+lRPz1hatr8jH+Q6lTW0jLw== - dependencies: - aggregate-error "2.1.0" - deepmerge "3.2.0" - glob "7.1.3" - graphql-import "0.7.1" - graphql-tag-pluck "0.6.0" - is-glob "4.0.0" - is-valid-path "0.1.1" - lodash "4.17.11" - request "2.88.0" - tslib "^1.9.3" - valid-url "1.0.9" - -graphql-tools@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.4.tgz#ca08a63454221fdde825fe45fbd315eb2a6d566b" - integrity sha512-chF12etTIGVVGy3fCTJ1ivJX2KB7OSG4c6UOJQuqOHCmBQwTyNgCDuejZKvpYxNZiEx7bwIjrodDgDe9RIkjlw== - dependencies: - apollo-link "^1.2.3" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" - -graphql-tools@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-3.1.1.tgz#d593358f01e7c8b1671a17b70ddb034dea9dbc50" - integrity sha512-yHvPkweUB0+Q/GWH5wIG60bpt8CTwBklCSzQdEHmRUgAdEQKxw+9B7zB3dG7wB3Ym7M7lfrS4Ej+jtDZfA2UXg== - dependencies: - apollo-link "^1.2.2" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" - graphql@^0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" @@ -15752,14 +15180,6 @@ he@1.2.0, he@1.2.x, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -header-case@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" - integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.3" - heap@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" @@ -15821,7 +15241,7 @@ hoek@6.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.0.3.tgz#7884360426d927865a0a1251fc9c59313af5b798" integrity sha512-TU6RyZ/XaQCTWRLrdqZZtZqwxUVr6PDMfi6MlWNURZ7A6czanQqX4pFE1mdOUQR9FdPCsZ0UzL8jI/izZ+eBSQ== -hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0, hoist-non-react-statics@^2.5.5, hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.5, hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -16275,7 +15695,7 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@2.1.0, import-from@^2.1.0: +import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" integrity sha1-M1238qev/VOqpHHUuAId7ja387E= @@ -16318,11 +15738,6 @@ in-publish@^2.0.0: resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= -indent-string@3.2.0, indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -16330,6 +15745,11 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -16405,25 +15825,6 @@ inline-style@^2.0.0: dependencies: dashify "^0.1.0" -inquirer@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.11" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.0.0" - through "^2.3.6" - inquirer@^7.0.0, inquirer@^7.3.3: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -16828,13 +16229,6 @@ is-generator@^1.0.2: resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM= -is-glob@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= - dependencies: - is-extglob "^2.1.1" - is-glob@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -16881,20 +16275,6 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-invalid-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" - integrity sha1-MHqFWzzxqTi0TqcNLGEQYFNxTzQ= - dependencies: - is-glob "^2.0.0" - -is-lower-case@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" - integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= - dependencies: - lower-case "^1.1.0" - is-map@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" @@ -17142,13 +16522,6 @@ is-unc-path@^1.0.0: dependencies: unc-path-regex "^0.1.2" -is-upper-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" - integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= - dependencies: - upper-case "^1.1.0" - is-url@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" @@ -17164,13 +16537,6 @@ is-valid-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= -is-valid-path@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df" - integrity sha1-EQ+f90w39mPh7HkV60UfLbk6yd8= - dependencies: - is-invalid-path "^0.1.0" - is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -17383,10 +16749,10 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.1.3, iterall@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" - integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== +iterall@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== iterate-iterator@^1.0.1: version "1.0.1" @@ -18109,7 +17475,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@^3.10.0, js-yaml@^3.13.1, js-yaml@^3.9.0, js-yaml@~3.13.1: +js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^3.9.0, js-yaml@~3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -18268,14 +17634,6 @@ json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0. resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json-to-pretty-yaml@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" - integrity sha1-9M0L0KXo/h3yWq9boRiwmf2ZLVs= - dependencies: - remedial "^1.0.7" - remove-trailing-spaces "^1.0.6" - json2module@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/json2module/-/json2module-0.0.3.tgz#00fb5f4a9b7adfc3f0647c29cb17bcd1979be9b2" @@ -18531,13 +17889,6 @@ knuth-shuffle-seeded@^1.0.6: dependencies: seed-random "~2.2.0" -kuler@1.0.x: - version "1.0.1" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" - integrity sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== - dependencies: - colornames "^1.1.1" - kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" @@ -18753,7 +18104,7 @@ listr-silent-renderer@^1.1.1: resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= -listr-update-renderer@0.5.0, listr-update-renderer@^0.5.0: +listr-update-renderer@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== @@ -18777,7 +18128,7 @@ listr-verbose-renderer@^0.5.0: date-fns "^1.27.2" figures "^2.0.0" -listr@0.14.3, listr@^0.14.1, listr@^0.14.3: +listr@^0.14.1, listr@^0.14.3: version "0.14.3" resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== @@ -19178,7 +18529,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.0, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.19, lodash@~4.17.20: +lodash@4.17.15, lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.19, lodash@~4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -19191,13 +18542,6 @@ log-ok@^0.1.1: ansi-green "^0.1.1" success-symbol "^0.1.0" -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - log-symbols@4.0.0, log-symbols@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" @@ -19219,7 +18563,7 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -log-update@2.3.0, log-update@^2.3.0: +log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= @@ -19228,7 +18572,7 @@ log-update@2.3.0, log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -logform@^2.1.1, logform@^2.2.0: +logform@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== @@ -19286,14 +18630,7 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lower-case-first@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" - integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= - dependencies: - lower-case "^1.1.2" - -lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: +lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= @@ -20383,11 +19720,6 @@ mute-stdout@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -20577,7 +19909,7 @@ nise@^1.5.2: lolex "^5.0.1" path-to-regexp "^1.7.0" -no-case@^2.2.0, no-case@^2.3.2: +no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== @@ -20621,7 +19953,7 @@ node-emoji@^1.10.0: dependencies: lodash.toarray "^4.4.0" -node-fetch@2.1.2, node-fetch@^1.0.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@^1.0.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -21244,11 +20576,6 @@ once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -one-time@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-0.0.4.tgz#f8cdf77884826fe4dff93e3a9cc37b1e4480742e" - integrity sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= - one-time@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" @@ -21307,13 +20634,6 @@ oppsy@^2.0.0: dependencies: hoek "5.x.x" -optimism@^0.9.0: - version "0.9.5" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.9.5.tgz#b8b5dc9150e97b79ddbf2d2c6c0e44de4d255527" - integrity sha512-lNvmuBgONAGrUbj/xpH69FjMOz1d0jvMNoOCKyVynUPzq2jgVlGL4jFYJqrUHzUfBv+jAFSCP61x5UkfbduYJA== - dependencies: - "@wry/context" "^0.4.0" - optional-js@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/optional-js/-/optional-js-2.1.1.tgz#c2dc519ad119648510b4d241dbb60b1167c36a46" @@ -21645,7 +20965,7 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -param-case@2.1.x, param-case@^2.1.0: +param-case@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= @@ -21845,14 +21165,6 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" - integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= - dependencies: - camel-case "^3.0.0" - upper-case-first "^1.1.0" - pascal-case@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" @@ -21879,13 +21191,6 @@ path-browserify@0.0.1, path-browserify@~0.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" - integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= - dependencies: - no-case "^2.2.0" - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -22707,11 +22012,6 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@1.16.4: - version "1.16.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" - integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== - prettier@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.0.tgz#8a03c7777883b29b37fb2c4348c66a78e980418b" @@ -23350,17 +22650,6 @@ react-ace@^7.0.5: lodash.isequal "^4.5.0" prop-types "^15.7.2" -react-apollo@^2.1.4: - version "2.1.8" - resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-2.1.8.tgz#ebac0d9bee0f0906df3ce29207f94df337009887" - integrity sha512-HBz9WDhvaqNxahKvBvW915a9MYSbarJ2Nrwh2pCeDctFiZ/bhixX1xJE/Ea0aU6gU5tGDEl+aWjxzx852FXHoA== - dependencies: - fbjs "^0.8.16" - hoist-non-react-statics "^2.5.0" - invariant "^2.2.2" - lodash "^4.17.10" - prop-types "^15.6.0" - react-beautiful-dnd@^13.0.0: version "13.0.0" resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.0.0.tgz#f70cc8ff82b84bc718f8af157c9f95757a6c3b40" @@ -24697,11 +23986,6 @@ remark@^13.0.0: remark-stringify "^9.0.0" unified "^9.1.0" -remedial@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" - integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== - remove-accents@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" @@ -24729,11 +24013,6 @@ remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= -remove-trailing-spaces@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.7.tgz#491f04e11d98880714d12429b0d0938cbe030ae6" - integrity sha512-wjM17CJ2kk0SgoGyJ7ZMzRRCuTq+V8YhMwpZ5XEWX0uaked2OUq6utvHXGNBQrfkUzUUABFMyxlKn+85hMv4dg== - renderkid@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" @@ -24823,7 +24102,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@2.81.0, request@2.88.0, request@^2.44.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: +request@2.81.0, request@^2.44.0, request@^2.87.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -25181,7 +24460,7 @@ rtl-css-js@^1.9.0: dependencies: "@babel/runtime" "^7.1.2" -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== @@ -25517,14 +24796,6 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -sentence-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" - integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= - dependencies: - no-case "^2.2.0" - upper-case-first "^1.1.2" - serialize-error@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" @@ -25833,13 +25104,6 @@ slide@^1.1.5, slide@~1.1.3: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= - dependencies: - no-case "^2.2.0" - snap-shot-compare@2.8.3: version "2.8.3" resolved "https://registry.yarnpkg.com/snap-shot-compare/-/snap-shot-compare-2.8.3.tgz#b4982fb7b4e9cd4fa0b03a40a100b5f005b2d515" @@ -25975,7 +25239,7 @@ source-map-support@^0.3.2: dependencies: source-map "0.1.32" -source-map-support@^0.5.1, source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.12: +source-map-support@^0.5.16, source-map-support@^0.5.19, source-map-support@^0.5.6, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -26515,7 +25779,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -27039,15 +26303,7 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" -swap-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" - integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= - dependencies: - lower-case "^1.1.1" - upper-case "^1.1.1" - -symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: +symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -27518,7 +26774,7 @@ tinyqueue@^2.0.3: resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== -title-case@^2.1.0, title-case@^2.1.1: +title-case@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= @@ -27810,27 +27066,6 @@ ts-essentials@^2.0.3: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== -ts-invariant@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.2.1.tgz#3d587f9d6e3bded97bf9ec17951dd9814d5a9d3f" - integrity sha512-Z/JSxzVmhTo50I+LKagEISFJW3pvPCqsMWLamCTX8Kr3N5aMrnGOqcflbe5hLUzwjvgPfnLzQtHZv0yWQ+FIHg== - dependencies: - tslib "^1.9.3" - -ts-invariant@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.3.3.tgz#b5742b1885ecf9e29c31a750307480f045ec0b16" - integrity sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ== - dependencies: - tslib "^1.9.3" - -ts-invariant@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.2.tgz#8685131b8083e67c66d602540e78763408be9113" - integrity sha512-PTAAn8lJPEdRBJJEs4ig6MVZWfO12yrFzV7YaPslmyhG7+4MA279y4BXT3f72gXeVl0mC1aAWq2rMX4eKTWU/Q== - dependencies: - tslib "^1.9.3" - ts-loader@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-7.0.5.tgz#789338fb01cb5dc0a33c54e50558b34a73c9c4c5" @@ -27842,11 +27077,6 @@ ts-loader@^7.0.5: micromatch "^4.0.0" semver "^6.0.0" -ts-log@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.1.4.tgz#063c5ad1cbab5d49d258d18015963489fb6fb59a" - integrity sha512-P1EJSoyV+N3bR/IWFeAqXzKPZwHpnLY6j7j58mAvewHRipo+BQM2Y1f9Y9BjEQznKwgqqZm7H8iuixmssU7tYQ== - ts-morph@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-9.1.0.tgz#10d2088387c71f3c674f82492a3cec1e3538f0dd" @@ -28062,7 +27292,7 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@4.1.3, typescript@^3.2.2, typescript@^3.3.3333, typescript@^3.5.3, typescript@~3.7.2, typescript@~4.1.2: +typescript@4.1.3, typescript@^3.3.3333, typescript@^3.5.3, typescript@~3.7.2, typescript@~4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== @@ -28596,14 +27826,7 @@ update-notifier@^4.1.1: semver-diff "^3.1.1" xdg-basedir "^4.0.0" -upper-case-first@^1.1.0, upper-case-first@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" - integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= - dependencies: - upper-case "^1.1.1" - -upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: +upper-case@^1.0.3, upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= @@ -28827,7 +28050,7 @@ uuid@^2.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= -uuid@^3.1.0, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: +uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -28880,11 +28103,6 @@ val-loader@^1.1.1: loader-utils "^1.0.0" schema-utils "^0.4.5" -valid-url@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= - validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -29739,11 +28957,6 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" @@ -29876,7 +29089,7 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" -winston-transport@^4.3.0, winston-transport@^4.4.0: +winston-transport@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== @@ -29884,21 +29097,6 @@ winston-transport@^4.3.0, winston-transport@^4.4.0: readable-stream "^2.3.7" triple-beam "^1.2.0" -winston@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.2.1.tgz#63061377976c73584028be2490a1846055f77f07" - integrity sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== - dependencies: - async "^2.6.1" - diagnostics "^1.1.1" - is-stream "^1.1.0" - logform "^2.1.1" - one-time "0.0.4" - readable-stream "^3.1.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.3.0" - winston@^3.0.0, winston@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" @@ -30360,27 +29558,6 @@ z-schema@~3.18.3: optionalDependencies: commander "^2.7.1" -zen-observable-ts@^0.8.10, zen-observable-ts@^0.8.18: - version "0.8.21" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" - integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - -zen-observable-ts@^0.8.20: - version "0.8.20" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz#44091e335d3fcbc97f6497e63e7f57d5b516b163" - integrity sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA== - dependencies: - tslib "^1.9.3" - zen-observable "^0.8.0" - -zen-observable@^0.8.0: - version "0.8.8" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.8.tgz#1ea93995bf098754a58215a1e0a7309e5749ec42" - integrity sha512-HnhhyNnwTFzS48nihkCZIJGsWGFcYUz+XPDlPK5W84Ifji8SksC6m7sQWOf8zdCGhzQ4tDYuMYGu5B0N1dXTtg== - zip-stream@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a" From 9bfa1050fb852ac77d132d7818dc343ddb3ecfc4 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 19 Apr 2021 21:15:18 -0400 Subject: [PATCH 67/82] [Fleet] Fix condition to show fleet server migration modal (#97570) --- .../server/services/fleet_server/saved_object_migrations.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts b/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts index e9a73783e32fc..82fd937092477 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts @@ -67,8 +67,10 @@ async function migrateAgents() { if (res.total === 0) { hasMore = false; + } else { + hasAgents = true; } - hasAgents = true; + for (const so of res.saved_objects) { try { const { From 1fc1bcdb088acacacc4cc2b83bb4e87d34c0d44d Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Mon, 19 Apr 2021 19:27:17 -0600 Subject: [PATCH 68/82] Skips flaky test Open timeline (#97547) ## Summary See: https://github.com/elastic/kibana/issues/97544 A test failed: ``` Timed out retrying after 60000ms: Expected to find element: `[data-test-subj="title-eb8e97f0-a0ce-11eb-9e0c-db238893b7ff"]`, but never found it. Because this error occurred during a `before all` hook we are skipping the remaining tests in the current suite: `Open timeline` Although you have test retries enabled, we do not retry tests when `before all` or `after all` hooks fail ``` --- .../cypress/integration/timelines/open_timeline.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timelines/open_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timelines/open_timeline.spec.ts index 5d5d125082b8b..320d5979cb070 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timelines/open_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timelines/open_timeline.spec.ts @@ -33,7 +33,8 @@ import { waitForTimelinesPanelToBeLoaded } from '../../tasks/timelines'; import { TIMELINES_URL } from '../../urls/navigation'; -describe('Open timeline', () => { +// FLAKY: https://github.com/elastic/kibana/issues/97544 +describe.skip('Open timeline', () => { let timelineId: string | null = null; before(() => { cleanKibana(); From 042fa1a2cea473aa6051ed9da4cc60204257427c Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 19 Apr 2021 22:09:51 -0500 Subject: [PATCH 69/82] Remove alerting feature flag from advanced settings (#97265) * Remove alerting feature flag from advanced settings Make it so the alerting UI in Observability can only be turned on and off in kibana.yml with `xpack.observability.enableAlertingExperience`. We no longer: * Allow turning this on and off for the current space in the advanced settings in Kibana * Allow turning this on on cloud * Send telemetry on whether or not the flag is enabled Add some docs in READMEs as well. --- .../resources/base/bin/kibana-docker | 2 ++ .../server/collectors/management/schema.ts | 4 ---- .../server/collectors/management/types.ts | 1 - src/plugins/telemetry/schema/oss_plugins.json | 6 ----- x-pack/plugins/observability/README.md | 22 +++++++++++++++++ .../observability/common/ui_settings_keys.ts | 1 - .../public/application/application.test.tsx | 2 ++ .../public/application/index.tsx | 5 +++- .../components/app/section/alerts/index.tsx | 6 ++--- .../components/app/section/apm/index.test.tsx | 1 + .../components/app/section/ux/index.test.tsx | 1 + .../public/context/plugin_context.tsx | 2 ++ .../public/hooks/use_time_range.test.ts | 2 ++ x-pack/plugins/observability/public/index.ts | 6 ++++- .../pages/overview/overview.stories.tsx | 1 + x-pack/plugins/observability/public/plugin.ts | 9 +++++-- .../public/utils/test_helper.tsx | 4 +++- x-pack/plugins/observability/server/index.ts | 6 +++++ .../observability/server/ui_settings.ts | 17 +------------ x-pack/plugins/rule_registry/README.md | 24 ++++++++++++++----- x-pack/plugins/rule_registry/server/index.ts | 4 +++- x-pack/plugins/rule_registry/server/plugin.ts | 2 +- .../test/apm_api_integration/configs/index.ts | 2 +- 23 files changed, 84 insertions(+), 46 deletions(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker index 93e9ba52dce28..c3c8c480f77f2 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker +++ b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker @@ -229,6 +229,7 @@ kibana_vars=( xpack.maps.enabled xpack.maps.showMapVisualizationTypes xpack.ml.enabled + xpack.observability.unsafe.alertingExperience.enabled xpack.reporting.capture.browser.autoDownload xpack.reporting.capture.browser.chromium.disableSandbox xpack.reporting.capture.browser.chromium.inspect @@ -273,6 +274,7 @@ kibana_vars=( xpack.reporting.queue.timeout xpack.reporting.roles.allow xpack.rollup.enabled + xpack.ruleRegistry.unsafe.write.enabled xpack.searchprofiler.enabled xpack.security.audit.enabled xpack.security.audit.appender.type diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 142bcef521c15..dfe31b1da3643 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -432,10 +432,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'text', _meta: { description: 'Non-default value of setting.' }, }, - 'observability:enableAlertingExperience': { - type: 'boolean', - _meta: { description: 'Non-default value of setting.' }, - }, 'labs:presentation:unifiedToolbar': { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index b457adecc1a79..b8bc06d8a6a29 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -32,7 +32,6 @@ export interface UsageStats { 'securitySolution:rulesTableRefresh': string; 'apm:enableSignificantTerms': boolean; 'apm:enableServiceOverview': boolean; - 'observability:enableAlertingExperience': boolean; 'observability:enableInspectEsQueries': boolean; 'visualize:enableLabs': boolean; 'visualization:heatmap:maxBuckets': number; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index af2c7330c6a4d..6099b3efa803e 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -8200,12 +8200,6 @@ "description": "Non-default value of setting." } }, - "observability:enableAlertingExperience": { - "type": "boolean", - "_meta": { - "description": "Non-default value of setting." - } - }, "labs:presentation:unifiedToolbar": { "type": "boolean", "_meta": { diff --git a/x-pack/plugins/observability/README.md b/x-pack/plugins/observability/README.md index 0ef0543c2922e..b882891921cde 100644 --- a/x-pack/plugins/observability/README.md +++ b/x-pack/plugins/observability/README.md @@ -2,6 +2,28 @@ This plugin provides shared components and services for use across observability solutions, as well as the observability landing page UI. +## Rules, Alerts, and Cases + +The Observability plugin contains experimental support for improved alerting and +case management. + +If you have: + +```yaml +xpack.observability.unsafe.alertingExperience.enabled: true +``` + +In your Kibana configuration, the Alerts and Cases pages will be available. + +This will only enable the UI for these pages. In order to have alert data indexed +you'll need to enable writing in the [Rule Registry plugin](../rule_registry/README.md): + +```yaml +xpack.ruleRegistry.unsafe.write.enabled: true +``` + +When both of the these are set to `true`, your alerts should show on the alerts page. + ## Unit testing Note: Run the following commands from `kibana/x-pack/plugins/observability`. diff --git a/x-pack/plugins/observability/common/ui_settings_keys.ts b/x-pack/plugins/observability/common/ui_settings_keys.ts index cb6ea799078a2..bd53647488256 100644 --- a/x-pack/plugins/observability/common/ui_settings_keys.ts +++ b/x-pack/plugins/observability/common/ui_settings_keys.ts @@ -5,5 +5,4 @@ * 2.0. */ -export const enableAlertingExperience = 'observability:enableAlertingExperience'; export const enableInspectEsQueries = 'observability:enableInspectEsQueries'; diff --git a/x-pack/plugins/observability/public/application/application.test.tsx b/x-pack/plugins/observability/public/application/application.test.tsx index 34ee22e89e66b..c0b51652a7d0e 100644 --- a/x-pack/plugins/observability/public/application/application.test.tsx +++ b/x-pack/plugins/observability/public/application/application.test.tsx @@ -45,6 +45,7 @@ describe('renderApp', () => { uiSettings: { get: () => false }, http: { basePath: { prepend: (path: string) => path } }, } as unknown) as CoreStart; + const config = { unsafe: { alertingExperience: { enabled: true } } }; const params = ({ element: window.document.createElement('div'), history: createMemoryHistory(), @@ -53,6 +54,7 @@ describe('renderApp', () => { expect(() => { const unmount = renderApp({ + config, core, plugins, appMountParameters: params, diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx index aa7d1d037d7b7..8607b57b42666 100644 --- a/x-pack/plugins/observability/public/application/index.tsx +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -22,6 +22,7 @@ import { ObservabilityPublicPluginsStart, ObservabilityRuleRegistry } from '../p import { HasDataContextProvider } from '../context/has_data_context'; import { Breadcrumbs, routes } from '../routes'; import { Storage } from '../../../../../src/plugins/kibana_utils/public'; +import { ConfigSchema } from '..'; function getTitleFromBreadCrumbs(breadcrumbs: Breadcrumbs) { return breadcrumbs.map(({ text }) => text).reverse(); @@ -67,11 +68,13 @@ function App() { } export const renderApp = ({ + config, core, plugins, appMountParameters, observabilityRuleRegistry, }: { + config: ConfigSchema; core: CoreStart; plugins: ObservabilityPublicPluginsStart; observabilityRuleRegistry: ObservabilityRuleRegistry; @@ -91,7 +94,7 @@ export const renderApp = ({ ReactDOM.render( diff --git a/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx b/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx index adc6a0208dc42..0adb9ceb6e9f8 100644 --- a/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx +++ b/x-pack/plugins/observability/public/components/app/section/alerts/index.tsx @@ -21,7 +21,6 @@ import React, { useState } from 'react'; import { EuiSelect } from '@elastic/eui'; import { uniqBy } from 'lodash'; import { Alert } from '../../../../../../alerting/common'; -import { enableAlertingExperience } from '../../../../../common/ui_settings_keys'; import { usePluginContext } from '../../../../hooks/use_plugin_context'; import { SectionContainer } from '..'; @@ -38,10 +37,9 @@ interface Props { } export function AlertsSection({ alerts }: Props) { - const { core } = usePluginContext(); + const { config, core } = usePluginContext(); const [filter, setFilter] = useState(ALL_TYPES); - - const href = core.uiSettings.get(enableAlertingExperience) + const href = config.unsafe.alertingExperience.enabled ? '/app/observability/alerts' : '/app/management/insightsAndAlerting/triggersActions/alerts'; diff --git a/x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx b/x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx index 8ff68a0466054..d41f131ef521b 100644 --- a/x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx +++ b/x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx @@ -40,6 +40,7 @@ describe('APMSection', () => { http: { basePath: { prepend: jest.fn() } }, } as unknown) as CoreStart, appMountParameters: {} as AppMountParameters, + config: { unsafe: { alertingExperience: { enabled: true } } }, observabilityRuleRegistry: ({ registerType: jest.fn(), getTypeByRuleId: jest.fn(), diff --git a/x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx b/x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx index 290990a5c05a5..fa4d1a744e3ea 100644 --- a/x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx +++ b/x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx @@ -40,6 +40,7 @@ describe('UXSection', () => { http: { basePath: { prepend: jest.fn() } }, } as unknown) as CoreStart, appMountParameters: {} as AppMountParameters, + config: { unsafe: { alertingExperience: { enabled: true } } }, plugins: ({ data: { query: { diff --git a/x-pack/plugins/observability/public/context/plugin_context.tsx b/x-pack/plugins/observability/public/context/plugin_context.tsx index 7a6daca6e7923..eea259b36d5b9 100644 --- a/x-pack/plugins/observability/public/context/plugin_context.tsx +++ b/x-pack/plugins/observability/public/context/plugin_context.tsx @@ -8,9 +8,11 @@ import { createContext } from 'react'; import { AppMountParameters, CoreStart } from 'kibana/public'; import { ObservabilityPublicPluginsStart, ObservabilityRuleRegistry } from '../plugin'; +import { ConfigSchema } from '..'; export interface PluginContextValue { appMountParameters: AppMountParameters; + config: ConfigSchema; core: CoreStart; plugins: ObservabilityPublicPluginsStart; observabilityRuleRegistry: ObservabilityRuleRegistry; diff --git a/x-pack/plugins/observability/public/hooks/use_time_range.test.ts b/x-pack/plugins/observability/public/hooks/use_time_range.test.ts index 61505d4850dc4..43fbc18062b75 100644 --- a/x-pack/plugins/observability/public/hooks/use_time_range.test.ts +++ b/x-pack/plugins/observability/public/hooks/use_time_range.test.ts @@ -24,6 +24,7 @@ describe('useTimeRange', () => { jest.spyOn(pluginContext, 'usePluginContext').mockImplementation(() => ({ core: {} as CoreStart, appMountParameters: {} as AppMountParameters, + config: { unsafe: { alertingExperience: { enabled: true } } }, plugins: ({ data: { query: { @@ -65,6 +66,7 @@ describe('useTimeRange', () => { jest.spyOn(pluginContext, 'usePluginContext').mockImplementation(() => ({ core: {} as CoreStart, appMountParameters: {} as AppMountParameters, + config: { unsafe: { alertingExperience: { enabled: true } } }, plugins: ({ data: { query: { diff --git a/x-pack/plugins/observability/public/index.ts b/x-pack/plugins/observability/public/index.ts index ee2df9369aa39..b34b1f81467d9 100644 --- a/x-pack/plugins/observability/public/index.ts +++ b/x-pack/plugins/observability/public/index.ts @@ -21,12 +21,16 @@ export type { }; export { enableInspectEsQueries } from '../common/ui_settings_keys'; +export interface ConfigSchema { + unsafe: { alertingExperience: { enabled: boolean } }; +} + export const plugin: PluginInitializer< ObservabilityPublicSetup, ObservabilityPublicStart, ObservabilityPublicPluginsSetup, ObservabilityPublicPluginsStart -> = (context: PluginInitializerContext) => { +> = (context: PluginInitializerContext) => { return new Plugin(context); }; diff --git a/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx b/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx index 6fc573b11109a..68c39a888692b 100644 --- a/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx +++ b/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx @@ -45,6 +45,7 @@ const withCore = makeDecorator({ appMountParameters: ({ setHeaderActionMenu: () => {}, } as unknown) as AppMountParameters, + config: { unsafe: { alertingExperience: { enabled: true } } }, core: options as CoreStart, plugins: ({ data: { diff --git a/x-pack/plugins/observability/public/plugin.ts b/x-pack/plugins/observability/public/plugin.ts index 1f56bdebbbb9b..4f9f69a22a6bf 100644 --- a/x-pack/plugins/observability/public/plugin.ts +++ b/x-pack/plugins/observability/public/plugin.ts @@ -32,6 +32,7 @@ import { registerDataHandler } from './data_handler'; import { FormatterRuleRegistry } from './rules/formatter_rule_registry'; import { createCallObservabilityApi } from './services/call_observability_api'; import { toggleOverviewLinkInNav } from './toggle_overview_link_in_nav'; +import { ConfigSchema } from '.'; export type ObservabilityPublicSetup = ReturnType; export type ObservabilityRuleRegistry = ObservabilityPublicSetup['ruleRegistry']; @@ -60,7 +61,9 @@ export class Plugin > { private readonly appUpdater$ = new BehaviorSubject(() => ({})); - constructor(context: PluginInitializerContext) {} + constructor(private readonly initializerContext: PluginInitializerContext) { + this.initializerContext = initializerContext; + } public setup( coreSetup: CoreSetup, @@ -68,6 +71,7 @@ export class Plugin ) { const category = DEFAULT_APP_CATEGORIES.observability; const euiIconType = 'logoObservability'; + const config = this.initializerContext.config.get(); createCallObservabilityApi(coreSetup.http); @@ -84,6 +88,7 @@ export class Plugin const [coreStart, pluginsStart] = await coreSetup.getStartServices(); return renderApp({ + config, core: coreStart, plugins: pluginsStart, appMountParameters: params, @@ -104,7 +109,7 @@ export class Plugin updater$, }); - if (coreSetup.uiSettings.get('observability:enableAlertingExperience')) { + if (config.unsafe.alertingExperience.enabled) { coreSetup.application.register({ id: 'observability-alerts', title: 'Alerts', diff --git a/x-pack/plugins/observability/public/utils/test_helper.tsx b/x-pack/plugins/observability/public/utils/test_helper.tsx index 97916b414330f..63e34b018aed0 100644 --- a/x-pack/plugins/observability/public/utils/test_helper.tsx +++ b/x-pack/plugins/observability/public/utils/test_helper.tsx @@ -31,6 +31,8 @@ export const core = ({ }, } as unknown) as CoreStart; +const config = { unsafe: { alertingExperience: { enabled: true } } }; + const plugins = ({ data: { query: { timefilter: { timefilter: { setTime: jest.fn() } } } }, } as unknown) as ObservabilityPublicPluginsStart; @@ -42,7 +44,7 @@ export const render = (component: React.ReactNode) => { {component} diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts index 6785436042f97..ec471df164fe1 100644 --- a/x-pack/plugins/observability/server/index.ts +++ b/x-pack/plugins/observability/server/index.ts @@ -16,12 +16,18 @@ export { rangeQuery, kqlQuery } from './utils/queries'; export * from './types'; export const config = { + exposeToBrowser: { + unsafe: { alertingExperience: { enabled: true } }, + }, schema: schema.object({ enabled: schema.boolean({ defaultValue: true }), annotations: schema.object({ enabled: schema.boolean({ defaultValue: true }), index: schema.string({ defaultValue: 'observability-annotations' }), }), + unsafe: schema.object({ + alertingExperience: schema.object({ enabled: schema.boolean({ defaultValue: false }) }), + }), }), }; diff --git a/x-pack/plugins/observability/server/ui_settings.ts b/x-pack/plugins/observability/server/ui_settings.ts index 43041280d0282..46ae106efe6bc 100644 --- a/x-pack/plugins/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability/server/ui_settings.ts @@ -8,27 +8,12 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; import { UiSettingsParams } from '../../../../src/core/types'; -import { enableAlertingExperience, enableInspectEsQueries } from '../common/ui_settings_keys'; +import { enableInspectEsQueries } from '../common/ui_settings_keys'; /** * uiSettings definitions for Observability. */ export const uiSettings: Record> = { - [enableAlertingExperience]: { - category: ['observability'], - name: i18n.translate('xpack.observability.enableAlertingExperienceExperimentName', { - defaultMessage: 'Observability alerting experience', - }), - value: false, - description: i18n.translate( - 'xpack.observability.enableAlertingExperienceExperimentDescription', - { - defaultMessage: - 'Enable the experimental alerting experience for Observability. Adds the Alerts and Cases pages.', - } - ), - schema: schema.boolean(), - }, [enableInspectEsQueries]: { category: ['observability'], name: i18n.translate('xpack.observability.enableInspectEsQueriesExperimentName', { diff --git a/x-pack/plugins/rule_registry/README.md b/x-pack/plugins/rule_registry/README.md index 17fe2b20f74fa..2c8f534a63d6b 100644 --- a/x-pack/plugins/rule_registry/README.md +++ b/x-pack/plugins/rule_registry/README.md @@ -1,3 +1,5 @@ +# Rule Registry + The rule registry plugin aims to make it easy for rule type producers to have their rules produce the data that they need to build rich experiences on top of a unified experience, without the risk of mapping conflicts. A rule registry creates a template, an ILM policy, and an alias. The template mappings can be configured. It also injects a client scoped to these indices. @@ -6,7 +8,17 @@ It also supports inheritance, which means that producers can create a registry s The rule registry plugin creates a root rule registry, with the mappings defined needed to create a unified experience. Rule type producers can use the plugin to access the root rule registry, and create their own registry that branches off of the root rule registry. The rule registry client sees data from its own registry, and all registries that branches off of it. It does not see data from its parents. -Creating a rule registry +## Enabling writing + +Set + +```yaml +xpack.ruleRegistry.unsafe.write.enabled: true +``` + +in your Kibana configuration to allow the Rule Registry to write events to the alert indices. + +## Creating a rule registry To create a rule registry, producers should add the `ruleRegistry` plugin to their dependencies. They can then use the `ruleRegistry.create` method to create a child registry, with the additional mappings that should be used by specifying `fieldMap`: @@ -16,7 +28,7 @@ const observabilityRegistry = plugins.ruleRegistry.create({ fieldMap: { ...pickWithPatterns(ecsFieldMap, 'host.name', 'service.name'), }, -}) +}); ``` `fieldMap` is a key-value map of field names and mapping options: @@ -37,13 +49,13 @@ To pick many fields, you can use `pickWithPatterns`, which supports wildcards wi If a registry is created, it will initialise as soon as the core services needed become available. It will create a (versioned) template, alias, and ILM policy, but only if these do not exist yet. -### Rule registry client +## Rule registry client The rule registry client can either be injected in the executor, or created in the scope of a request. It exposes a `search` method and a `bulkIndex` method. When `search` is called, it first gets all the rules the current user has access to, and adds these ids to the search request that it executes. This means that the user can only see data from rules they have access to. Both `search` and `bulkIndex` are fully typed, in the sense that they reflect the mappings defined for the registry. -### Schema +## Schema The following fields are available in the root rule registry: @@ -60,8 +72,8 @@ The following fields are available in the root rule registry: - `kibana.rac.alert.uuid`: the unique identifier for the alert during its lifespan. If an alert recovers (or closes), this identifier is re-generated when it is opened again. - `kibana.rac.alert.status`: the status of the alert. Can be `open` or `closed`. - `kibana.rac.alert.start`: the ISO timestamp of the time at which the alert started. -- `kibana.rac.alert.end`: the ISO timestamp of the time at which the alert recovered. -- `kibana.rac.alert.duration.us`: the duration of the alert, in microseconds. This is always the difference between either the current time, or the time when the alert recovered. +- `kibana.rac.alert.end`: the ISO timestamp of the time at which the alert recovered. +- `kibana.rac.alert.duration.us`: the duration of the alert, in microseconds. This is always the difference between either the current time, or the time when the alert recovered. - `kibana.rac.alert.severity.level`: the severity of the alert, as a keyword (e.g. critical). - `kibana.rac.alert.severity.value`: the severity of the alert, as a numerical value, which allows sorting. diff --git a/x-pack/plugins/rule_registry/server/index.ts b/x-pack/plugins/rule_registry/server/index.ts index 3d492bb690b05..9fd1408fcdb21 100644 --- a/x-pack/plugins/rule_registry/server/index.ts +++ b/x-pack/plugins/rule_registry/server/index.ts @@ -17,7 +17,9 @@ export { ScopedRuleRegistryClient } from './rule_registry/create_scoped_rule_reg export const config = { schema: schema.object({ enabled: schema.boolean({ defaultValue: true }), - writeEnabled: schema.boolean({ defaultValue: false }), + unsafe: schema.object({ + write: schema.object({ enabled: schema.boolean({ defaultValue: false }) }), + }), }), }; diff --git a/x-pack/plugins/rule_registry/server/plugin.ts b/x-pack/plugins/rule_registry/server/plugin.ts index dabedc2849d07..09df47c40a394 100644 --- a/x-pack/plugins/rule_registry/server/plugin.ts +++ b/x-pack/plugins/rule_registry/server/plugin.ts @@ -37,7 +37,7 @@ export class RuleRegistryPlugin implements Plugin Date: Tue, 20 Apr 2021 05:56:18 +0200 Subject: [PATCH 70/82] [Discover] Display toast when adding columns and filters from document flyout (#97270) --- .../discover_grid/discover_grid_flyout.tsx | 20 +++++++++++--- .../components/table/table.test.tsx | 2 +- .../components/table/table_row.tsx | 6 ++++- .../table/table_row_btn_toggle_column.tsx | 10 +++++-- .../apps/discover/_data_grid_doc_table.ts | 26 +++++++++++++++++++ 5 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx b/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx index f31399793c0da..3894127891041 100644 --- a/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx @@ -178,15 +178,29 @@ export function DiscoverGridFlyout({ indexPattern={indexPattern} filter={(mapping, value, mode) => { onFilter(mapping, value, mode); - onClose(); + services.toastNotifications.addSuccess( + i18n.translate('discover.grid.flyout.toastFilterAdded', { + defaultMessage: `Filter was added`, + }) + ); }} onRemoveColumn={(columnName: string) => { onRemoveColumn(columnName); - onClose(); + services.toastNotifications.addSuccess( + i18n.translate('discover.grid.flyout.toastColumnRemoved', { + defaultMessage: `Column '{columnName}' was removed`, + values: { columnName }, + }) + ); }} onAddColumn={(columnName: string) => { onAddColumn(columnName); - onClose(); + services.toastNotifications.addSuccess( + i18n.translate('discover.grid.flyout.toastColumnAdded', { + defaultMessage: `Column '{columnName}' was added`, + values: { columnName }, + }) + ); }} /> diff --git a/src/plugins/discover/public/application/components/table/table.test.tsx b/src/plugins/discover/public/application/components/table/table.test.tsx index 8997c1d13a474..7539f29c1ec9d 100644 --- a/src/plugins/discover/public/application/components/table/table.test.tsx +++ b/src/plugins/discover/public/application/components/table/table.test.tsx @@ -155,7 +155,7 @@ describe('DocViewTable at Discover', () => { const elementExist = check[element]; if (typeof elementExist === 'boolean') { - const btn = findTestSubject(rowComponent, element); + const btn = findTestSubject(rowComponent, element, '^='); it(`renders ${element} for '${check._property}' correctly`, () => { const disabled = btn.length ? btn.props().disabled : true; diff --git a/src/plugins/discover/public/application/components/table/table_row.tsx b/src/plugins/discover/public/application/components/table/table_row.tsx index 5c6ae49770bc7..e8977fda8576a 100644 --- a/src/plugins/discover/public/application/components/table/table_row.tsx +++ b/src/plugins/discover/public/application/components/table/table_row.tsx @@ -65,7 +65,11 @@ export function DocViewTableRow({ onClick={() => onFilter(fieldMapping, valueRaw, '-')} /> {typeof onToggleColumn === 'function' && ( - + )} void; + fieldname: string; } -export function DocViewTableRowBtnToggleColumn({ onClick, active, disabled = false }: Props) { +export function DocViewTableRowBtnToggleColumn({ + onClick, + active, + disabled = false, + fieldname = '', +}: Props) { if (disabled) { return ( diff --git a/test/functional/apps/discover/_data_grid_doc_table.ts b/test/functional/apps/discover/_data_grid_doc_table.ts index 5499f0250eb73..f8406f4c8a8a9 100644 --- a/test/functional/apps/discover/_data_grid_doc_table.ts +++ b/test/functional/apps/discover/_data_grid_doc_table.ts @@ -22,6 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', 'doc_table:legacy': false, }; + const testSubjects = getService('testSubjects'); describe('discover data grid doc table', function describeIndexTests() { before(async function () { @@ -102,6 +103,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dataGrid.closeFlyout(); }); }); + + it('should show allow adding columns from the detail panel', async function () { + await retry.try(async function () { + await dataGrid.clickRowToggle({ isAnchorRow: false, rowIndex: rowToInspect - 1 }); + + // add columns + const fields = ['_id', '_index', 'agent']; + for (const field of fields) { + await testSubjects.click(`toggleColumnButton_${field}`); + } + + const headerWithFields = await dataGrid.getHeaderFields(); + expect(headerWithFields.join(' ')).to.contain(fields.join(' ')); + + // remove columns + for (const field of fields) { + await testSubjects.click(`toggleColumnButton_${field}`); + } + + const headerWithoutFields = await dataGrid.getHeaderFields(); + expect(headerWithoutFields.join(' ')).not.to.contain(fields.join(' ')); + + await dataGrid.closeFlyout(); + }); + }); }); describe('add and remove columns', function () { From bd5e9ba10a56dce21c61fcfccd92df1edb5a13bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Tue, 20 Apr 2021 08:51:28 +0200 Subject: [PATCH 71/82] [Remote Clusters] Added a11y tests and fixed violations (#96989) * Added a11y tests for Remote Clusters plugin and fixed discovered violations * Added an a11y test for a delete modal * Updated payload type casting Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/lib/cluster_serialization.ts | 2 +- .../remote_clusters/common/lib/index.ts | 1 + .../remote_cluster_form.tsx | 4 +- .../remote_cluster_form/request_flyout.tsx | 2 +- .../connection_status/connection_status.js | 10 +- .../detail_panel/detail_panel.js | 114 +++------- .../accessibility/apps/remote_clusters.ts | 204 ++++++++++++++++++ x-pack/test/accessibility/config.ts | 1 + 8 files changed, 247 insertions(+), 91 deletions(-) create mode 100644 x-pack/test/accessibility/apps/remote_clusters.ts diff --git a/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts b/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts index 8d3b1b895651a..bf0fc11e882cc 100644 --- a/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts +++ b/x-pack/plugins/remote_clusters/common/lib/cluster_serialization.ts @@ -45,7 +45,7 @@ export interface Cluster { hasDeprecatedProxySetting?: boolean; } -interface ClusterPayloadEs { +export interface ClusterPayloadEs { skip_unavailable?: boolean | null; mode?: 'sniff' | 'proxy' | null; proxy_address?: string | null; diff --git a/x-pack/plugins/remote_clusters/common/lib/index.ts b/x-pack/plugins/remote_clusters/common/lib/index.ts index 7afba67d3622d..b17283511b8b7 100644 --- a/x-pack/plugins/remote_clusters/common/lib/index.ts +++ b/x-pack/plugins/remote_clusters/common/lib/index.ts @@ -10,4 +10,5 @@ export { serializeCluster, Cluster, ClusterInfoEs, + ClusterPayloadEs, } from './cluster_serialization'; diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/remote_cluster_form.tsx b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/remote_cluster_form.tsx index 9f6eee757c755..766f12fedc81c 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/remote_cluster_form.tsx +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_form/remote_cluster_form.tsx @@ -47,8 +47,8 @@ import { convertCloudUrlToProxyConnection, convertProxyConnectionToCloudUrl, validateCluster, + isCloudUrlEnabled, } from './validators'; -import { isCloudUrlEnabled } from './validators/validate_cloud_url'; const defaultClusterValues: Cluster = { name: '', @@ -369,7 +369,7 @@ export class RemoteClusterForm extends Component { - + {isRequestVisible ? ( { return ( - +

    {name ? ( - - {icon} + {icon} + - - {message} - - + + {message} {!isConnected && mode === SNIFF_MODE && ( diff --git a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js index c25be664896c3..6969f98e5f092 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js +++ b/x-pack/plugins/remote_clusters/public/application/sections/remote_cluster_list/detail_panel/detail_panel.js @@ -183,9 +183,9 @@ export class DetailPanel extends Component { mode, }) { return ( - - - + + + - - - - {connectedNodesCount} - - - - - - - {seeds.map((seed) => ( @@ -236,9 +225,11 @@ export class DetailPanel extends Component { ))} - + + - + + - {this.renderSkipUnavailableValue(skipUnavailable)} - - - - - - - {maxConnectionsPerCluster} - - - {initialConnectTimeout} - - - + + + ); } @@ -302,9 +282,9 @@ export class DetailPanel extends Component { serverName, }) { return ( - - - + + + - - - - {connectedSocketsCount ? connectedSocketsCount : '-'} - - - - - - - {proxyAddress} - - + + + + + + + {serverName ? serverName : '-'} + + + + + - {this.renderSkipUnavailableValue(skipUnavailable)} - - - - - - - {proxySocketConnections ? proxySocketConnections : '-'} - - - {initialConnectTimeout} - - - - - - - - - - - - - - - {serverName ? serverName : '-'} - - - - + + + ); } renderCluster(cluster) { return (
    - +

    + ({ + persistent: { + cluster: { + remote: {}, + }, + }, + } as Payload); + +const getPayloadClusterProxyMode = (name: string): Payload => { + const payload = getEmptyPayload(); + payload.persistent.cluster.remote[name] = { + mode: 'proxy', + proxy_address: '127.0.0.1:9302', + server_name: 'test_server', + }; + return payload; +}; + +const getPayloadClusterSniffMode = (name: string): Payload => { + const payload = getEmptyPayload(); + payload.persistent.cluster.remote[name] = { + mode: 'sniff', + seeds: ['127.0.0.1:9301'], + }; + return payload; +}; + +const getDeleteClusterPayload = (name: string): Payload => { + const payload = getEmptyPayload(); + payload.persistent.cluster.remote[name] = { + skip_unavailable: null, + mode: null, + proxy_address: null, + proxy_socket_connections: null, + server_name: null, + seeds: null, + node_connections: null, + proxy: null, + }; + return payload; +}; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'security']); + const testSubjects = getService('testSubjects'); + const esClient = getService('es'); + const a11y = getService('a11y'); + const retry = getService('retry'); + + describe('Remote Clusters', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('remoteClusters'); + }); + + describe('Add remote cluster', () => { + it('renders the list view with empty prompt', async () => { + await retry.waitFor('empty prompt to be rendered', async () => { + return testSubjects.isDisplayed(emptyPrompt); + }); + await a11y.testAppSnapshot(); + }); + + it('renders add remote cluster form', async () => { + await retry.waitFor('add remote cluster button to be rendered', async () => { + return testSubjects.isDisplayed(createButton); + }); + + await testSubjects.click(createButton); + await retry.waitFor('add remote cluster form to be rendered', async () => { + return (await testSubjects.getVisibleText(pageTitle)) === 'Add remote cluster'; + }); + + await a11y.testAppSnapshot(); + }); + + it('renders request flyout', async () => { + await retry.waitFor('add remote cluster button to be rendered', async () => { + return testSubjects.isDisplayed(createButton); + }); + + await testSubjects.click(createButton); + await retry.waitFor('add remote cluster form to be rendered', async () => { + return (await testSubjects.getVisibleText(pageTitle)) === 'Add remote cluster'; + }); + + await testSubjects.click(requestButton); + await retry.waitFor('request flyout to be rendered', async () => { + return (await testSubjects.getVisibleText(requestTitle)) === 'Request'; + }); + + await a11y.testAppSnapshot(); + }); + }); + + const modes = ['sniff', 'proxy']; + + modes.forEach((mode: string) => { + describe(`Edit remote cluster (${mode} mode)`, () => { + const clusterName = mode === 'sniff' ? 'clusterSniffMode' : 'clusterProxyMode'; + const body = + mode === 'sniff' + ? getPayloadClusterSniffMode(clusterName) + : getPayloadClusterProxyMode(clusterName); + before(async () => { + await esClient.cluster.putSettings({ body }); + }); + + after(async () => { + await esClient.cluster.putSettings({ body: getDeleteClusterPayload(clusterName) }); + }); + + it('renders the list view with remote clusters', async () => { + await retry.waitFor('remote clusters list to be rendered', async () => { + return testSubjects.isDisplayed(nameLink); + }); + await a11y.testAppSnapshot(); + }); + + it(`renders remote cluster details flyout (${mode} mode)`, async () => { + await retry.waitFor('remote clusters list to be rendered', async () => { + return testSubjects.isDisplayed(nameLink); + }); + + await testSubjects.click(nameLink); + + await retry.waitFor('remote cluster details to be rendered', async () => { + return (await testSubjects.getVisibleText(detailsTitle)) === clusterName; + }); + + await a11y.testAppSnapshot(); + }); + + it(`renders delete cluster modal (${mode} mode)`, async () => { + await retry.waitFor('remote clusters list to be rendered', async () => { + return testSubjects.isDisplayed(nameLink); + }); + + await testSubjects.click(deleteButton); + + await retry.waitFor('delete cluster modal to be rendered', async () => { + return ( + (await testSubjects.getVisibleText(deleteModalTitle)) === + `Remove remote cluster '${clusterName}'?` + ); + }); + + await a11y.testAppSnapshot(); + }); + + it(`renders edit remote cluster form and request flyout (${mode} mode)`, async () => { + await retry.waitFor('edit remote cluster button to be rendered', async () => { + return testSubjects.isDisplayed(editButton); + }); + + await testSubjects.click(editButton); + await retry.waitFor('edit remote cluster form to be rendered', async () => { + return (await testSubjects.getVisibleText(pageTitle)) === 'Edit remote cluster'; + }); + + await testSubjects.click(requestButton); + await retry.waitFor('request flyout to be rendered', async () => { + return ( + (await testSubjects.getVisibleText(requestTitle)) === `Request for '${clusterName}'` + ); + }); + + await a11y.testAppSnapshot(); + }); + }); + }); + }); +} diff --git a/x-pack/test/accessibility/config.ts b/x-pack/test/accessibility/config.ts index 289247beb4771..5b46e7de1efa4 100644 --- a/x-pack/test/accessibility/config.ts +++ b/x-pack/test/accessibility/config.ts @@ -36,6 +36,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('./apps/canvas'), require.resolve('./apps/security_solution'), require.resolve('./apps/ml_embeddables_in_dashboard'), + require.resolve('./apps/remote_clusters'), ], pageObjects, From 6173583b09a87e26774b1920c314a698c531f41d Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 20 Apr 2021 09:10:14 +0200 Subject: [PATCH 72/82] [Exploratory View] Add monitor duration link for exploratory view (#97418) --- .../monitor_duration/monitor_duration.tsx | 11 ++++++++-- .../monitor_duration_container.tsx | 20 +++++++++++++++++++ .../contexts/uptime_settings_context.tsx | 4 +++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx index 9c059441b050e..8066458dfde1a 100644 --- a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle, EuiSpacer } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiTitle, EuiSpacer, EuiButton } from '@elastic/eui'; import { LocationDurationLine } from '../../../../common/types'; import { MLIntegrationComponent } from '../ml/ml_integeration'; import { AnomalyRecords } from '../../../state/actions'; @@ -18,6 +18,7 @@ interface DurationChartProps { hasMLJob: boolean; anomalies: AnomalyRecords | null; locationDurationLines: LocationDurationLine[]; + exploratoryViewLink: string; } /** @@ -27,6 +28,7 @@ interface DurationChartProps { * @param props The props required for this component to render properly */ export const MonitorDurationComponent = ({ + exploratoryViewLink, locationDurationLines, anomalies, loading, @@ -34,7 +36,7 @@ export const MonitorDurationComponent = ({ }: DurationChartProps) => { return ( - +

    @@ -56,6 +58,11 @@ export const MonitorDurationComponent = ({ + + + + + = ({ monitorId }) => { const { @@ -49,6 +51,23 @@ export const MonitorDuration: React.FC = ({ monitorId }) => { const { lastRefresh } = useContext(UptimeRefreshContext); + const { basePath } = useUptimeSettingsContext(); + + const exploratoryViewLink = createExploratoryViewUrl( + { + [`monitor-duration`]: { + reportType: 'upd', + time: { from: dateRangeStart, to: dateRangeEnd }, + reportDefinitions: { + 'monitor.id': monitorId as string, + }, + breakdown: 'observer.geo.name', + operationType: 'average', + }, + }, + basePath + ); + useEffect(() => { if (isMLAvailable) { const anomalyParams = { @@ -77,6 +96,7 @@ export const MonitorDuration: React.FC = ({ monitorId }) => { anomalies={anomalies} hasMLJob={hasMLJob} loading={loading || jobsLoading} + exploratoryViewLink={exploratoryViewLink} locationDurationLines={durationLines?.locationDurationLines ?? []} /> ); diff --git a/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx index 37ee7021eb19f..dacaeb89a5cc5 100644 --- a/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx +++ b/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { createContext, useMemo } from 'react'; +import React, { createContext, useContext, useMemo } from 'react'; import { UptimeAppProps } from '../apps/uptime_app'; import { CLIENT_DEFAULTS, CONTEXT_DEFAULTS } from '../../common/constants'; import { CommonlyUsedRange } from '../components/common/uptime_date_picker'; @@ -66,3 +66,5 @@ export const UptimeSettingsContextProvider: React.FC = ({ childr return ; }; + +export const useUptimeSettingsContext = () => useContext(UptimeSettingsContext); From 0876fce6b9821cf0f4669ce97e30c424124a5257 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 20 Apr 2021 09:11:44 +0200 Subject: [PATCH 73/82] [ Exploratory view] Add page load dist link for exploratory view (#97352) --- .../ResetPercentileZoom.tsx | 17 ++---- .../PageLoadDistribution/index.tsx | 58 +++++++++++++++---- 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/ResetPercentileZoom.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/ResetPercentileZoom.tsx index 0dd59654f477d..96b0198a870a5 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/ResetPercentileZoom.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/ResetPercentileZoom.tsx @@ -11,6 +11,7 @@ import { EuiHideFor, EuiShowFor, EuiButtonIcon, + EuiFlexItem, } from '@elastic/eui'; import { I18LABELS } from '../translations'; import { PercentileRange } from './index'; @@ -28,27 +29,21 @@ export function ResetPercentileZoom({ const onClick = () => { setPercentileRange({ min: null, max: null }); }; - return ( - <> + return !isDisabled ? ( + - + {I18LABELS.resetZoom} - - ); + + ) : null; } diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx index 050d3b54a200f..b2e8ca5fda805 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageLoadDistribution/index.tsx @@ -6,7 +6,14 @@ */ import React, { useState } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { useUrlParams } from '../../../../context/url_params_context/use_url_params'; import { useFetcher } from '../../../../hooks/use_fetcher'; import { I18LABELS } from '../translations'; @@ -14,6 +21,8 @@ import { BreakdownFilter } from '../Breakdowns/BreakdownFilter'; import { PageLoadDistChart } from '../Charts/PageLoadDistChart'; import { BreakdownItem } from '../../../../../typings/ui_filters'; import { ResetPercentileZoom } from './ResetPercentileZoom'; +import { createExploratoryViewUrl } from '../../../../../../observability/public'; +import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; export interface PercentileRange { min?: number | null; @@ -21,9 +30,15 @@ export interface PercentileRange { } export function PageLoadDistribution() { + const { + services: { http }, + } = useKibana(); + const { urlParams, uiFilters } = useUrlParams(); - const { start, end, searchTerm } = urlParams; + const { start, end, rangeFrom, rangeTo, searchTerm } = urlParams; + + const { serviceName } = uiFilters; const [percentileRange, setPercentileRange] = useState({ min: null, @@ -34,8 +49,6 @@ export function PageLoadDistribution() { const { data, status } = useFetcher( (callApmApi) => { - const { serviceName } = uiFilters; - if (start && end && serviceName) { return callApmApi({ endpoint: 'GET /api/apm/rum-client/page-load-distribution', @@ -64,6 +77,7 @@ export function PageLoadDistribution() { percentileRange.min, percentileRange.max, searchTerm, + serviceName, ] ); @@ -71,6 +85,20 @@ export function PageLoadDistribution() { setPercentileRange({ min, max }); }; + const exploratoryViewLink = createExploratoryViewUrl( + { + [`${serviceName}-page-views`]: { + reportType: 'pld', + time: { from: rangeFrom!, to: rangeTo! }, + reportDefinitions: { + 'service.name': serviceName?.[0] as string, + }, + ...(breakdown ? { breakdown: breakdown.fieldName } : {}), + }, + }, + http?.basePath.get() + ); + return (
    @@ -79,12 +107,10 @@ export function PageLoadDistribution() {

    {I18LABELS.pageLoadDistribution}

    - - - + + + + + +
    Date: Tue, 20 Apr 2021 10:37:58 +0300 Subject: [PATCH 74/82] Visualize data table: Summary row is detached and jumps in Firefox (#97083) * Use display: flex for footer in table * Update table_visualization.scss * Update table_visualization.scss Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/components/table_visualization.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/plugins/vis_type_table/public/components/table_visualization.scss b/src/plugins/vis_type_table/public/components/table_visualization.scss index 28dbf17b18739..21c235adf6db2 100644 --- a/src/plugins/vis_type_table/public/components/table_visualization.scss +++ b/src/plugins/vis_type_table/public/components/table_visualization.scss @@ -12,6 +12,15 @@ overflow: auto; @include euiScrollBar; + + // Sticky footer doesn't correct work with inline-flex in Firefox. + // As footer the last element I don't see any reason to use inline-flex for this element. + // Display: flex fixes jumping on hover in Firefox. + // Created issue on EUI (https://github.com/elastic/eui/issues/4729). + // Once addressed, we can remove this local fix. + .euiDataGrid--stickyFooter .euiDataGridFooter { + display: flex; + } } .tbvChart__split { From 2e7e6820234cd2486228d4b81a11f2a4a289e9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Tue, 20 Apr 2021 10:20:08 +0200 Subject: [PATCH 75/82] [Asset Management] Enable osquery plugin (#97422) --- .../collectors/application_usage/schema.ts | 1 + src/plugins/telemetry/schema/oss_plugins.json | 131 ++++++++++++++++++ .../public/routes/live_queries/new/index.tsx | 2 +- .../form/queries_field.tsx | 2 +- x-pack/plugins/osquery/server/config.ts | 2 +- x-pack/plugins/osquery/server/plugin.ts | 36 ----- 6 files changed, 135 insertions(+), 39 deletions(-) diff --git a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts index 693e9132fe536..e033da875080f 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts @@ -148,6 +148,7 @@ export const applicationUsageSchema = { ml: commonSchema, monitoring: commonSchema, 'observability-overview': commonSchema, + osquery: commonSchema, security_account: commonSchema, security_access_agreement: commonSchema, security_capture_url: commonSchema, // It's a forward app so we'll likely never report it diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 6099b3efa803e..dc653062931c2 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -3954,6 +3954,137 @@ } } }, + "osquery": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "Always `main`" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen over the last 90 days" + } + }, + "views": { + "type": "array", + "items": { + "properties": { + "appId": { + "type": "keyword", + "_meta": { + "description": "The application being tracked" + } + }, + "viewId": { + "type": "keyword", + "_meta": { + "description": "The application view being tracked" + } + }, + "clicks_total": { + "type": "long", + "_meta": { + "description": "General number of clicks in the application sub view since we started counting them" + } + }, + "clicks_7_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 7 days" + } + }, + "clicks_30_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 30 days" + } + }, + "clicks_90_days": { + "type": "long", + "_meta": { + "description": "General number of clicks in the active application sub view over the last 90 days" + } + }, + "minutes_on_screen_total": { + "type": "float", + "_meta": { + "description": "Minutes the application sub view is active and on-screen since we started counting them." + } + }, + "minutes_on_screen_7_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" + } + }, + "minutes_on_screen_30_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" + } + }, + "minutes_on_screen_90_days": { + "type": "float", + "_meta": { + "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" + } + } + } + } + } + } + }, "security_account": { "properties": { "appId": { diff --git a/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx index 78304d4b29196..9967eb97cddf2 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx @@ -57,8 +57,8 @@ const NewLiveQueryPageComponent = () => { id="xpack.osquery.newLiveQuery.pageTitle" defaultMessage="New live query" /> -

    +
    diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx index 2074c38e20fe9..7d5a2c5ac99ce 100644 --- a/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/form/queries_field.tsx @@ -39,8 +39,8 @@ const getNewStream = ({ id, interval, query, scheduledQueryGroupId }: GetNewStre : null, vars: { id: { type: 'text', value: id }, - type: 'integer', interval: { + type: 'integer', value: interval, }, query: { type: 'text', value: query }, diff --git a/x-pack/plugins/osquery/server/config.ts b/x-pack/plugins/osquery/server/config.ts index 58b9a8bf910c2..56d67400a47d9 100644 --- a/x-pack/plugins/osquery/server/config.ts +++ b/x-pack/plugins/osquery/server/config.ts @@ -8,7 +8,7 @@ import { TypeOf, schema } from '@kbn/config-schema'; export const ConfigSchema = schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), actionEnabled: schema.boolean({ defaultValue: false }), savedQueries: schema.boolean({ defaultValue: false }), packs: schema.boolean({ defaultValue: false }), diff --git a/x-pack/plugins/osquery/server/plugin.ts b/x-pack/plugins/osquery/server/plugin.ts index 2a6e4dc5b1f48..31f611c5f1d31 100644 --- a/x-pack/plugins/osquery/server/plugin.ts +++ b/x-pack/plugins/osquery/server/plugin.ts @@ -5,9 +5,7 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import { - DEFAULT_APP_CATEGORIES, PluginInitializerContext, CoreSetup, CoreStart, @@ -49,40 +47,6 @@ export class OsqueryPlugin implements Plugin config, }; - plugins.features.registerKibanaFeature({ - id: 'osquery', - name: i18n.translate('xpack.osquery.featureRegistry.osqueryFeatureName', { - defaultMessage: 'Osquery', - }), - order: 4000, - category: DEFAULT_APP_CATEGORIES.management, - app: ['osquery', 'kibana'], - catalogue: ['osquery'], - // see x-pack/plugins/features/common/feature_kibana_privileges.ts - privileges: { - all: { - app: ['osquery', 'kibana'], - api: ['osquery', 'osquery_write'], - catalogue: ['osquery'], - savedObject: { - all: [], - read: [], - }, - ui: ['show', 'save'], - }, - read: { - app: ['osquery', 'kibana'], - api: ['osquery'], - catalogue: ['osquery'], - savedObject: { - all: [], - read: [], - }, - ui: ['show'], - }, - }, - }); - initSavedObjects(core.savedObjects, osqueryContext); defineRoutes(router, osqueryContext); From 13411882eb7b964d70625f2c0a6d513ea6ebdd03 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 20 Apr 2021 11:47:22 +0300 Subject: [PATCH 76/82] [TSVB] Fix validation for Data time range mode combo-box (#97475) --- .../application/components/index_pattern.js | 43 ++++++++++++++----- .../server/lib/vis_data/get_series_data.ts | 1 + .../server/lib/vis_data/get_table_data.ts | 1 + 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/index_pattern.js b/src/plugins/vis_type_timeseries/public/application/components/index_pattern.js index e7a34c6e6596d..c5b3d86f61b5d 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/index_pattern.js +++ b/src/plugins/vis_type_timeseries/public/application/components/index_pattern.js @@ -18,7 +18,6 @@ import { EuiComboBox, EuiRange, EuiIconTip, - EuiText, EuiFormLabel, } from '@elastic/eui'; import { FieldSelect } from './aggs/field_select'; @@ -126,6 +125,9 @@ export const IndexPattern = ({ ({ value }) => model[TIME_RANGE_MODE_KEY] === value ); const isTimeSeries = model.type === PANEL_TYPES.TIMESERIES; + const isDataTimerangeModeInvalid = + selectedTimeRangeOption && + !isTimerangeModeEnabled(selectedTimeRangeOption.value, uiRestrictions); useEffect(() => { updateControlValidity(intervalName, intervalValidation.isValid); @@ -143,13 +145,38 @@ export const IndexPattern = ({ + {' '} + + } + type="questionInCircle" + /> + + } + isInvalid={isDataTimerangeModeInvalid} + error={i18n.translate('visTypeTimeseries.indexPattern.timeRange.error', { + defaultMessage: 'You cannot use "{mode}" with the current index type.', + values: { + mode: selectedTimeRangeOption?.label, + }, })} > - - {i18n.translate('visTypeTimeseries.indexPattern.timeRange.hint', { - defaultMessage: `This setting controls the timespan used for matching documents. - "Entire timerange" will match all the documents selected in the timepicker. - "Last value" will match only the documents for the specified interval from the end of the timerange.`, - })} -
    )} diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_series_data.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_series_data.ts index 6d165d3343eaa..1d910dab5a786 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_series_data.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_series_data.ts @@ -105,5 +105,6 @@ export async function getSeriesData( ...handleErrorResponse(panel)(err), }; } + return meta; } } diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.ts index 00d23ee45e6da..075e90762f151 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_table_data.ts @@ -115,5 +115,6 @@ export async function getTableData( ...handleErrorResponse(panel)(err), }; } + return meta; } } From 20b585d12225fd4cee27936762f967dbd2838636 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Tue, 20 Apr 2021 10:52:54 +0200 Subject: [PATCH 77/82] [ML] Anomaly detection rule lookback interval improvements (#97370) * [ML] add advanced settings * [ML] default advanced settings * [ML] advanced settings validators * [ML] range control for top n buckets * [ML] execute rule with a new query for most recent anomalies * [ML] find most anomalous bucket from the top N * Revert "[ML] range control for top n buckets" This reverts commit e039f250 * [ML] validate check interval against the lookback interval * [ML] update descriptions * [ML] fix test subjects * [ML] update warning message * [ML] add functional tests * [ML] adjust unit tests, mark getLookbackInterval * [ML] update lookback interval description and warning message * [ML] update fetchResult tsDoc * [ML] cleanup * [ML] fix imports to reduce bundle size * [ML] round up lookback interval * [ML] update functional test assertion * [ML] async import for validator --- x-pack/plugins/ml/common/constants/alerts.ts | 2 + x-pack/plugins/ml/common/types/alerts.ts | 7 + x-pack/plugins/ml/common/util/alerts.test.ts | 78 ++++++++ x-pack/plugins/ml/common/util/alerts.ts | 53 ++++++ .../plugins/ml/common/util/job_utils.test.ts | 7 +- x-pack/plugins/ml/common/util/job_utils.ts | 12 +- x-pack/plugins/ml/common/util/validators.ts | 34 ++++ .../ml/public/alerting/advanced_settings.tsx | 117 ++++++++++++ .../ml/public/alerting/config_validator.tsx | 27 ++- .../alerting/ml_anomaly_alert_trigger.tsx | 47 ++++- .../ml/public/alerting/register_ml_alerts.ts | 31 ++- .../severity_control/severity_control.tsx | 2 +- .../public/alerting/time_interval_control.tsx | 49 +++++ .../plugins/ml/public/alerting/validators.ts | 11 ++ .../ml/server/lib/alerts/alerting_service.ts | 180 ++++++++++++++++-- .../ml/server/models/job_service/datafeeds.ts | 52 +++-- x-pack/plugins/ml/server/routes/alerting.ts | 6 +- .../server/routes/schemas/alerting_schema.ts | 8 +- .../providers/alerting_service.ts | 9 +- .../test/functional/services/ml/alerting.ts | 43 +++++ .../apps/ml/alert_flyout.ts | 11 +- 21 files changed, 718 insertions(+), 68 deletions(-) create mode 100644 x-pack/plugins/ml/common/util/alerts.test.ts create mode 100644 x-pack/plugins/ml/common/util/alerts.ts create mode 100644 x-pack/plugins/ml/public/alerting/advanced_settings.tsx create mode 100644 x-pack/plugins/ml/public/alerting/time_interval_control.tsx create mode 100644 x-pack/plugins/ml/public/alerting/validators.ts diff --git a/x-pack/plugins/ml/common/constants/alerts.ts b/x-pack/plugins/ml/common/constants/alerts.ts index 53b8fa7d5fea7..30daf0d45c3ac 100644 --- a/x-pack/plugins/ml/common/constants/alerts.ts +++ b/x-pack/plugins/ml/common/constants/alerts.ts @@ -47,3 +47,5 @@ export const ML_ALERT_TYPES_CONFIG: Record< }; export const ALERT_PREVIEW_SAMPLE_SIZE = 5; + +export const TOP_N_BUCKETS_COUNT = 1; diff --git a/x-pack/plugins/ml/common/types/alerts.ts b/x-pack/plugins/ml/common/types/alerts.ts index bbbb260409bd0..f2c3385c1fbc7 100644 --- a/x-pack/plugins/ml/common/types/alerts.ts +++ b/x-pack/plugins/ml/common/types/alerts.ts @@ -93,4 +93,11 @@ export type MlAnomalyDetectionAlertParams = { severity: number; resultType: AnomalyResultType; includeInterim: boolean; + lookbackInterval: string | null | undefined; + topNBuckets: number | null | undefined; } & AlertTypeParams; + +export type MlAnomalyDetectionAlertAdvancedSettings = Pick< + MlAnomalyDetectionAlertParams, + 'lookbackInterval' | 'topNBuckets' +>; diff --git a/x-pack/plugins/ml/common/util/alerts.test.ts b/x-pack/plugins/ml/common/util/alerts.test.ts new file mode 100644 index 0000000000000..d9896c967165b --- /dev/null +++ b/x-pack/plugins/ml/common/util/alerts.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getLookbackInterval, resolveLookbackInterval } from './alerts'; +import type { CombinedJobWithStats, Datafeed, Job } from '../types/anomaly_detection_jobs'; + +describe('resolveLookbackInterval', () => { + test('resolves interval for bucket spans bigger than 1m', () => { + const testJobs = [ + { + analysis_config: { + bucket_span: '15m', + }, + }, + ] as Job[]; + + const testDatafeeds = [ + { + query_delay: '65630ms', + }, + ] as Datafeed[]; + + expect(resolveLookbackInterval(testJobs, testDatafeeds)).toBe('32m'); + }); + + test('resolves interval for bucket spans smaller than 1m', () => { + const testJobs = [ + { + analysis_config: { + bucket_span: '50s', + }, + }, + ] as Job[]; + + const testDatafeeds = [ + { + query_delay: '20s', + }, + ] as Datafeed[]; + + expect(resolveLookbackInterval(testJobs, testDatafeeds)).toBe('3m'); + }); + + test('resolves interval for bucket spans smaller than 1m without query dealay', () => { + const testJobs = [ + { + analysis_config: { + bucket_span: '59s', + }, + }, + ] as Job[]; + + const testDatafeeds = [{}] as Datafeed[]; + + expect(resolveLookbackInterval(testJobs, testDatafeeds)).toBe('3m'); + }); +}); + +describe('getLookbackInterval', () => { + test('resolves interval for bucket spans bigger than 1m', () => { + const testJobs = [ + { + analysis_config: { + bucket_span: '15m', + }, + datafeed_config: { + query_delay: '65630ms', + }, + }, + ] as CombinedJobWithStats[]; + + expect(getLookbackInterval(testJobs)).toBe('32m'); + }); +}); diff --git a/x-pack/plugins/ml/common/util/alerts.ts b/x-pack/plugins/ml/common/util/alerts.ts new file mode 100644 index 0000000000000..5d68677d4fb97 --- /dev/null +++ b/x-pack/plugins/ml/common/util/alerts.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CombinedJobWithStats, Datafeed, Job } from '../types/anomaly_detection_jobs'; +import { resolveMaxTimeInterval } from './job_utils'; +import { isDefined } from '../types/guards'; +import { parseInterval } from './parse_interval'; + +const narrowBucketLength = 60; + +/** + * Resolves the lookback interval for the rule + * using the formula max(2m, 2 * bucket_span) + query_delay + 1s. + * and rounds up to a whole number of minutes. + */ +export function resolveLookbackInterval(jobs: Job[], datafeeds: Datafeed[]): string { + const bucketSpanInSeconds = Math.ceil( + resolveMaxTimeInterval(jobs.map((v) => v.analysis_config.bucket_span)) ?? 0 + ); + const queryDelayInSeconds = Math.ceil( + resolveMaxTimeInterval(datafeeds.map((v) => v.query_delay).filter(isDefined)) ?? 0 + ); + + const result = + Math.max(2 * narrowBucketLength, 2 * bucketSpanInSeconds) + queryDelayInSeconds + 1; + + return `${Math.ceil(result / 60)}m`; +} + +/** + * @deprecated We should avoid using {@link CombinedJobWithStats}. Replace usages with {@link resolveLookbackInterval} when + * Kibana API returns mapped job and the datafeed configs. + */ +export function getLookbackInterval(jobs: CombinedJobWithStats[]): string { + return resolveLookbackInterval( + jobs, + jobs.map((v) => v.datafeed_config) + ); +} + +export function getTopNBuckets(job: Job): number { + const bucketSpan = parseInterval(job.analysis_config.bucket_span); + + if (bucketSpan === null) { + throw new Error('Unable to resolve a bucket span length'); + } + + return Math.ceil(narrowBucketLength / bucketSpan.asSeconds()); +} diff --git a/x-pack/plugins/ml/common/util/job_utils.test.ts b/x-pack/plugins/ml/common/util/job_utils.test.ts index 59f8c8a4dae3a..4f5877703b8e3 100644 --- a/x-pack/plugins/ml/common/util/job_utils.test.ts +++ b/x-pack/plugins/ml/common/util/job_utils.test.ts @@ -20,7 +20,7 @@ import { getSafeAggregationName, getLatestDataOrBucketTimestamp, getEarliestDatafeedStartTime, - resolveBucketSpanInSeconds, + resolveMaxTimeInterval, } from './job_utils'; import { CombinedJob, Job } from '../types/anomaly_detection_jobs'; import moment from 'moment'; @@ -606,7 +606,10 @@ describe('ML - job utils', () => { describe('resolveBucketSpanInSeconds', () => { test('should resolve maximum bucket interval', () => { - expect(resolveBucketSpanInSeconds(['15m', '1h', '6h', '90s'])).toBe(21600); + expect(resolveMaxTimeInterval(['15m', '1h', '6h', '90s'])).toBe(21600); + }); + test('returns undefined for an empty array', () => { + expect(resolveMaxTimeInterval([])).toBe(undefined); }); }); }); diff --git a/x-pack/plugins/ml/common/util/job_utils.ts b/x-pack/plugins/ml/common/util/job_utils.ts index da340d4413849..78e565a491386 100644 --- a/x-pack/plugins/ml/common/util/job_utils.ts +++ b/x-pack/plugins/ml/common/util/job_utils.ts @@ -831,14 +831,16 @@ export function splitIndexPatternNames(indexPatternName: string): string[] { } /** - * Resolves the longest bucket span from the list. - * @param bucketSpans Collection of bucket spans + * Resolves the longest time interval from the list. + * @param timeIntervals Collection of the strings representing time intervals, e.g. ['15m', '1h', '2d'] */ -export function resolveBucketSpanInSeconds(bucketSpans: string[]): number { - return Math.max( - ...bucketSpans +export function resolveMaxTimeInterval(timeIntervals: string[]): number | undefined { + const result = Math.max( + ...timeIntervals .map((b) => parseInterval(b)) .filter(isDefined) .map((v) => v.asSeconds()) ); + + return Number.isFinite(result) ? result : undefined; } diff --git a/x-pack/plugins/ml/common/util/validators.ts b/x-pack/plugins/ml/common/util/validators.ts index b52e82495a76c..0936efbcb00fc 100644 --- a/x-pack/plugins/ml/common/util/validators.ts +++ b/x-pack/plugins/ml/common/util/validators.ts @@ -7,6 +7,7 @@ import { ALLOWED_DATA_UNITS } from '../constants/validation'; import { parseInterval } from './parse_interval'; +import { isPopulatedObject } from './object_utils'; /** * Provides a validator function for maximum allowed input length. @@ -85,6 +86,10 @@ export function memoryInputValidator(allowedUnits = ALLOWED_DATA_UNITS) { export function timeIntervalInputValidator() { return (value: string) => { + if (value === '') { + return null; + } + const r = parseInterval(value); if (r === null) { return { @@ -95,3 +100,32 @@ export function timeIntervalInputValidator() { return null; }; } + +export interface NumberValidationResult { + min: boolean; + max: boolean; +} + +export function numberValidator(conditions?: { min?: number; max?: number }) { + if ( + conditions?.min !== undefined && + conditions.max !== undefined && + conditions.min > conditions.max + ) { + throw new Error('Invalid validator conditions'); + } + + return (value: number): NumberValidationResult | null => { + const result = {} as NumberValidationResult; + if (conditions?.min !== undefined && value < conditions.min) { + result.min = true; + } + if (conditions?.max !== undefined && value > conditions.max) { + result.max = true; + } + if (isPopulatedObject(result)) { + return result; + } + return null; + }; +} diff --git a/x-pack/plugins/ml/public/alerting/advanced_settings.tsx b/x-pack/plugins/ml/public/alerting/advanced_settings.tsx new file mode 100644 index 0000000000000..05ce3c13215b3 --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/advanced_settings.tsx @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiAccordion, + EuiDescribedFormGroup, + EuiFieldNumber, + EuiFormRow, + EuiHorizontalRule, + EuiSpacer, + EuiText, +} from '@elastic/eui'; +import { MlAnomalyDetectionAlertAdvancedSettings } from '../../common/types/alerts'; +import { TimeIntervalControl } from './time_interval_control'; +import { TOP_N_BUCKETS_COUNT } from '../../common/constants/alerts'; + +interface AdvancedSettingsProps { + value: MlAnomalyDetectionAlertAdvancedSettings; + onChange: (update: Partial) => void; +} + +export const AdvancedSettings: FC = React.memo(({ value, onChange }) => { + return ( + + } + data-test-subj={'mlAnomalyAlertAdvancedSettingsTrigger'} + > + + + +

    + } + description={ + + + + } + > + + } + onChange={(update) => { + onChange({ lookbackInterval: update }); + }} + data-test-subj={'mlAnomalyAlertLookbackInterval'} + /> + + + + +

    + } + description={ + + + + } + > + + } + > + { + onChange({ topNBuckets: Number(e.target.value) }); + }} + data-test-subj={'mlAnomalyAlertTopNBuckets'} + /> + + + + + ); +}); diff --git a/x-pack/plugins/ml/public/alerting/config_validator.tsx b/x-pack/plugins/ml/public/alerting/config_validator.tsx index 5881a3b36dcbd..5a834ab14dd35 100644 --- a/x-pack/plugins/ml/public/alerting/config_validator.tsx +++ b/x-pack/plugins/ml/public/alerting/config_validator.tsx @@ -5,40 +5,35 @@ * 2.0. */ -import React, { FC, useMemo } from 'react'; +import React, { FC } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { parseInterval } from '../../common/util/parse_interval'; import { CombinedJobWithStats } from '../../common/types/anomaly_detection_jobs'; import { DATAFEED_STATE } from '../../common/constants/states'; -import { resolveBucketSpanInSeconds } from '../../common/util/job_utils'; +import { MlAnomalyDetectionAlertParams } from '../../common/types/alerts'; interface ConfigValidatorProps { alertInterval: string; jobConfigs: CombinedJobWithStats[]; + alertParams: MlAnomalyDetectionAlertParams; } /** * Validated alert configuration */ export const ConfigValidator: FC = React.memo( - ({ jobConfigs = [], alertInterval }) => { - const resultBucketSpanInSeconds = useMemo( - () => resolveBucketSpanInSeconds(jobConfigs.map((v) => v.analysis_config.bucket_span)), - [jobConfigs] - ); - - const resultBucketSpanString = - resultBucketSpanInSeconds % 60 === 0 - ? `${resultBucketSpanInSeconds / 60}m` - : `${resultBucketSpanInSeconds}s`; - + ({ jobConfigs = [], alertInterval, alertParams }) => { if (jobConfigs.length === 0) return null; const alertIntervalInSeconds = parseInterval(alertInterval)!.asSeconds(); - const isAlertIntervalTooHigh = resultBucketSpanInSeconds < alertIntervalInSeconds; + const lookbackIntervalInSeconds = + !!alertParams.lookbackInterval && parseInterval(alertParams.lookbackInterval)?.asSeconds(); + + const isAlertIntervalTooHigh = + lookbackIntervalInSeconds && lookbackIntervalInSeconds < alertIntervalInSeconds; const jobWithoutStartedDatafeed = jobConfigs .filter((job) => job.datafeed_config.state !== DATAFEED_STATE.STARTED) @@ -66,9 +61,9 @@ export const ConfigValidator: FC = React.memo(
  1. diff --git a/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx b/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx index 89804813a4eda..3c8ee6bf4899f 100644 --- a/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx +++ b/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx @@ -18,11 +18,17 @@ import { ResultTypeSelector } from './result_type_selector'; import { alertingApiProvider } from '../application/services/ml_api_service/alerting'; import { PreviewAlertCondition } from './preview_alert_condition'; import { ANOMALY_THRESHOLD } from '../../common'; -import { MlAnomalyDetectionAlertParams } from '../../common/types/alerts'; +import { + MlAnomalyDetectionAlertAdvancedSettings, + MlAnomalyDetectionAlertParams, +} from '../../common/types/alerts'; import { ANOMALY_RESULT_TYPE } from '../../common/constants/anomalies'; import { InterimResultsControl } from './interim_results_control'; import { ConfigValidator } from './config_validator'; import { CombinedJobWithStats } from '../../common/types/anomaly_detection_jobs'; +import { AdvancedSettings } from './advanced_settings'; +import { getLookbackInterval, getTopNBuckets } from '../../common/util/alerts'; +import { isDefined } from '../../common/types/guards'; interface MlAnomalyAlertTriggerProps { alertParams: MlAnomalyDetectionAlertParams; @@ -114,6 +120,28 @@ const MlAnomalyAlertTrigger: FC = ({ } }); + const advancedSettings = useMemo(() => { + let { lookbackInterval, topNBuckets } = alertParams; + + if (!isDefined(lookbackInterval) && jobConfigs.length > 0) { + lookbackInterval = getLookbackInterval(jobConfigs); + } + if (!isDefined(topNBuckets) && jobConfigs.length > 0) { + topNBuckets = getTopNBuckets(jobConfigs[0]); + } + return { + lookbackInterval, + topNBuckets, + }; + }, [alertParams.lookbackInterval, alertParams.topNBuckets, jobConfigs]); + + const resultParams = useMemo(() => { + return { + ...alertParams, + ...advancedSettings, + }; + }, [alertParams, advancedSettings]); + return ( @@ -139,7 +167,11 @@ const MlAnomalyAlertTrigger: FC = ({ errors={errors.jobSelection} /> - + = ({ /> + { + Object.keys(update).forEach((k) => { + setAlertParams(k, update[k as keyof MlAnomalyDetectionAlertAdvancedSettings]); + }); + }, [])} + /> + + + diff --git a/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts b/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts index 5bb9df74b6f61..92a5343380cdd 100644 --- a/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts +++ b/x-pack/plugins/ml/public/alerting/register_ml_alerts.ts @@ -11,7 +11,10 @@ import { ML_ALERT_TYPES } from '../../common/constants/alerts'; import { MlAnomalyDetectionAlertParams } from '../../common/types/alerts'; import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; -export function registerMlAlerts(triggersActionsUi: TriggersAndActionsUIPublicPluginSetup) { +export async function registerMlAlerts(triggersActionsUi: TriggersAndActionsUIPublicPluginSetup) { + // async import validators to reduce initial bundle size + const { validateLookbackInterval, validateTopNBucket } = await import('./validators'); + triggersActionsUi.alertTypeRegistry.register({ id: ML_ALERT_TYPES.ANOMALY_DETECTION, description: i18n.translate('xpack.ml.alertTypes.anomalyDetection.description', { @@ -28,7 +31,9 @@ export function registerMlAlerts(triggersActionsUi: TriggersAndActionsUIPublicPl jobSelection: new Array(), severity: new Array(), resultType: new Array(), - }, + topNBuckets: new Array(), + lookbackInterval: new Array(), + } as Record, }; if ( @@ -58,6 +63,28 @@ export function registerMlAlerts(triggersActionsUi: TriggersAndActionsUIPublicPl ); } + if ( + !!alertParams.lookbackInterval && + validateLookbackInterval(alertParams.lookbackInterval) + ) { + validationResult.errors.lookbackInterval.push( + i18n.translate('xpack.ml.alertTypes.anomalyDetection.lookbackInterval.errorMessage', { + defaultMessage: 'Lookback interval is invalid', + }) + ); + } + + if ( + typeof alertParams.topNBuckets === 'number' && + validateTopNBucket(alertParams.topNBuckets) + ) { + validationResult.errors.topNBuckets.push( + i18n.translate('xpack.ml.alertTypes.anomalyDetection.topNBuckets.errorMessage', { + defaultMessage: 'Number of buckets is invalid', + }) + ); + } + return validationResult; }, requiresAppContext: false, diff --git a/x-pack/plugins/ml/public/alerting/severity_control/severity_control.tsx b/x-pack/plugins/ml/public/alerting/severity_control/severity_control.tsx index 26a53882535b6..b1cd808643ca2 100644 --- a/x-pack/plugins/ml/public/alerting/severity_control/severity_control.tsx +++ b/x-pack/plugins/ml/public/alerting/severity_control/severity_control.tsx @@ -67,7 +67,7 @@ export const SeverityControl: FC = React.memo(({ value, o value={value ?? ANOMALY_THRESHOLD.LOW} onChange={(e) => { // @ts-ignore Property 'value' does not exist on type 'EventTarget' | (EventTarget & HTMLInputElement) - onChange(e.target.value); + onChange(Number(e.target.value)); }} showLabels showValue diff --git a/x-pack/plugins/ml/public/alerting/time_interval_control.tsx b/x-pack/plugins/ml/public/alerting/time_interval_control.tsx new file mode 100644 index 0000000000000..8030d340a3774 --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/time_interval_control.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFieldText, EuiFormRow, EuiFieldTextProps } from '@elastic/eui'; +import React, { FC, ReactNode, useMemo } from 'react'; +import { invalidTimeIntervalMessage } from '../application/jobs/new_job/common/job_validator/util'; +import { composeValidators } from '../../common'; +import { timeIntervalInputValidator } from '../../common/util/validators'; + +type TimeIntervalControlProps = Omit & { + label: string | ReactNode; + value: string | null | undefined; + onChange: (update: string) => void; +}; + +export const TimeIntervalControl: FC = ({ + value, + onChange, + label, + ...fieldTextProps +}) => { + const validators = useMemo(() => composeValidators(timeIntervalInputValidator()), []); + + const validationErrors = useMemo(() => validators(value), [value]); + + const isInvalid = value !== undefined && !!validationErrors; + + return ( + + { + onChange(e.target.value); + }} + isInvalid={isInvalid} + /> + + ); +}; diff --git a/x-pack/plugins/ml/public/alerting/validators.ts b/x-pack/plugins/ml/public/alerting/validators.ts new file mode 100644 index 0000000000000..0c76e049b6da9 --- /dev/null +++ b/x-pack/plugins/ml/public/alerting/validators.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { numberValidator, timeIntervalInputValidator } from '../../common/util/validators'; + +export const validateLookbackInterval = timeIntervalInputValidator(); +export const validateTopNBucket = numberValidator({ min: 1 }); diff --git a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts index 81529669749bc..04d9fcfce7d61 100644 --- a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts +++ b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts @@ -7,8 +7,6 @@ import Boom from '@hapi/boom'; import rison from 'rison-node'; -import { ElasticsearchClient } from 'kibana/server'; -import moment from 'moment'; import { Duration } from 'moment/moment'; import { MlClient } from '../ml_client'; import { @@ -27,8 +25,10 @@ import { } from '../../../common/types/alerts'; import { AnomalyDetectionAlertContext } from './register_anomaly_detection_alert_type'; import { MlJobsResponse } from '../../../common/types/job_service'; -import { resolveBucketSpanInSeconds } from '../../../common/util/job_utils'; +import { resolveMaxTimeInterval } from '../../../common/util/job_utils'; import { isDefined } from '../../../common/types/guards'; +import { getTopNBuckets, resolveLookbackInterval } from '../../../common/util/alerts'; +import type { DatafeedsService } from '../../models/job_service/datafeeds'; type AggResultsResponse = { key?: number } & { [key in PreviewResultsKeys]: { @@ -40,12 +40,21 @@ type AggResultsResponse = { key?: number } & { }; }; +/** + * Mapping for result types and corresponding score fields. + */ +const resultTypeScoreMapping = { + [ANOMALY_RESULT_TYPE.BUCKET]: 'anomaly_score', + [ANOMALY_RESULT_TYPE.RECORD]: 'record_score', + [ANOMALY_RESULT_TYPE.INFLUENCER]: 'influencer_score', +}; + /** * Alerting related server-side methods * @param mlClient - * @param esClient + * @param datafeedsService */ -export function alertingServiceProvider(mlClient: MlClient, esClient: ElasticsearchClient) { +export function alertingServiceProvider(mlClient: MlClient, datafeedsService: DatafeedsService) { const getAggResultsLabel = (resultType: AnomalyResultType) => { return { aggGroupLabel: `${resultType}_results` as PreviewResultsKeys, @@ -332,7 +341,16 @@ export function alertingServiceProvider(mlClient: MlClient, esClient: Elasticsea if (jobsResponse.length === 0) { // Probably assigned groups don't contain any jobs anymore. - return; + throw new Error("Couldn't find the job with provided id"); + } + + const maxBucket = resolveMaxTimeInterval( + jobsResponse.map((v) => v.analysis_config.bucket_span) + ); + + if (maxBucket === undefined) { + // Technically it's not possible, just in case. + throw new Error('Unable to resolve a valid bucket length'); } /** @@ -341,9 +359,7 @@ export function alertingServiceProvider(mlClient: MlClient, esClient: Elasticsea */ const lookBackTimeInterval = `${Math.max( // Double the max bucket span - Math.round( - resolveBucketSpanInSeconds(jobsResponse.map((v) => v.analysis_config.bucket_span)) * 2 - ), + Math.round(maxBucket * 2), checkIntervalGap ? Math.round(checkIntervalGap.asSeconds()) : 0 )}s`; @@ -368,7 +384,7 @@ export function alertingServiceProvider(mlClient: MlClient, esClient: Elasticsea }, { terms: { - result_type: Object.values(ANOMALY_RESULT_TYPE), + result_type: Object.values(ANOMALY_RESULT_TYPE) as string[], }, }, ...(params.includeInterim @@ -431,6 +447,139 @@ export function alertingServiceProvider(mlClient: MlClient, esClient: Elasticsea ).filter(isDefined); }; + /** + * Fetches the most recent anomaly according the top N buckets within the lookback interval + * that satisfies a rule criteria. + * + * @param params - Alert params + */ + const fetchResult = async ( + params: MlAnomalyDetectionAlertParams + ): Promise => { + const jobAndGroupIds = [ + ...(params.jobSelection.jobIds ?? []), + ...(params.jobSelection.groupIds ?? []), + ]; + + // Extract jobs from group ids and make sure provided jobs assigned to a current space + const jobsResponse = ( + await mlClient.getJobs({ job_id: jobAndGroupIds.join(',') }) + ).body.jobs; + + if (jobsResponse.length === 0) { + // Probably assigned groups don't contain any jobs anymore. + return; + } + + const jobIds = jobsResponse.map((v) => v.job_id); + + const dataFeeds = await datafeedsService.getDatafeedByJobId(jobIds); + + const maxBucketInSeconds = resolveMaxTimeInterval( + jobsResponse.map((v) => v.analysis_config.bucket_span) + ); + + if (maxBucketInSeconds === undefined) { + // Technically it's not possible, just in case. + throw new Error('Unable to resolve a valid bucket length'); + } + + const lookBackTimeInterval: string = + params.lookbackInterval ?? resolveLookbackInterval(jobsResponse, dataFeeds ?? []); + + const topNBuckets: number = params.topNBuckets ?? getTopNBuckets(jobsResponse[0]); + + const requestBody = { + size: 0, + query: { + bool: { + filter: [ + { + terms: { job_id: jobIds }, + }, + { + terms: { + result_type: Object.values(ANOMALY_RESULT_TYPE) as string[], + }, + }, + { + range: { + timestamp: { + gte: `now-${lookBackTimeInterval}`, + }, + }, + }, + ...(params.includeInterim + ? [] + : [ + { + term: { is_interim: false }, + }, + ]), + ], + }, + }, + aggs: { + alerts_over_time: { + date_histogram: { + field: 'timestamp', + fixed_interval: `${maxBucketInSeconds}s`, + order: { + _key: 'desc' as const, + }, + }, + aggs: { + max_score: { + max: { + field: resultTypeScoreMapping[params.resultType], + }, + }, + ...getResultTypeAggRequest(params.resultType, params.severity), + truncate: { + bucket_sort: { + size: topNBuckets, + }, + }, + }, + }, + }, + }; + + const response = await mlClient.anomalySearch( + { + // @ts-expect-error + body: requestBody, + }, + jobIds + ); + + const result = response.body.aggregations as { + alerts_over_time: { + buckets: Array< + { + doc_count: number; + key: number; + key_as_string: string; + max_score: { + value: number; + }; + } & AggResultsResponse + >; + }; + }; + + if (result.alerts_over_time.buckets.length === 0) { + return; + } + + // Find the most anomalous result from the top N buckets + const topResult = result.alerts_over_time.buckets.reduce((prev, current) => + prev.max_score.value > current.max_score.value ? prev : current + ); + + return getResultsFormatter(params.resultType)(topResult); + }; + /** * TODO Replace with URL generator when https://github.com/elastic/kibana/issues/59453 is resolved * @param r @@ -520,17 +669,8 @@ export function alertingServiceProvider(mlClient: MlClient, esClient: Elasticsea startedAt: Date, previousStartedAt: Date | null ): Promise => { - const checkIntervalGap = previousStartedAt - ? moment.duration(moment(startedAt).diff(previousStartedAt)) - : undefined; - - const res = await fetchAnomalies(params, undefined, checkIntervalGap); - - if (!res) { - throw new Error('No results found'); - } + const result = await fetchResult(params); - const result = res[0]; if (!result) return; const anomalyExplorerUrl = buildExplorerUrl(result, params.resultType); diff --git a/x-pack/plugins/ml/server/models/job_service/datafeeds.ts b/x-pack/plugins/ml/server/models/job_service/datafeeds.ts index 8279571adbae2..72255e168249a 100644 --- a/x-pack/plugins/ml/server/models/job_service/datafeeds.ts +++ b/x-pack/plugins/ml/server/models/job_service/datafeeds.ts @@ -34,6 +34,8 @@ interface Results { }; } +export type DatafeedsService = ReturnType; + export function datafeedsProvider(client: IScopedClusterClient, mlClient: MlClient) { async function forceStartDatafeeds(datafeedIds: string[], start?: number, end?: number) { const jobIds = await getJobIdsByDatafeedId(); @@ -168,25 +170,39 @@ export function datafeedsProvider(client: IScopedClusterClient, mlClient: MlClie }, {} as { [id: string]: string }); } + async function getDatafeedByJobId( + jobId: string[], + excludeGenerated?: boolean + ): Promise; + async function getDatafeedByJobId( jobId: string, excludeGenerated?: boolean - ): Promise { + ): Promise; + + async function getDatafeedByJobId( + jobId: string | string[], + excludeGenerated?: boolean + ): Promise { + const jobIds = Array.isArray(jobId) ? jobId : [jobId]; + async function findDatafeed() { // if the job was doesn't use the standard datafeedId format // get all the datafeeds and match it with the jobId const { body: { datafeeds }, - } = await mlClient.getDatafeeds(excludeGenerated ? { exclude_generated: true } : {}); // - for (const result of datafeeds) { - if (result.job_id === jobId) { - return result; - } + } = await mlClient.getDatafeeds(excludeGenerated ? { exclude_generated: true } : {}); + if (typeof jobId === 'string') { + return datafeeds.find((v) => v.job_id === jobId); + } + + if (Array.isArray(jobId)) { + return datafeeds.filter((v) => jobIds.includes(v.job_id)); } } // if the job was created by the wizard, // then we can assume it uses the standard format of the datafeedId - const assumedDefaultDatafeedId = `datafeed-${jobId}`; + const assumedDefaultDatafeedId = jobIds.map((v) => `datafeed-${v}`).join(','); try { const { body: { datafeeds: datafeedsResults }, @@ -194,12 +210,22 @@ export function datafeedsProvider(client: IScopedClusterClient, mlClient: MlClie datafeed_id: assumedDefaultDatafeedId, ...(excludeGenerated ? { exclude_generated: true } : {}), }); - if ( - Array.isArray(datafeedsResults) && - datafeedsResults.length === 1 && - datafeedsResults[0].job_id === jobId - ) { - return datafeedsResults[0]; + if (Array.isArray(datafeedsResults)) { + const result = datafeedsResults.filter((d) => jobIds.includes(d.job_id)); + + if (typeof jobId === 'string') { + if (datafeedsResults.length === 1 && datafeedsResults[0].job_id === jobId) { + return datafeedsResults[0]; + } else { + return await findDatafeed(); + } + } + + if (result.length === jobIds.length) { + return datafeedsResults; + } else { + return await findDatafeed(); + } } else { return await findDatafeed(); } diff --git a/x-pack/plugins/ml/server/routes/alerting.ts b/x-pack/plugins/ml/server/routes/alerting.ts index a268a5200b35e..15b7fb6fb4e96 100644 --- a/x-pack/plugins/ml/server/routes/alerting.ts +++ b/x-pack/plugins/ml/server/routes/alerting.ts @@ -9,6 +9,7 @@ import { RouteInitialization } from '../types'; import { wrapError } from '../client/error_wrapper'; import { alertingServiceProvider } from '../lib/alerts/alerting_service'; import { mlAnomalyDetectionAlertPreviewRequest } from './schemas/alerting_schema'; +import { datafeedsProvider } from '../models/job_service/datafeeds'; export function alertingRoutes({ router, routeGuard }: RouteInitialization) { /** @@ -32,7 +33,10 @@ export function alertingRoutes({ router, routeGuard }: RouteInitialization) { }, routeGuard.fullLicenseAPIGuard(async ({ mlClient, request, response, client }) => { try { - const alertingService = alertingServiceProvider(mlClient, client.asInternalUser); + const alertingService = alertingServiceProvider( + mlClient, + datafeedsProvider(client, mlClient) + ); const result = await alertingService.preview(request.body); diff --git a/x-pack/plugins/ml/server/routes/schemas/alerting_schema.ts b/x-pack/plugins/ml/server/routes/schemas/alerting_schema.ts index faf70f42e427e..df22ccfe20821 100644 --- a/x-pack/plugins/ml/server/routes/schemas/alerting_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/alerting_schema.ts @@ -26,13 +26,19 @@ export const mlAnomalyDetectionAlertParams = schema.object({ }, } ), - severity: schema.number(), + /** Anomaly score threshold */ + severity: schema.number({ min: 0, max: 100 }), + /** Result type to alert upon */ resultType: schema.oneOf([ schema.literal(ANOMALY_RESULT_TYPE.RECORD), schema.literal(ANOMALY_RESULT_TYPE.BUCKET), schema.literal(ANOMALY_RESULT_TYPE.INFLUENCER), ]), includeInterim: schema.boolean({ defaultValue: true }), + /** User's override for the lookback interval */ + lookbackInterval: schema.nullable(schema.string()), + /** User's override for the top N buckets */ + topNBuckets: schema.nullable(schema.number({ min: 1 })), }); export const mlAnomalyDetectionAlertPreviewRequest = schema.object({ diff --git a/x-pack/plugins/ml/server/shared_services/providers/alerting_service.ts b/x-pack/plugins/ml/server/shared_services/providers/alerting_service.ts index cbe22478e12d6..fa08cdf81fe1c 100644 --- a/x-pack/plugins/ml/server/shared_services/providers/alerting_service.ts +++ b/x-pack/plugins/ml/server/shared_services/providers/alerting_service.ts @@ -8,6 +8,7 @@ import { KibanaRequest, SavedObjectsClientContract } from 'kibana/server'; import { GetGuards } from '../shared_services'; import { alertingServiceProvider, MlAlertingService } from '../../lib/alerts/alerting_service'; +import { datafeedsProvider } from '../../models/job_service/datafeeds'; export function getAlertingServiceProvider(getGuards: GetGuards) { return { @@ -21,7 +22,9 @@ export function getAlertingServiceProvider(getGuards: GetGuards) { .isFullLicense() .hasMlCapabilities(['canGetJobs']) .ok(({ mlClient, scopedClient }) => - alertingServiceProvider(mlClient, scopedClient.asInternalUser).preview(...args) + alertingServiceProvider(mlClient, datafeedsProvider(scopedClient, mlClient)).preview( + ...args + ) ); }, execute: async ( @@ -31,7 +34,9 @@ export function getAlertingServiceProvider(getGuards: GetGuards) { .isFullLicense() .hasMlCapabilities(['canGetJobs']) .ok(({ mlClient, scopedClient }) => - alertingServiceProvider(mlClient, scopedClient.asInternalUser).execute(...args) + alertingServiceProvider(mlClient, datafeedsProvider(scopedClient, mlClient)).execute( + ...args + ) ); }, }; diff --git a/x-pack/test/functional/services/ml/alerting.ts b/x-pack/test/functional/services/ml/alerting.ts index 82f6a86d09199..8d27a75b7b485 100644 --- a/x-pack/test/functional/services/ml/alerting.ts +++ b/x-pack/test/functional/services/ml/alerting.ts @@ -16,6 +16,7 @@ export function MachineLearningAlertingProvider( const retry = getService('retry'); const comboBox = getService('comboBox'); const testSubjects = getService('testSubjects'); + const find = getService('find'); return { async selectAnomalyDetectionAlertType() { @@ -100,5 +101,47 @@ export function MachineLearningAlertingProvider( await testSubjects.existOrFail(`mlAnomalyAlertPreviewCallout`); }); }, + + async assertLookbackInterval(expectedValue: string) { + const actualValue = await testSubjects.getAttribute( + 'mlAnomalyAlertLookbackInterval', + 'value' + ); + expect(actualValue).to.eql( + expectedValue, + `Expected lookback interval to equal ${expectedValue}, got ${actualValue}` + ); + }, + + async assertTopNBuckets(expectedNumberOfBuckets: number) { + const actualValue = await testSubjects.getAttribute('mlAnomalyAlertTopNBuckets', 'value'); + expect(actualValue).to.eql( + expectedNumberOfBuckets, + `Expected number of buckets to equal ${expectedNumberOfBuckets}, got ${actualValue}` + ); + }, + + async setLookbackInterval(interval: string) { + await this.ensureAdvancedSectionOpen(); + await testSubjects.setValue('mlAnomalyAlertLookbackInterval', interval); + await this.assertLookbackInterval(interval); + }, + + async setTopNBuckets(numberOfBuckets: number) { + await this.ensureAdvancedSectionOpen(); + await testSubjects.setValue('mlAnomalyAlertTopNBuckets', numberOfBuckets.toString()); + await this.assertTopNBuckets(numberOfBuckets); + }, + + async ensureAdvancedSectionOpen() { + await retry.tryForTime(5000, async () => { + const isVisible = await find.existsByDisplayedByCssSelector( + '#mlAnomalyAlertAdvancedSettings' + ); + if (!isVisible) { + await testSubjects.click('mlAnomalyAlertAdvancedSettingsTrigger'); + } + }); + }, }; } diff --git a/x-pack/test/functional_with_es_ssl/apps/ml/alert_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/ml/alert_flyout.ts index 8fcf8be9fa493..cc0dcff528663 100644 --- a/x-pack/test/functional_with_es_ssl/apps/ml/alert_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/ml/alert_flyout.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { Datafeed } from '@elastic/elasticsearch/api/types'; import { FtrProviderContext } from '../../ftr_provider_context'; import { DATAFEED_STATE } from '../../../../plugins/ml/common/constants/states'; @@ -39,7 +40,7 @@ function createTestJobAndDatafeed() { categorization_examples_limit: 4, }, }, - datafeed: { + datafeed: ({ datafeed_id: `datafeed-${jobId}`, job_id: jobId, query: { @@ -53,8 +54,9 @@ function createTestJobAndDatafeed() { must_not: [], }, }, + query_delay: '120s', indices: ['ft_ecommerce'], - }, + } as unknown) as Datafeed, }; } @@ -83,7 +85,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { // @ts-expect-error not full interface await ml.api.createAnomalyDetectionJob(job); await ml.api.openAnomalyDetectionJob(job.job_id); - // @ts-expect-error not full interface await ml.api.createDatafeed(datafeed); await ml.api.startDatafeed(datafeed.datafeed_id); await ml.api.waitForDatafeedState(datafeed.datafeed_id, DATAFEED_STATE.STARTED); @@ -109,6 +110,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await ml.alerting.selectResultType('record'); await ml.alerting.setSeverity(10); + await ml.testExecution.logTestStep('should populate advanced settings with default values'); + await ml.alerting.assertTopNBuckets(1); + await ml.alerting.assertLookbackInterval('123m'); + await ml.testExecution.logTestStep('should preview the alert condition'); await ml.alerting.assertPreviewButtonState(false); await ml.alerting.setTestInterval('2y'); From 9ae605af93dbf5aebb891258bb32f0b0007bbaf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Tue, 20 Apr 2021 11:22:14 +0200 Subject: [PATCH 78/82] [Logs UI] Display and query runtime fields from KIPs in the log stream and entry flyout (#97467) This enhances the queries such that they pass runtime fields defined on Kibana index patterns as `runtime_mappings` in the log entry search strategies. --- .../common/dependency_mocks/index_patterns.ts | 100 ++++++++++++++++++ .../resolved_log_source_configuration.ts | 36 ++++++- .../utils/logs_overview_fetches.test.ts | 37 ++++++- .../log_entries/kibana_log_entries_adapter.ts | 2 + .../log_entries_search_strategy.test.ts | 46 +++++++- .../log_entries_search_strategy.ts | 3 +- .../log_entry_search_strategy.test.ts | 69 ++++++++++-- .../log_entries/log_entry_search_strategy.ts | 10 +- .../server/services/log_entries/mocks.ts | 37 ------- .../log_entries/queries/log_entries.ts | 2 + .../services/log_entries/queries/log_entry.ts | 4 +- 11 files changed, 291 insertions(+), 55 deletions(-) create mode 100644 x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts delete mode 100644 x-pack/plugins/infra/server/services/log_entries/mocks.ts diff --git a/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts b/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts new file mode 100644 index 0000000000000..14215c1539473 --- /dev/null +++ b/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { from, of } from 'rxjs'; +import { delay } from 'rxjs/operators'; +import { + fieldList, + FieldSpec, + IIndexPattern, + IndexPattern, + IndexPatternsContract, + RuntimeField, +} from 'src/plugins/data/common'; + +type IndexPatternMock = Pick< + IndexPattern, + | 'fields' + | 'getComputedFields' + | 'getFieldByName' + | 'getTimeField' + | 'id' + | 'isTimeBased' + | 'title' + | 'type' +>; +type IndexPatternMockSpec = Pick & { + fields: FieldSpec[]; +}; + +export const createIndexPatternMock = ({ + id, + title, + type = undefined, + fields, + timeFieldName, +}: IndexPatternMockSpec): IndexPatternMock => { + const indexPatternFieldList = fieldList(fields); + + return { + id, + title, + type, + fields: indexPatternFieldList, + getTimeField: () => indexPatternFieldList.find(({ name }) => name === timeFieldName), + isTimeBased: () => timeFieldName != null, + getFieldByName: (fieldName) => indexPatternFieldList.find(({ name }) => name === fieldName), + getComputedFields: () => ({ + runtimeFields: indexPatternFieldList.reduce>( + (accumulatedFields, { name, runtimeField }) => ({ + ...accumulatedFields, + ...(runtimeField != null + ? { + [name]: runtimeField, + } + : {}), + }), + {} + ), + scriptFields: {}, + storedFields: [], + docvalueFields: [], + }), + }; +}; + +export const createIndexPatternsMock = ( + asyncDelay: number, + indexPatterns: IndexPatternMock[] +): { + getIdsWithTitle: IndexPatternsContract['getIdsWithTitle']; + get: (...args: Parameters) => Promise; +} => { + return { + async getIdsWithTitle(_refresh?: boolean) { + const indexPatterns$ = of( + indexPatterns.map(({ id = 'unknown_id', title }) => ({ id, title })) + ); + return await indexPatterns$.pipe(delay(asyncDelay)).toPromise(); + }, + async get(indexPatternId: string) { + const indexPatterns$ = from( + indexPatterns.filter((indexPattern) => indexPattern.id === indexPatternId) + ); + return await indexPatterns$.pipe(delay(asyncDelay)).toPromise(); + }, + }; +}; + +export const createIndexPatternsStartMock = ( + asyncDelay: number, + indexPatterns: IndexPatternMock[] +): any => { + return { + indexPatternsServiceFactory: async () => createIndexPatternsMock(asyncDelay, indexPatterns), + }; +}; diff --git a/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts b/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts index 8bc7eee7d4eb6..daac7f6a138eb 100644 --- a/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts +++ b/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts @@ -5,11 +5,13 @@ * 2.0. */ +import { estypes } from '@elastic/elasticsearch'; +import { IndexPattern, IndexPatternsContract } from '../../../../../src/plugins/data/common'; +import { ObjectEntries } from '../utility_types'; import { - LogSourceConfigurationProperties, LogSourceColumnConfiguration, + LogSourceConfigurationProperties, } from './log_source_configuration'; -import { IndexPatternsContract, IndexPattern } from '../../../../../src/plugins/data/common'; export interface ResolvedLogSourceConfiguration { name: string; @@ -19,6 +21,7 @@ export interface ResolvedLogSourceConfiguration { tiebreakerField: string; messageField: string[]; fields: IndexPattern['fields']; + runtimeMappings: estypes.RuntimeFields; columns: LogSourceColumnConfiguration[]; } @@ -52,6 +55,7 @@ const resolveLegacyReference = async ( tiebreakerField: sourceConfiguration.fields.tiebreaker, messageField: sourceConfiguration.fields.message, fields, + runtimeMappings: {}, columns: sourceConfiguration.logColumns, name: sourceConfiguration.name, description: sourceConfiguration.description, @@ -76,8 +80,36 @@ const resolveKibanaIndexPatternReference = async ( tiebreakerField: '_doc', messageField: ['message'], fields: indexPattern.fields, + runtimeMappings: resolveRuntimeMappings(indexPattern), columns: sourceConfiguration.logColumns, name: sourceConfiguration.name, description: sourceConfiguration.description, }; }; + +// this might take other sources of runtime fields into account in the future +const resolveRuntimeMappings = (indexPattern: IndexPattern): estypes.RuntimeFields => { + const { runtimeFields } = indexPattern.getComputedFields(); + + const runtimeMappingsFromIndexPattern = (Object.entries(runtimeFields) as ObjectEntries< + typeof runtimeFields + >).reduce( + (accumulatedMappings, [runtimeFieldName, runtimeFieldSpec]) => ({ + ...accumulatedMappings, + [runtimeFieldName]: { + type: runtimeFieldSpec.type, + ...(runtimeFieldSpec.script != null + ? { + script: { + lang: 'painless', // required in the es types + source: runtimeFieldSpec.script.source, + }, + } + : {}), + }, + }), + {} + ); + + return runtimeMappingsFromIndexPattern; +}; diff --git a/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts b/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts index 3d08d4fc270bc..8d51f54e3f55a 100644 --- a/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts +++ b/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts @@ -8,11 +8,12 @@ import { CoreStart } from 'kibana/public'; import { coreMock } from 'src/core/public/mocks'; import { dataPluginMock } from 'src/plugins/data/public/mocks'; -import { callFetchLogSourceStatusAPI } from '../containers/logs/log_source/api/fetch_log_source_status'; +import { createIndexPatternMock } from '../../common/dependency_mocks/index_patterns'; +import { GetLogSourceConfigurationSuccessResponsePayload } from '../../common/http_api/log_sources/get_log_source_configuration'; import { callFetchLogSourceConfigurationAPI } from '../containers/logs/log_source/api/fetch_log_source_configuration'; +import { callFetchLogSourceStatusAPI } from '../containers/logs/log_source/api/fetch_log_source_status'; import { InfraClientStartDeps, InfraClientStartExports } from '../types'; import { getLogsHasDataFetcher, getLogsOverviewDataFetcher } from './logs_overview_fetchers'; -import { GetLogSourceConfigurationSuccessResponsePayload } from '../../common/http_api/log_sources/get_log_source_configuration'; jest.mock('../containers/logs/log_source/api/fetch_log_source_status'); const mockedCallFetchLogSourceStatusAPI = callFetchLogSourceStatusAPI as jest.MockedFunction< @@ -41,6 +42,36 @@ function setup() { // const dataResponder = jest.fn(); + (data.indexPatterns.get as jest.Mock).mockResolvedValue( + createIndexPatternMock({ + id: 'test-index-pattern', + title: 'log-indices-*', + timeFieldName: '@timestamp', + fields: [ + { + name: 'event.dataset', + type: 'string', + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + }, + { + name: 'runtime_field', + type: 'string', + runtimeField: { + type: 'keyword', + script: { + source: 'emit("runtime value")', + }, + }, + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + }, + ], + }) + ); + (data.search.search as jest.Mock).mockReturnValue({ subscribe: (progress: Function, error: Function, finish: Function) => { progress(dataResponder()); @@ -114,7 +145,7 @@ describe('Logs UI Observability Homepage Functions', () => { configuration: { logIndices: { type: 'index_pattern', - indexPatternId: 'some-test-id', + indexPatternId: 'test-index-pattern', }, fields: { timestamp: '@timestamp', tiebreaker: '_doc' }, }, diff --git a/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts b/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts index 33df2b4d55d22..3aaa747b945a8 100644 --- a/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts +++ b/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts @@ -93,6 +93,7 @@ export class InfraKibanaLogEntriesAdapter implements LogEntriesAdapter { ], }, }, + runtime_mappings: resolvedLogSourceConfiguration.runtimeMappings, sort, ...highlightClause, ...searchAfterClause, @@ -182,6 +183,7 @@ export class InfraKibanaLogEntriesAdapter implements LogEntriesAdapter { ], }, }, + runtime_mappings: resolvedLogSourceConfiguration.runtimeMappings, size: 0, track_total_hits: false, }, diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.test.ts b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.test.ts index 7c7417d038e2e..3cda019359caf 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.test.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.test.ts @@ -19,13 +19,16 @@ import { SearchStrategyDependencies, } from 'src/plugins/data/server'; import { createSearchSessionsClientMock } from '../../../../../../src/plugins/data/server/search/mocks'; +import { + createIndexPatternMock, + createIndexPatternsStartMock, +} from '../../../common/dependency_mocks/index_patterns'; import { InfraSource } from '../../lib/sources'; import { createInfraSourcesMock } from '../../lib/sources/mocks'; import { logEntriesSearchRequestStateRT, logEntriesSearchStrategyProvider, } from './log_entries_search_strategy'; -import { getIndexPatternsMock } from './mocks'; describe('LogEntries search strategy', () => { it('handles initial search requests', async () => { @@ -72,6 +75,15 @@ describe('LogEntries search strategy', () => { index: 'log-indices-*', body: expect.objectContaining({ fields: expect.arrayContaining(['event.dataset', 'message']), + runtime_mappings: { + runtime_field: { + type: 'keyword', + script: { + lang: 'painless', + source: 'emit("runtime value")', + }, + }, + }, }), }), }), @@ -258,7 +270,7 @@ const createSourceConfigurationMock = (): InfraSource => ({ description: 'SOURCE_DESCRIPTION', logIndices: { type: 'index_pattern', - indexPatternId: 'some-test-id', + indexPatternId: 'test-index-pattern', }, metricAlias: 'metric-indices-*', inventoryDefaultView: 'DEFAULT_VIEW', @@ -323,5 +335,33 @@ const createDataPluginMock = (esSearchStrategyMock: ISearchStrategy): any => ({ search: { getSearchStrategy: jest.fn().mockReturnValue(esSearchStrategyMock), }, - indexPatterns: getIndexPatternsMock(), + indexPatterns: createIndexPatternsStartMock(0, [ + createIndexPatternMock({ + id: 'test-index-pattern', + title: 'log-indices-*', + timeFieldName: '@timestamp', + fields: [ + { + name: 'event.dataset', + type: 'string', + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + }, + { + name: 'runtime_field', + type: 'string', + runtimeField: { + type: 'keyword', + script: { + source: 'emit("runtime value")', + }, + }, + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + }, + ], + }), + ]), }); diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts index fc5dab9006df6..c47a1c163f9ec 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts @@ -109,7 +109,7 @@ export const logEntriesSearchStrategyProvider = ({ forkJoin([resolvedSourceConfiguration$, messageFormattingRules$]).pipe( map( ([ - { indices, timestampField, tiebreakerField, columns }, + { indices, timestampField, tiebreakerField, columns, runtimeMappings }, messageFormattingRules, ]): IEsSearchRequest => { return { @@ -123,6 +123,7 @@ export const logEntriesSearchStrategyProvider = ({ timestampField, tiebreakerField, getRequiredFields(params.columns ?? columns, messageFormattingRules), + runtimeMappings, params.query, params.highlightPhrase ), diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.test.ts b/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.test.ts index 785a4414a984c..f220c8913a2e6 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.test.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.test.ts @@ -18,14 +18,17 @@ import { ISearchStrategy, SearchStrategyDependencies, } from 'src/plugins/data/server'; -import { getIndexPatternsMock } from './mocks'; +import { createSearchSessionsClientMock } from '../../../../../../src/plugins/data/server/search/mocks'; +import { + createIndexPatternMock, + createIndexPatternsStartMock, +} from '../../../common/dependency_mocks/index_patterns'; +import { InfraSource } from '../../../common/source_configuration/source_configuration'; import { createInfraSourcesMock } from '../../lib/sources/mocks'; import { logEntrySearchRequestStateRT, logEntrySearchStrategyProvider, } from './log_entry_search_strategy'; -import { createSearchSessionsClientMock } from '../../../../../../src/plugins/data/server/search/mocks'; -import { InfraSource } from '../../../common/source_configuration/source_configuration'; describe('LogEntry search strategy', () => { it('handles initial search requests', async () => { @@ -61,7 +64,33 @@ describe('LogEntry search strategy', () => { .toPromise(); expect(sourcesMock.getSourceConfiguration).toHaveBeenCalled(); - expect(esSearchStrategyMock.search).toHaveBeenCalled(); + expect(esSearchStrategyMock.search).toHaveBeenCalledWith( + { + params: expect.objectContaining({ + index: 'log-indices-*', + body: expect.objectContaining({ + query: { + ids: { + values: ['LOG_ENTRY_ID'], + }, + }, + runtime_mappings: { + runtime_field: { + type: 'keyword', + script: { + lang: 'painless', + source: 'emit("runtime value")', + }, + }, + }, + }), + terminate_after: 1, + track_total_hits: false, + }), + }, + expect.anything(), + expect.anything() + ); expect(response.id).toEqual(expect.any(String)); expect(response.isRunning).toBe(true); }); @@ -207,7 +236,7 @@ const createSourceConfigurationMock = (): InfraSource => ({ description: 'SOURCE_DESCRIPTION', logIndices: { type: 'index_pattern', - indexPatternId: 'some-test-id', + indexPatternId: 'test-index-pattern', }, metricAlias: 'metric-indices-*', inventoryDefaultView: 'DEFAULT_VIEW', @@ -261,5 +290,33 @@ const createDataPluginMock = (esSearchStrategyMock: ISearchStrategy): any => ({ search: { getSearchStrategy: jest.fn().mockReturnValue(esSearchStrategyMock), }, - indexPatterns: getIndexPatternsMock(), + indexPatterns: createIndexPatternsStartMock(0, [ + createIndexPatternMock({ + id: 'test-index-pattern', + title: 'log-indices-*', + timeFieldName: '@timestamp', + fields: [ + { + name: 'event.dataset', + type: 'string', + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + }, + { + name: 'runtime_field', + type: 'string', + runtimeField: { + type: 'keyword', + script: { + source: 'emit("runtime value")', + }, + }, + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + }, + ], + }), + ]), }); diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts b/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts index c35c05d947da0..aa34204b9fb44 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts @@ -78,13 +78,19 @@ export const logEntrySearchStrategyProvider = ({ concatMap(({ params }) => resolvedSourceConfiguration$.pipe( map( - ({ indices, timestampField, tiebreakerField }): IEsSearchRequest => ({ + ({ + indices, + timestampField, + tiebreakerField, + runtimeMappings, + }): IEsSearchRequest => ({ // @ts-expect-error @elastic/elasticsearch declares indices_boost as Record params: createGetLogEntryQuery( indices, params.logEntryId, timestampField, - tiebreakerField + tiebreakerField, + runtimeMappings ), }) ) diff --git a/x-pack/plugins/infra/server/services/log_entries/mocks.ts b/x-pack/plugins/infra/server/services/log_entries/mocks.ts deleted file mode 100644 index 7c508b98554ec..0000000000000 --- a/x-pack/plugins/infra/server/services/log_entries/mocks.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { IIndexPattern, IFieldType, IndexPatternsContract } from 'src/plugins/data/common'; - -const indexPatternFields: IFieldType[] = [ - { - name: 'event.dataset', - type: 'string', - esTypes: ['keyword'], - aggregatable: true, - filterable: true, - searchable: true, - }, -]; - -const indexPattern: IIndexPattern = { - id: '1234', - title: 'log-indices-*', - timeFieldName: '@timestamp', - fields: indexPatternFields, -}; - -export const getIndexPatternsMock = (): any => { - return { - indexPatternsServiceFactory: async () => { - return { - get: async (id) => indexPattern, - getFieldsForWildcard: async (options) => indexPatternFields, - } as Pick; - }, - }; -}; diff --git a/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts b/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts index 6ae7232d77a17..6df17dbfd7bfd 100644 --- a/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts +++ b/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts @@ -29,6 +29,7 @@ export const createGetLogEntriesQuery = ( timestampField: string, tiebreakerField: string, fields: string[], + runtimeMappings?: estypes.RuntimeFields, query?: JsonObject, highlightTerm?: string ): estypes.AsyncSearchSubmitRequest => { @@ -53,6 +54,7 @@ export const createGetLogEntriesQuery = ( }, // @ts-expect-error @elastic/elasticsearch doesn't declare body.fields on AsyncSearchSubmitRequest fields, + runtime_mappings: runtimeMappings, _source: false, ...createSortClause(sortDirection, timestampField, tiebreakerField), ...createSearchAfterClause(cursor), diff --git a/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts b/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts index 85af8b92fe080..6bef317d96ada 100644 --- a/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts +++ b/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts @@ -17,7 +17,8 @@ export const createGetLogEntryQuery = ( logEntryIndex: string, logEntryId: string, timestampField: string, - tiebreakerField: string + tiebreakerField: string, + runtimeMappings?: estypes.RuntimeFields ): estypes.AsyncSearchSubmitRequest => ({ index: logEntryIndex, terminate_after: 1, @@ -32,6 +33,7 @@ export const createGetLogEntryQuery = ( }, // @ts-expect-error @elastic/elasticsearch doesn't declare body.fields on AsyncSearchSubmitRequest fields: ['*'], + runtime_mappings: runtimeMappings, sort: [{ [timestampField]: 'desc' }, { [tiebreakerField]: 'desc' }], _source: false, }, From e4bbdda1297d4172edb14c8d0f9fe7ee043b7515 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 20 Apr 2021 10:30:30 +0100 Subject: [PATCH 79/82] use smaller piece of mock data (#96953) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apis/security_solution/kpi_hosts.ts | 349 +- .../es_archives/auditbeat/default/data.json | 110231 +++++++++++++++ .../es_archives/auditbeat/kpi_hosts/data.json | 194 + .../auditbeat/kpi_hosts/mappings.json | 1903 + .../es_archives/filebeat/kpi_hosts/data.json | 133 + .../filebeat/kpi_hosts/mappings.json | 5940 + 6 files changed, 118564 insertions(+), 186 deletions(-) create mode 100644 x-pack/test/functional/es_archives/auditbeat/default/data.json create mode 100644 x-pack/test/functional/es_archives/auditbeat/kpi_hosts/data.json create mode 100644 x-pack/test/functional/es_archives/auditbeat/kpi_hosts/mappings.json create mode 100644 x-pack/test/functional/es_archives/filebeat/kpi_hosts/data.json create mode 100644 x-pack/test/functional/es_archives/filebeat/kpi_hosts/mappings.json diff --git a/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts b/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts index f2e597912c4e1..ff395f056354e 100644 --- a/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts +++ b/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts @@ -10,13 +10,14 @@ import { HostsKpiQueries } from '../../../../plugins/security_solution/common/se import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { + const retry = getService('retry'); const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); describe('Kpi Hosts', () => { describe('With filebeat', () => { - before(() => esArchiver.load('filebeat/default')); - after(() => esArchiver.unload('filebeat/default')); + before(() => esArchiver.load('filebeat/kpi_hosts')); + after(() => esArchiver.unload('filebeat/kpi_hosts')); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -24,19 +25,7 @@ export default function ({ getService }: FtrProviderContext) { hosts: 1, hostsHistogram: [ { - x: new Date('2019-02-09T16:00:00.000Z').valueOf(), - y: 1, - }, - { - x: new Date('2019-02-09T19:00:00.000Z').valueOf(), - y: 0, - }, - { - x: new Date('2019-02-09T22:00:00.000Z').valueOf(), - y: 1, - }, - { - x: new Date('2019-02-10T01:00:00.000Z').valueOf(), + x: new Date('2019-02-09T16:45:06.000Z').valueOf(), y: 1, }, ], @@ -44,246 +33,234 @@ export default function ({ getService }: FtrProviderContext) { authSuccessHistogram: null, authFailure: 0, authFailureHistogram: null, - uniqueSourceIps: 121, + uniqueSourceIps: 1, uniqueSourceIpsHistogram: [ { - x: new Date('2019-02-09T16:00:00.000Z').valueOf(), - y: 52, - }, - { - x: new Date('2019-02-09T19:00:00.000Z').valueOf(), - y: 0, - }, - { - x: new Date('2019-02-09T22:00:00.000Z').valueOf(), - y: 31, - }, - { - x: new Date('2019-02-10T01:00:00.000Z').valueOf(), - y: 88, + x: new Date('2019-02-09T16:45:06.000Z').valueOf(), + y: 1, }, ], - uniqueDestinationIps: 154, + uniqueDestinationIps: 1, uniqueDestinationIpsHistogram: [ { - x: new Date('2019-02-09T16:00:00.000Z').valueOf(), - y: 61, - }, - { - x: new Date('2019-02-09T19:00:00.000Z').valueOf(), - y: 0, - }, - { - x: new Date('2019-02-09T22:00:00.000Z').valueOf(), - y: 45, - }, - { - x: new Date('2019-02-10T01:00:00.000Z').valueOf(), - y: 114, + x: new Date('2019-02-09T16:45:06.000Z').valueOf(), + y: 1, }, ], }; it('Make sure that we get KpiHosts data', async () => { - const { body: kpiHosts } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiHosts, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['filebeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + await retry.try(async () => { + const { body: kpiHosts } = await supertest + .post('/internal/search/securitySolutionSearchStrategy/') + .set('kbn-xsrf', 'true') + .send({ + factoryQueryType: HostsKpiQueries.kpiHosts, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['filebeat-*'], + docValueFields: [], + inspect: false, + wait_for_completion_timeout: '10s', + }) + .expect(200); - expect(kpiHosts.hostsHistogram!).to.eql(expectedResult.hostsHistogram); - expect(kpiHosts.hosts!).to.eql(expectedResult.hosts); + expect(kpiHosts.hostsHistogram!).to.eql(expectedResult.hostsHistogram); + expect(kpiHosts.hosts!).to.eql(expectedResult.hosts); + }); }); it('Make sure that we get KpiAuthentications data', async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiAuthentications, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['filebeat-*'], - docValueFields: [], - inspect: false, - /* We need a very long timeout to avoid returning just partial data. - ** https://github.com/elastic/kibana/blob/master/x-pack/test/api_integration/apis/search/search.ts#L18 - */ - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.authenticationsSuccess!).to.eql(expectedResult.authSuccess); - expect(body.authenticationsSuccessHistogram!).to.eql(expectedResult.authSuccessHistogram); - expect(body.authenticationsFailure!).to.eql(expectedResult.authFailure); - expect(body.authenticationsFailureHistogram!).to.eql(expectedResult.authFailureHistogram); + await retry.try(async () => { + const { body } = await supertest + .post('/internal/search/securitySolutionSearchStrategy/') + .set('kbn-xsrf', 'true') + .send({ + factoryQueryType: HostsKpiQueries.kpiAuthentications, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['filebeat-*'], + docValueFields: [], + inspect: false, + /* We need a very long timeout to avoid returning just partial data. + ** https://github.com/elastic/kibana/blob/master/x-pack/test/api_integration/apis/search/search.ts#L18 + */ + wait_for_completion_timeout: '10s', + }) + .expect(200); + expect(body.authenticationsSuccess!).to.eql(expectedResult.authSuccess); + expect(body.authenticationsSuccessHistogram!).to.eql(expectedResult.authSuccessHistogram); + expect(body.authenticationsFailure!).to.eql(expectedResult.authFailure); + expect(body.authenticationsFailureHistogram!).to.eql(expectedResult.authFailureHistogram); + }); }); it('Make sure that we get KpiUniqueIps data', async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiUniqueIps, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['filebeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); - expect(body.uniqueDestinationIpsHistogram!).to.eql( - expectedResult.uniqueDestinationIpsHistogram - ); - expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); - expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); + await retry.try(async () => { + const { body } = await supertest + .post('/internal/search/securitySolutionSearchStrategy/') + .set('kbn-xsrf', 'true') + .send({ + factoryQueryType: HostsKpiQueries.kpiUniqueIps, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['filebeat-*'], + docValueFields: [], + inspect: false, + wait_for_completion_timeout: '10s', + }) + .expect(200); + expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); + expect(body.uniqueDestinationIpsHistogram!).to.eql( + expectedResult.uniqueDestinationIpsHistogram + ); + expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); + expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); + }); }); }); describe('With auditbeat', () => { - before(() => esArchiver.load('auditbeat/default')); - after(() => esArchiver.unload('auditbeat/default')); + before(() => esArchiver.load('auditbeat/kpi_hosts')); + after(() => esArchiver.unload('auditbeat/kpi_hosts')); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; const expectedResult = { - hosts: 6, + hosts: 3, hostsHistogram: [ { x: new Date('2018-11-27T00:00:00.000Z').valueOf(), - y: 6, + y: 1, }, { x: new Date('2018-11-27T00:30:00.000Z').valueOf(), - y: 6, + y: 0, }, { x: new Date('2018-11-27T01:00:00.000Z').valueOf(), - y: 6, + y: 0, }, { x: new Date('2018-11-27T01:30:00.000Z').valueOf(), - y: 6, + y: 0, }, { x: new Date('2018-11-27T02:00:00.000Z').valueOf(), - y: 6, + y: 1, }, { x: new Date('2018-11-27T02:30:00.000Z').valueOf(), - y: 6, + y: 1, }, ], authSuccess: 0, authSuccessHistogram: null, authFailure: 0, authFailureHistogram: null, - uniqueSourceIps: 370, + uniqueSourceIps: 3, uniqueSourceIpsHistogram: [ - { x: 1543276800000, y: 74 }, - { x: 1543278600000, y: 52 }, - { x: 1543280400000, y: 71 }, - { x: 1543282200000, y: 76 }, - { x: 1543284000000, y: 71 }, - { x: 1543285800000, y: 89 }, + { x: 1543276800000, y: 1 }, + { x: 1543278600000, y: 0 }, + { x: 1543280400000, y: 0 }, + { x: 1543282200000, y: 0 }, + { x: 1543284000000, y: 1 }, + { x: 1543285800000, y: 1 }, ], - uniqueDestinationIps: 1, + uniqueDestinationIps: 0, uniqueDestinationIpsHistogram: [ { x: 1543276800000, y: 0 }, { x: 1543278600000, y: 0 }, { x: 1543280400000, y: 0 }, { x: 1543282200000, y: 0 }, { x: 1543284000000, y: 0 }, - { x: 1543285800000, y: 1 }, + { x: 1543285800000, y: 0 }, ], }; it('Make sure that we get KpiHosts data', async () => { - const { body: kpiHosts } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiHosts, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + await retry.try(async () => { + const { body: kpiHosts } = await supertest + .post('/internal/search/securitySolutionSearchStrategy/') + .set('kbn-xsrf', 'true') + .send({ + factoryQueryType: HostsKpiQueries.kpiHosts, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + wait_for_completion_timeout: '10s', + }) + .expect(200); - expect(kpiHosts.hostsHistogram!).to.eql(expectedResult.hostsHistogram); - expect(kpiHosts.hosts!).to.eql(expectedResult.hosts); + expect(kpiHosts.hostsHistogram!).to.eql(expectedResult.hostsHistogram); + expect(kpiHosts.hosts!).to.eql(expectedResult.hosts); + }); }); it('Make sure that we get KpiAuthentications data', async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiAuthentications, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.authenticationsSuccess!).to.eql(expectedResult.authSuccess); - expect(body.authenticationsSuccessHistogram!).to.eql(expectedResult.authSuccessHistogram); - expect(body.authenticationsFailure!).to.eql(expectedResult.authFailure); - expect(body.authenticationsFailureHistogram!).to.eql(expectedResult.authFailureHistogram); + await retry.try(async () => { + const { body } = await supertest + .post('/internal/search/securitySolutionSearchStrategy/') + .set('kbn-xsrf', 'true') + .send({ + factoryQueryType: HostsKpiQueries.kpiAuthentications, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + wait_for_completion_timeout: '10s', + }) + .expect(200); + expect(body.authenticationsSuccess!).to.eql(expectedResult.authSuccess); + expect(body.authenticationsSuccessHistogram!).to.eql(expectedResult.authSuccessHistogram); + expect(body.authenticationsFailure!).to.eql(expectedResult.authFailure); + expect(body.authenticationsFailureHistogram!).to.eql(expectedResult.authFailureHistogram); + }); }); it('Make sure that we get KpiUniqueIps data', async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiUniqueIps, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); - expect(body.uniqueDestinationIpsHistogram!).to.eql( - expectedResult.uniqueDestinationIpsHistogram - ); - expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); - expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); + await retry.try(async () => { + const { body } = await supertest + .post('/internal/search/securitySolutionSearchStrategy/') + .set('kbn-xsrf', 'true') + .send({ + factoryQueryType: HostsKpiQueries.kpiUniqueIps, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + wait_for_completion_timeout: '10s', + }) + .expect(200); + expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); + expect(body.uniqueDestinationIpsHistogram!).to.eql( + expectedResult.uniqueDestinationIpsHistogram + ); + expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); + expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); + }); }); }); }); diff --git a/x-pack/test/functional/es_archives/auditbeat/default/data.json b/x-pack/test/functional/es_archives/auditbeat/default/data.json new file mode 100644 index 0000000000000..b10f3cc73ec6a --- /dev/null +++ b/x-pack/test/functional/es_archives/auditbeat/default/data.json @@ -0,0 +1,110231 @@ +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Rs93UmcBTFzn_XoLWT6M", + "source": { + "@timestamp": "2018-11-27T00:00:11.544Z", + "process": { + "pid": "31964", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.87.213" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "128.199.87.213", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "128.199.87.213", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192383, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R893UmcBTFzn_XoLWT6M", + "source": { + "@timestamp": "2018-11-27T00:00:12.110Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31966", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.40.116.98" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "89.40.116.98", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192384, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SM93UmcBTFzn_XoLWT6M", + "source": { + "@timestamp": "2018-11-27T00:00:12.111Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31966", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.40.116.98" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "89.40.116.98", + "type": "user-session" + } + }, + "sequence": 192385, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Sc93UmcBTFzn_XoLWT6M", + "source": { + "@timestamp": "2018-11-27T00:00:12.224Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31966" + }, + "source": { + "ip": "89.40.116.98" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "sequence": 192386, + "result": "fail", + "session": "unset", + "data": { + "hostname": "89.40.116.98", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "89.40.116.98" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A89-UmcBTFzn_XoLj91w", + "source": { + "@timestamp": "2018-11-27T00:08:04.229Z", + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "187.188.146.35", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142249, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "187.188.146.35" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BM9-UmcBTFzn_XoLj91w", + "source": { + "@timestamp": "2018-11-27T00:08:04.231Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "187.188.146.35" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142250, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "187.188.146.35" + } + } + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Bc9-UmcBTFzn_XoLj91w", + "source": { + "@timestamp": "2018-11-27T00:08:04.295Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "187.188.146.35", + "type": "user-session" + } + }, + "sequence": 142251, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "187.188.146.35" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "187.188.146.35" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3M99UmcBTFzn_XoL9c8q", + "source": { + "@timestamp": "2018-11-27T00:07:24.736Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31771" + }, + "source": { + "ip": "185.66.213.116" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "185.66.213.116", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186194 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3c99UmcBTFzn_XoL9c8q", + "source": { + "@timestamp": "2018-11-27T00:07:24.738Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186195, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "185.66.213.116", + "type": "user-session", + "primary": "sshd" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31771", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "185.66.213.116" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3s99UmcBTFzn_XoL9c8q", + "source": { + "@timestamp": "2018-11-27T00:07:24.872Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31771", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.66.213.116" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "185.66.213.116", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 186196, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "185.66.213.116" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNCAUmcBTFzn_XoLVQS1", + "source": { + "@timestamp": "2018-11-27T00:10:00.521Z", + "source": { + "ip": "202.138.233.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142255, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "202.138.233.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19202", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cdCAUmcBTFzn_XoLVQS1", + "source": { + "@timestamp": "2018-11-27T00:10:00.523Z", + "process": { + "pid": "19202", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.138.233.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142256, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "202.138.233.92", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctCAUmcBTFzn_XoLVQS1", + "source": { + "@timestamp": "2018-11-27T00:10:00.758Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19202", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.138.233.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "202.138.233.92", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "202.138.233.92", + "type": "user-session" + } + }, + "sequence": 142257, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Lc9_UmcBTFzn_XoL2_og", + "source": { + "@timestamp": "2018-11-27T00:09:29.142Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "183.6.176.182" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "183.6.176.182" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142252, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19199", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ls9_UmcBTFzn_XoL2_og", + "source": { + "@timestamp": "2018-11-27T00:09:29.143Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142253, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "183.6.176.182" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19199", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "183.6.176.182" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "L89_UmcBTFzn_XoL2_og", + "source": { + "@timestamp": "2018-11-27T00:09:29.337Z", + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "183.6.176.182", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "183.6.176.182", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 142254 + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19199", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "183.6.176.182" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0c9_UmcBTFzn_XoL8Ptt", + "source": { + "@timestamp": "2018-11-27T00:09:34.595Z", + "source": { + "ip": "82.165.64.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "82.165.64.156", + "type": "user-session" + } + }, + "sequence": 186200, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31787" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0s9_UmcBTFzn_XoL8Ptt", + "source": { + "@timestamp": "2018-11-27T00:09:34.596Z", + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "82.165.64.156" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186201 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31787", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.165.64.156" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "089_UmcBTFzn_XoL8Ptt", + "source": { + "@timestamp": "2018-11-27T00:09:34.710Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31787", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.165.64.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "82.165.64.156", + "type": "user-session" + } + }, + "sequence": 186202, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "82.165.64.156", + "terminal": "ssh" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ns9_UmcBTFzn_XoLYe_m", + "source": { + "@timestamp": "2018-11-27T00:08:58.109Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31779", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186197, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "46.148.18.163" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n89_UmcBTFzn_XoLYe_m", + "source": { + "@timestamp": "2018-11-27T00:08:58.110Z", + "auditd": { + "sequence": 186198, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31779", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oM9_UmcBTFzn_XoLYe_m", + "source": { + "@timestamp": "2018-11-27T00:08:58.253Z", + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "46.148.18.163", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "46.148.18.163" + } + }, + "sequence": 186199, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31779", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hM-AUmcBTFzn_XoLEf64", + "source": { + "@timestamp": "2018-11-27T00:09:43.118Z", + "source": { + "ip": "74.208.43.208" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186203, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "74.208.43.208", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31789", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hc-AUmcBTFzn_XoLEf64", + "source": { + "@timestamp": "2018-11-27T00:09:43.119Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "74.208.43.208", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186204, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31789", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "74.208.43.208" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hs-AUmcBTFzn_XoLEf64", + "source": { + "@timestamp": "2018-11-27T00:09:43.146Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186205, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "74.208.43.208", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "74.208.43.208", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31789", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "74.208.43.208" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "m89-UmcBTFzn_XoL1OLk", + "source": { + "@timestamp": "2018-11-27T00:08:22.009Z", + "source": { + "ip": "201.75.60.100" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "201.75.60.100" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184237, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24759", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "nM9-UmcBTFzn_XoL1OLk", + "source": { + "@timestamp": "2018-11-27T00:08:22.011Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "24759", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.75.60.100" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184238, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "201.75.60.100", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "nc9-UmcBTFzn_XoL1OLk", + "source": { + "@timestamp": "2018-11-27T00:08:22.241Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24759" + }, + "source": { + "ip": "201.75.60.100" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184239, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "201.75.60.100" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "201.75.60.100", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Vc9_UmcBTFzn_XoLb_AH", + "source": { + "@timestamp": "2018-11-27T00:09:01.469Z", + "auditd": { + "session": "unset", + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184240, + "result": "success" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "24768", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Vs9_UmcBTFzn_XoLb_AH", + "source": { + "@timestamp": "2018-11-27T00:09:01.469Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "24768", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184241, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V89_UmcBTFzn_XoLb_AH", + "source": { + "@timestamp": "2018-11-27T00:09:01.471Z", + "user": { + "auid": "0", + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "pid": "24768", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "9854", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184243 + }, + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WM9_UmcBTFzn_XoLb_AH", + "source": { + "@timestamp": "2018-11-27T00:09:01.574Z", + "auditd": { + "result": "success", + "session": "9854", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184244 + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root", + "auid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "24768" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Wc9_UmcBTFzn_XoLb_AH", + "source": { + "@timestamp": "2018-11-27T00:09:01.575Z", + "auditd": { + "session": "9854", + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + }, + "sequence": 184245, + "result": "success" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "process": { + "pid": "24768", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W89_UmcBTFzn_XoLb_DG", + "source": { + "@timestamp": "2018-11-27T00:09:01.660Z", + "auditd": { + "sequence": 192396, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:accounting", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "32020" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XM9_UmcBTFzn_XoLb_DG", + "source": { + "@timestamp": "2018-11-27T00:09:01.660Z", + "auditd": { + "sequence": 192397, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "32020" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xc9_UmcBTFzn_XoLb_DG", + "source": { + "@timestamp": "2018-11-27T00:09:01.661Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "process": { + "pid": "32020", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "9858", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + }, + "sequence": 192399 + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xs9_UmcBTFzn_XoLb_DG", + "source": { + "@timestamp": "2018-11-27T00:09:01.756Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "32020", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 192400, + "result": "success", + "session": "9858" + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X89_UmcBTFzn_XoLb_DG", + "source": { + "@timestamp": "2018-11-27T00:09:01.757Z", + "auditd": { + "sequence": 192401, + "result": "success", + "session": "9858", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_end", + "action": "ended-session" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "32020", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tNCGUmcBTFzn_XoLwJHN", + "source": { + "@timestamp": "2018-11-27T00:17:01.150Z", + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28080", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 44083, + "result": "success", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tdCGUmcBTFzn_XoLwJHN", + "source": { + "@timestamp": "2018-11-27T00:17:01.150Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28080", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:accounting" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 44082 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ttCGUmcBTFzn_XoLwJHN", + "source": { + "@timestamp": "2018-11-27T00:17:01.150Z", + "process": { + "pid": "28080", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 44085, + "result": "success", + "session": "1442", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + } + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "t9CGUmcBTFzn_XoLwJHN", + "source": { + "@timestamp": "2018-11-27T00:17:01.154Z", + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "28080", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 44086, + "result": "success", + "session": "1442", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "uNCGUmcBTFzn_XoLwJHN", + "source": { + "@timestamp": "2018-11-27T00:17:01.154Z", + "auditd": { + "session": "1442", + "data": { + "op": "PAM:session_close", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 44087, + "result": "success" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "ended-session", + "module": "auditd", + "category": "user-login", + "type": "user_end" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28080", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "udCGUmcBTFzn_XoLwJHb", + "source": { + "@timestamp": "2018-11-27T00:17:01.168Z", + "auditd": { + "sequence": 142264, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19244", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "utCGUmcBTFzn_XoLwJHb", + "source": { + "@timestamp": "2018-11-27T00:17:01.169Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19244", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 142265, + "result": "success" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "u9CGUmcBTFzn_XoLwJHb", + "source": { + "@timestamp": "2018-11-27T00:17:01.171Z", + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "19244", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 142267, + "result": "success", + "session": "3502" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vNCGUmcBTFzn_XoLwJHb", + "source": { + "@timestamp": "2018-11-27T00:17:01.174Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "process": { + "pid": "19244", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "3502", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 142268, + "result": "success" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vdCGUmcBTFzn_XoLwJHb", + "source": { + "@timestamp": "2018-11-27T00:17:01.175Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_end", + "action": "ended-session" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root", + "auid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "19244", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + }, + "sequence": 142269, + "result": "success", + "session": "3502", + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + } + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vtCGUmcBTFzn_XoLwJH4", + "source": { + "@timestamp": "2018-11-27T00:17:01.195Z", + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12297", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:accounting" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43110, + "result": "success" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "v9CGUmcBTFzn_XoLwJH4", + "source": { + "@timestamp": "2018-11-27T00:17:01.195Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12297", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 43111, + "result": "success" + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wNCGUmcBTFzn_XoLwJH4", + "source": { + "@timestamp": "2018-11-27T00:17:01.195Z", + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "12297", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 43113, + "result": "success", + "session": "1251", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wdCGUmcBTFzn_XoLwJH4", + "source": { + "@timestamp": "2018-11-27T00:17:01.195Z", + "auditd": { + "session": "1251", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 43114, + "result": "success" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "12297", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wtCGUmcBTFzn_XoLwJH4", + "source": { + "@timestamp": "2018-11-27T00:17:01.199Z", + "process": { + "pid": "12297", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "1251", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_close" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 43115, + "result": "success" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_end", + "action": "ended-session" + }, + "user": { + "uid": "0", + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dCGUmcBTFzn_XoLwpF3", + "source": { + "@timestamp": "2018-11-27T00:17:01.580Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "was-authorized", + "module": "auditd", + "category": "user-login", + "type": "user_acct" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24860", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:accounting", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184252 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tCGUmcBTFzn_XoLwpF3", + "source": { + "@timestamp": "2018-11-27T00:17:01.581Z", + "process": { + "pid": "24860", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184253, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "29CGUmcBTFzn_XoLwpF3", + "source": { + "@timestamp": "2018-11-27T00:17:01.582Z", + "auditd": { + "sequence": 184255, + "result": "success", + "session": "9855", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "24860" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3NCGUmcBTFzn_XoLwpF3", + "source": { + "@timestamp": "2018-11-27T00:17:01.585Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + }, + "user": { + "auid": "0", + "name_map": { + "uid": "root", + "auid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24860", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9855", + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + }, + "sequence": 184256, + "result": "success" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3dCGUmcBTFzn_XoLwpF3", + "source": { + "@timestamp": "2018-11-27T00:17:01.586Z", + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "24860", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "9855", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 184257 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7dCGUmcBTFzn_XoLw5Er", + "source": { + "@timestamp": "2018-11-27T00:17:01.761Z", + "process": { + "pid": "32105", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192405, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "action": "was-authorized", + "module": "auditd", + "category": "user-login", + "type": "user_acct" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tCGUmcBTFzn_XoLw5Er", + "source": { + "@timestamp": "2018-11-27T00:17:01.762Z", + "auditd": { + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192406 + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32105", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79CGUmcBTFzn_XoLw5Er", + "source": { + "@timestamp": "2018-11-27T00:17:01.763Z", + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32105", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192408, + "result": "success", + "session": "9859", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_open" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NCGUmcBTFzn_XoLw5Er", + "source": { + "@timestamp": "2018-11-27T00:17:01.766Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "32105" + }, + "auditd": { + "sequence": 192409, + "result": "success", + "session": "9859", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8dCGUmcBTFzn_XoLw5Er", + "source": { + "@timestamp": "2018-11-27T00:17:01.767Z", + "event": { + "action": "ended-session", + "module": "auditd", + "category": "user-login", + "type": "user_end" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32105", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9859", + "data": { + "op": "PAM:session_close", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192410, + "result": "success" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tCGUmcBTFzn_XoLw5GT", + "source": { + "@timestamp": "2018-11-27T00:17:01.863Z", + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "31840", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186230, + "result": "success", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-9CGUmcBTFzn_XoLw5GT", + "source": { + "@timestamp": "2018-11-27T00:17:01.864Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31840", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186231, + "result": "success", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_NCGUmcBTFzn_XoLw5GT", + "source": { + "@timestamp": "2018-11-27T00:17:01.866Z", + "process": { + "pid": "31840", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 186233, + "result": "success", + "session": "3510", + "data": { + "op": "PAM:session_open", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dCGUmcBTFzn_XoLw5GT", + "source": { + "@timestamp": "2018-11-27T00:17:01.868Z", + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "31840", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186234, + "result": "success", + "session": "3510" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tCGUmcBTFzn_XoLw5GT", + "source": { + "@timestamp": "2018-11-27T00:17:01.869Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "31840" + }, + "auditd": { + "sequence": 186235, + "result": "success", + "session": "3510", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdCFUmcBTFzn_XoLNW-m", + "source": { + "@timestamp": "2018-11-27T00:15:19.990Z", + "source": { + "ip": "181.58.119.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43101, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "181.58.119.34", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12279", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtCFUmcBTFzn_XoLNW-m", + "source": { + "@timestamp": "2018-11-27T00:15:19.990Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "181.58.119.34", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43102 + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12279", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "181.58.119.34" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9CFUmcBTFzn_XoLNW-m", + "source": { + "@timestamp": "2018-11-27T00:15:20.098Z", + "source": { + "ip": "181.58.119.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "181.58.119.34", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "181.58.119.34", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43103, + "result": "fail" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12279" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9dCFUmcBTFzn_XoLPm_6", + "source": { + "@timestamp": "2018-11-27T00:15:22.384Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24844" + }, + "source": { + "ip": "78.217.134.141" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184246, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "78.217.134.141" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9tCFUmcBTFzn_XoLPm_6", + "source": { + "@timestamp": "2018-11-27T00:15:22.385Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24844" + }, + "source": { + "ip": "78.217.134.141" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184247, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "78.217.134.141", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99CFUmcBTFzn_XoLPm_6", + "source": { + "@timestamp": "2018-11-27T00:15:22.546Z", + "process": { + "pid": "24844", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "78.217.134.141" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "78.217.134.141", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "78.217.134.141", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184248, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZdCGUmcBTFzn_XoLhYxL", + "source": { + "@timestamp": "2018-11-27T00:16:45.917Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "212.144.234.165" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43104 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12288", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "212.144.234.165" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtCGUmcBTFzn_XoLhYxL", + "source": { + "@timestamp": "2018-11-27T00:16:45.917Z", + "source": { + "ip": "212.144.234.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "212.144.234.165", + "type": "user-session" + } + }, + "sequence": 43105, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "12288", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9CGUmcBTFzn_XoLhYxL", + "source": { + "@timestamp": "2018-11-27T00:16:46.029Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "12288", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "212.144.234.165" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "sequence": 43106, + "result": "fail", + "session": "unset", + "data": { + "hostname": "212.144.234.165", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "212.144.234.165" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtCGUmcBTFzn_XoLj44z", + "source": { + "@timestamp": "2018-11-27T00:16:48.454Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12290", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.165.64.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "82.165.64.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43107, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "C9CGUmcBTFzn_XoLj44z", + "source": { + "@timestamp": "2018-11-27T00:16:48.458Z", + "process": { + "pid": "12290", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.165.64.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "82.165.64.156" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43108, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DNCGUmcBTFzn_XoLj44z", + "source": { + "@timestamp": "2018-11-27T00:16:48.574Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "82.165.64.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43109, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "82.165.64.156" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12290" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "82.165.64.156" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XdCGUmcBTFzn_XoLspGv", + "source": { + "@timestamp": "2018-11-27T00:16:57.541Z", + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "24857", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "90.63.218.214" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "90.63.218.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184249, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XtCGUmcBTFzn_XoLspGv", + "source": { + "@timestamp": "2018-11-27T00:16:57.542Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "90.63.218.214" + } + }, + "sequence": 184250, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24857", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "90.63.218.214" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9CGUmcBTFzn_XoLspGv", + "source": { + "@timestamp": "2018-11-27T00:16:57.654Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "24857", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "90.63.218.214" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184251, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "90.63.218.214", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "90.63.218.214", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNCDUmcBTFzn_XoLe0qz", + "source": { + "@timestamp": "2018-11-27T00:13:26.761Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31815", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.221.237" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186221, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "178.128.221.237" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdCDUmcBTFzn_XoLe0qz", + "source": { + "@timestamp": "2018-11-27T00:13:26.762Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "178.128.221.237", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186222, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "31815", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.221.237" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gtCDUmcBTFzn_XoLe0qz", + "source": { + "@timestamp": "2018-11-27T00:13:26.955Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31815", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.221.237" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186223, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "178.128.221.237", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "178.128.221.237", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNCFUmcBTFzn_XoLinbC", + "source": { + "@timestamp": "2018-11-27T00:15:41.783Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31832" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186227, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "odCFUmcBTFzn_XoLinbC", + "source": { + "@timestamp": "2018-11-27T00:15:41.784Z", + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186228 + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31832", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "otCFUmcBTFzn_XoLinbC", + "source": { + "@timestamp": "2018-11-27T00:15:41.927Z", + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "46.148.18.163", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "46.148.18.163" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186229, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "31832", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5tCEUmcBTFzn_XoLU1tS", + "source": { + "@timestamp": "2018-11-27T00:14:22.056Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31823" + }, + "source": { + "ip": "185.241.4.160" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "185.241.4.160", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 186224, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59CEUmcBTFzn_XoLU1tS", + "source": { + "@timestamp": "2018-11-27T00:14:22.061Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31823", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.241.4.160" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186225, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "secondary": "185.241.4.160", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NCEUmcBTFzn_XoLU1tS", + "source": { + "@timestamp": "2018-11-27T00:14:22.221Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31823" + }, + "source": { + "ip": "185.241.4.160" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "185.241.4.160", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "185.241.4.160", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186226, + "result": "fail" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9CFUmcBTFzn_XoL031l", + "source": { + "@timestamp": "2018-11-27T00:16:00.377Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "117.102.68.188", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44076, + "result": "fail" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28053" + }, + "source": { + "ip": "117.102.68.188" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ENCFUmcBTFzn_XoL031l", + "source": { + "@timestamp": "2018-11-27T00:16:00.377Z", + "source": { + "ip": "117.102.68.188" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44077, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "117.102.68.188" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "28053", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdCFUmcBTFzn_XoL031l", + "source": { + "@timestamp": "2018-11-27T00:16:00.581Z", + "auditd": { + "sequence": 44078, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "117.102.68.188", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "117.102.68.188", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28053", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "117.102.68.188" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19CGUmcBTFzn_XoLC4FO", + "source": { + "@timestamp": "2018-11-27T00:16:14.690Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "91.183.42.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44079, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28062", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.183.42.58" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NCGUmcBTFzn_XoLC4FO", + "source": { + "@timestamp": "2018-11-27T00:16:14.690Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28062", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.183.42.58" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44080, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "91.183.42.58", + "type": "user-session" + } + } + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dCGUmcBTFzn_XoLC4FO", + "source": { + "@timestamp": "2018-11-27T00:16:14.802Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28062", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.183.42.58" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44081, + "result": "fail", + "session": "unset", + "data": { + "hostname": "91.183.42.58", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "91.183.42.58" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dtCJUmcBTFzn_XoL_tm6", + "source": { + "@timestamp": "2018-11-27T00:20:33.614Z", + "auditd": { + "sequence": 44091, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "209.59.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28150", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.59.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "d9CJUmcBTFzn_XoL_tm6", + "source": { + "@timestamp": "2018-11-27T00:20:33.614Z", + "auditd": { + "sequence": 44092, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "209.59.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28150", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "209.59.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "eNCJUmcBTFzn_XoL_tm6", + "source": { + "@timestamp": "2018-11-27T00:20:33.698Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28150" + }, + "source": { + "ip": "209.59.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44093, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "209.59.65.109", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "209.59.65.109", + "type": "user-session" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ptCKUmcBTFzn_XoLDtsd", + "source": { + "@timestamp": "2018-11-27T00:20:37.550Z", + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "106.51.72.37", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44094, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28153", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "106.51.72.37" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p9CKUmcBTFzn_XoLDtsd", + "source": { + "@timestamp": "2018-11-27T00:20:37.550Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28153" + }, + "source": { + "ip": "106.51.72.37" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44095, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "106.51.72.37", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qNCKUmcBTFzn_XoLDtsd", + "source": { + "@timestamp": "2018-11-27T00:20:37.782Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28153", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "106.51.72.37" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44096, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "106.51.72.37" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "106.51.72.37", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5tGMUmcBTFzn_XoLPwqH", + "source": { + "@timestamp": "2018-11-27T00:23:01.275Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31880", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.105.123.11" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186254, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "46.105.123.11", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59GMUmcBTFzn_XoLPwqH", + "source": { + "@timestamp": "2018-11-27T00:23:01.276Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "46.105.123.11" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186255 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31880", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.105.123.11" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NGMUmcBTFzn_XoLPwqH", + "source": { + "@timestamp": "2018-11-27T00:23:01.383Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31880", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.105.123.11" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186256, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "46.105.123.11" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "46.105.123.11" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtCKUmcBTFzn_XoL0uxn", + "source": { + "@timestamp": "2018-11-27T00:21:27.805Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "213.143.97.179", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 142270, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19271", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "213.143.97.179" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9CKUmcBTFzn_XoL0uxn", + "source": { + "@timestamp": "2018-11-27T00:21:27.807Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142271, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "213.143.97.179" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19271", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "213.143.97.179" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNCKUmcBTFzn_XoL0uxn", + "source": { + "@timestamp": "2018-11-27T00:21:27.937Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142272, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "213.143.97.179" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "213.143.97.179", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19271", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "213.143.97.179" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtCLUmcBTFzn_XoLLPOM", + "source": { + "@timestamp": "2018-11-27T00:21:50.882Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24899", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.99.252.97" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "192.99.252.97", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184273, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9CLUmcBTFzn_XoLLPOM", + "source": { + "@timestamp": "2018-11-27T00:21:50.883Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24899" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "192.99.252.97" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184274, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "192.99.252.97" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNCLUmcBTFzn_XoLLPOM", + "source": { + "@timestamp": "2018-11-27T00:21:50.926Z", + "process": { + "pid": "24899", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "source": { + "ip": "192.99.252.97" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "192.99.252.97", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184275, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "192.99.252.97" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A9CKUmcBTFzn_XoLrulM", + "source": { + "@timestamp": "2018-11-27T00:21:18.562Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186251, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "163.172.35.93" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31872" + }, + "source": { + "ip": "163.172.35.93" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BNCKUmcBTFzn_XoLrulM", + "source": { + "@timestamp": "2018-11-27T00:21:18.563Z", + "source": { + "ip": "163.172.35.93" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "163.172.35.93", + "type": "user-session" + } + }, + "sequence": 186252 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "31872", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BdCKUmcBTFzn_XoLrulM", + "source": { + "@timestamp": "2018-11-27T00:21:18.669Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31872", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "163.172.35.93" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186253, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "163.172.35.93" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "163.172.35.93", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VtCKUmcBTFzn_XoLLt0C", + "source": { + "@timestamp": "2018-11-27T00:20:45.720Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24889", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "122.175.55.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "122.175.55.196", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184270, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9CKUmcBTFzn_XoLLt0C", + "source": { + "@timestamp": "2018-11-27T00:20:45.721Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24889", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "122.175.55.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184271, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "122.175.55.196", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WNCKUmcBTFzn_XoLLt0C", + "source": { + "@timestamp": "2018-11-27T00:20:45.977Z", + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "122.175.55.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "122.175.55.196", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "122.175.55.196", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184272 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24889", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNGNUmcBTFzn_XoLiyd2", + "source": { + "@timestamp": "2018-11-27T00:24:26.252Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "145.239.137.89" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "145.239.137.89", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192426, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32155", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdGNUmcBTFzn_XoLiyd2", + "source": { + "@timestamp": "2018-11-27T00:24:26.253Z", + "source": { + "ip": "145.239.137.89" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192427, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "145.239.137.89", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32155" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtGNUmcBTFzn_XoLiyd2", + "source": { + "@timestamp": "2018-11-27T00:24:26.370Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32155" + }, + "source": { + "ip": "145.239.137.89" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "145.239.137.89", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192428, + "result": "fail", + "session": "unset", + "data": { + "hostname": "145.239.137.89", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QNGLUmcBTFzn_XoL7gTu", + "source": { + "@timestamp": "2018-11-27T00:22:40.643Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32146", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "52.189.217.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "52.189.217.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192423 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdGLUmcBTFzn_XoL7gTu", + "source": { + "@timestamp": "2018-11-27T00:22:40.644Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32146", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "52.189.217.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "52.189.217.7", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192424, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtGLUmcBTFzn_XoL7gTu", + "source": { + "@timestamp": "2018-11-27T00:22:40.849Z", + "process": { + "pid": "32146", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "52.189.217.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "52.189.217.7" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "52.189.217.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192425, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_9GMUmcBTFzn_XoL1xdJ", + "source": { + "@timestamp": "2018-11-27T00:23:40.121Z", + "process": { + "pid": "28213", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.133.18" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44097, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "139.59.133.18", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANGMUmcBTFzn_XoL1xhJ", + "source": { + "@timestamp": "2018-11-27T00:23:40.125Z", + "process": { + "pid": "28213", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.133.18" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44098, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "139.59.133.18", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdGMUmcBTFzn_XoL1xhJ", + "source": { + "@timestamp": "2018-11-27T00:23:40.237Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "139.59.133.18", + "type": "user-session" + } + }, + "sequence": 44099, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "139.59.133.18" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "28213", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.133.18" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ydGRUmcBTFzn_XoL6IZr", + "source": { + "@timestamp": "2018-11-27T00:29:12.188Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "54.37.154.254" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "54.37.154.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43119, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12362", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytGRUmcBTFzn_XoL6IZr", + "source": { + "@timestamp": "2018-11-27T00:29:12.188Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12362", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.154.254" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "54.37.154.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43120, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9GRUmcBTFzn_XoL6IZr", + "source": { + "@timestamp": "2018-11-27T00:29:12.300Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43121, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "54.37.154.254" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "54.37.154.254", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12362", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "54.37.154.254" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UtGRUmcBTFzn_XoL7YcV", + "source": { + "@timestamp": "2018-11-27T00:29:13.387Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24953", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.104.220.26" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "86.104.220.26", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184288 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "U9GRUmcBTFzn_XoL7YcV", + "source": { + "@timestamp": "2018-11-27T00:29:13.388Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24953" + }, + "source": { + "ip": "86.104.220.26" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "86.104.220.26", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 184289, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNGRUmcBTFzn_XoL7YcV", + "source": { + "@timestamp": "2018-11-27T00:29:13.531Z", + "process": { + "pid": "24953", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.104.220.26" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184290, + "result": "fail", + "session": "unset", + "data": { + "hostname": "86.104.220.26", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "86.104.220.26" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdGPUmcBTFzn_XoLtVea", + "source": { + "@timestamp": "2018-11-27T00:26:48.111Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "19304", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.162.29.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "121.162.29.165", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142276, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtGPUmcBTFzn_XoLtVea", + "source": { + "@timestamp": "2018-11-27T00:26:48.112Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19304" + }, + "source": { + "ip": "121.162.29.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "121.162.29.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142277, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Q9GPUmcBTFzn_XoLtVea", + "source": { + "@timestamp": "2018-11-27T00:26:48.273Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19304", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.162.29.165" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "121.162.29.165", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "121.162.29.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 142278, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1tGPUmcBTFzn_XoL8FvF", + "source": { + "@timestamp": "2018-11-27T00:27:03.259Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142279, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "103.56.207.96", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19306", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.56.207.96" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19GPUmcBTFzn_XoL8FvF", + "source": { + "@timestamp": "2018-11-27T00:27:03.260Z", + "process": { + "pid": "19306", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.56.207.96" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "103.56.207.96" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 142280 + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NGPUmcBTFzn_XoL8FvF", + "source": { + "@timestamp": "2018-11-27T00:27:03.463Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19306", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.56.207.96" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "103.56.207.96", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "103.56.207.96" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142281, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l9GQUmcBTFzn_XoL0m8i", + "source": { + "@timestamp": "2018-11-27T00:28:00.952Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31904" + }, + "source": { + "ip": "122.152.225.120" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186260, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "122.152.225.120", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mNGQUmcBTFzn_XoL0m8i", + "source": { + "@timestamp": "2018-11-27T00:28:00.954Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31904" + }, + "source": { + "ip": "122.152.225.120" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186261, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "122.152.225.120", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mdGQUmcBTFzn_XoL0m8i", + "source": { + "@timestamp": "2018-11-27T00:28:01.157Z", + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "122.152.225.120" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "122.152.225.120" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186262, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31904" + }, + "source": { + "ip": "122.152.225.120" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "nNGTUmcBTFzn_XoLCp-5", + "source": { + "@timestamp": "2018-11-27T00:30:26.511Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32530" + }, + "source": { + "ip": "173.167.200.227" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "173.167.200.227" + } + }, + "sequence": 192434 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ndGTUmcBTFzn_XoLCp-5", + "source": { + "@timestamp": "2018-11-27T00:30:26.512Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32530", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "173.167.200.227" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "173.167.200.227", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192435, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntGTUmcBTFzn_XoLCp-5", + "source": { + "@timestamp": "2018-11-27T00:30:26.557Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32530", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "173.167.200.227" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "173.167.200.227", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192436, + "result": "fail", + "session": "unset", + "data": { + "hostname": "173.167.200.227", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdGQUmcBTFzn_XoLtmz7", + "source": { + "@timestamp": "2018-11-27T00:27:54.000Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31902", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "184.170.7.230" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186257, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "184.170.7.230", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztGQUmcBTFzn_XoLtmz7", + "source": { + "@timestamp": "2018-11-27T00:27:54.002Z", + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "31902", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "184.170.7.230" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "184.170.7.230", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186258, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z9GQUmcBTFzn_XoLtmz7", + "source": { + "@timestamp": "2018-11-27T00:27:54.541Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31902", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "184.170.7.230" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "184.170.7.230" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "184.170.7.230", + "type": "user-session" + } + }, + "sequence": 186259, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdGSUmcBTFzn_XoLx5oM", + "source": { + "@timestamp": "2018-11-27T00:30:09.185Z", + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12372" + }, + "source": { + "ip": "86.229.8.199" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "86.229.8.199", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43125, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtGSUmcBTFzn_XoLx5oM", + "source": { + "@timestamp": "2018-11-27T00:30:09.185Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "86.229.8.199" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43126, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12372", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.229.8.199" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Q9GSUmcBTFzn_XoLx5oM", + "source": { + "@timestamp": "2018-11-27T00:30:09.329Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12372" + }, + "source": { + "ip": "86.229.8.199" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "86.229.8.199", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43127, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "86.229.8.199", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tGSUmcBTFzn_XoLe5Pk", + "source": { + "@timestamp": "2018-11-27T00:29:49.943Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12370", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.197.44.25" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43122, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "138.197.44.25", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69GSUmcBTFzn_XoLe5Pk", + "source": { + "@timestamp": "2018-11-27T00:29:49.943Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "12370", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.197.44.25" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "138.197.44.25", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43123, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + } + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7NGSUmcBTFzn_XoLe5Pk", + "source": { + "@timestamp": "2018-11-27T00:29:49.975Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "138.197.44.25", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "138.197.44.25", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43124, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12370", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.197.44.25" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59GRUmcBTFzn_XoLFXXo", + "source": { + "@timestamp": "2018-11-27T00:28:18.298Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28318" + }, + "source": { + "ip": "200.35.110.58" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "200.35.110.58" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44112 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NGRUmcBTFzn_XoLFXXo", + "source": { + "@timestamp": "2018-11-27T00:28:18.298Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28318" + }, + "source": { + "ip": "200.35.110.58" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44113, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "200.35.110.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dGRUmcBTFzn_XoLFXXo", + "source": { + "@timestamp": "2018-11-27T00:28:18.414Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "200.35.110.58", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "200.35.110.58", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44114 + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28318", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.35.110.58" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9KXUmcBTFzn_XoLtQab", + "source": { + "@timestamp": "2018-11-27T00:35:32.401Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31943", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.43.198" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "164.132.43.198" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186269, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNKXUmcBTFzn_XoLtQab", + "source": { + "@timestamp": "2018-11-27T00:35:32.402Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186270, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "164.132.43.198", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31943" + }, + "source": { + "ip": "164.132.43.198" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdKXUmcBTFzn_XoLtQab", + "source": { + "@timestamp": "2018-11-27T00:35:32.510Z", + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31943", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.43.198" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186271, + "result": "fail", + "session": "unset", + "data": { + "hostname": "164.132.43.198", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "164.132.43.198", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNKXUmcBTFzn_XoLxggy", + "source": { + "@timestamp": "2018-11-27T00:35:36.648Z", + "process": { + "pid": "19353", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.55.214.3" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.55.214.3", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142285 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CdKXUmcBTFzn_XoLxggy", + "source": { + "@timestamp": "2018-11-27T00:35:36.650Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142286, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "46.55.214.3" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19353", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.55.214.3" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtKXUmcBTFzn_XoLxggy", + "source": { + "@timestamp": "2018-11-27T00:35:36.800Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "46.55.214.3" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 142287, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "46.55.214.3" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19353", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.55.214.3" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9KYUmcBTFzn_XoL9yJk", + "source": { + "@timestamp": "2018-11-27T00:36:54.778Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "125.63.92.170", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142288 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19361" + }, + "source": { + "ip": "125.63.92.170" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNKYUmcBTFzn_XoL9yJk", + "source": { + "@timestamp": "2018-11-27T00:36:54.779Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "125.63.92.170", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142289, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19361", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "125.63.92.170" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdKYUmcBTFzn_XoL9yJk", + "source": { + "@timestamp": "2018-11-27T00:36:55.043Z", + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19361", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "125.63.92.170" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "125.63.92.170", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142290, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "125.63.92.170" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8tKZUmcBTFzn_XoLZyud", + "source": { + "@timestamp": "2018-11-27T00:37:23.507Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "180.151.228.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186272 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31951" + }, + "source": { + "ip": "180.151.228.58" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "89KZUmcBTFzn_XoLZyud", + "source": { + "@timestamp": "2018-11-27T00:37:23.508Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "180.151.228.58", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186273, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31951", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "180.151.228.58" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9NKZUmcBTFzn_XoLZyud", + "source": { + "@timestamp": "2018-11-27T00:37:23.776Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31951", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "180.151.228.58" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "180.151.228.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186274, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "180.151.228.58" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtGWUmcBTFzn_XoLwfK7", + "source": { + "@timestamp": "2018-11-27T00:34:29.968Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32558", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.24.100.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "211.24.100.205", + "type": "user-session" + } + }, + "sequence": 192440, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "B9GWUmcBTFzn_XoLwfK7", + "source": { + "@timestamp": "2018-11-27T00:34:29.969Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "32558", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.24.100.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "211.24.100.205", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192441, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNGWUmcBTFzn_XoLwfK7", + "source": { + "@timestamp": "2018-11-27T00:34:30.179Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32558" + }, + "source": { + "ip": "211.24.100.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "211.24.100.205" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "211.24.100.205", + "type": "user-session" + } + }, + "sequence": 192442 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pdKaUmcBTFzn_XoL802l", + "source": { + "@timestamp": "2018-11-27T00:39:04.878Z", + "process": { + "pid": "31959", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.251.239.72" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "46.251.239.72" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186275, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ptKaUmcBTFzn_XoL802l", + "source": { + "@timestamp": "2018-11-27T00:39:04.879Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31959", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.251.239.72" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186276, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.251.239.72", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p9KaUmcBTFzn_XoL802l", + "source": { + "@timestamp": "2018-11-27T00:39:04.990Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31959", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.251.239.72" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "46.251.239.72", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186277, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "46.251.239.72" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9KXUmcBTFzn_XoLowUZ", + "source": { + "@timestamp": "2018-11-27T00:35:27.663Z", + "source": { + "ip": "185.254.97.113" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "185.254.97.113", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186266, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31941", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNKXUmcBTFzn_XoLowUZ", + "source": { + "@timestamp": "2018-11-27T00:35:27.664Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "185.254.97.113" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.254.97.113" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186267, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31941", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdKXUmcBTFzn_XoLowUZ", + "source": { + "@timestamp": "2018-11-27T00:35:27.773Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31941", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.254.97.113" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "185.254.97.113", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186268, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "185.254.97.113" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9GWUmcBTFzn_XoL7_UK", + "source": { + "@timestamp": "2018-11-27T00:34:41.567Z", + "process": { + "pid": "19345", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.84.76.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "202.84.76.146", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142282 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNGWUmcBTFzn_XoL7_UK", + "source": { + "@timestamp": "2018-11-27T00:34:41.568Z", + "process": { + "pid": "19345", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.84.76.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "202.84.76.146", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 142283 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idGWUmcBTFzn_XoL7_UK", + "source": { + "@timestamp": "2018-11-27T00:34:41.795Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19345", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.84.76.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "202.84.76.146" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "202.84.76.146", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142284, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StKaUmcBTFzn_XoL5kzE", + "source": { + "@timestamp": "2018-11-27T00:39:01.594Z", + "auditd": { + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:accounting" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 184300 + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "25011" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9KaUmcBTFzn_XoL5kzE", + "source": { + "@timestamp": "2018-11-27T00:39:01.594Z", + "process": { + "pid": "25011", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184301, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNKaUmcBTFzn_XoL5kzE", + "source": { + "@timestamp": "2018-11-27T00:39:01.596Z", + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25011", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "9856", + "data": { + "acct": "root", + "op": "PAM:session_open", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184303 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdKaUmcBTFzn_XoL5kzE", + "source": { + "@timestamp": "2018-11-27T00:39:01.697Z", + "auditd": { + "session": "9856", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + }, + "sequence": 184304, + "result": "success" + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25011", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TtKaUmcBTFzn_XoL5kzE", + "source": { + "@timestamp": "2018-11-27T00:39:01.698Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25011", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 184305, + "result": "success", + "session": "9856" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9KaUmcBTFzn_XoL50x5", + "source": { + "@timestamp": "2018-11-27T00:39:01.774Z", + "auditd": { + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:accounting" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192443, + "result": "success", + "session": "unset" + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32579", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WNKaUmcBTFzn_XoL50x5", + "source": { + "@timestamp": "2018-11-27T00:39:01.774Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "32579" + }, + "auditd": { + "sequence": 192444, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WdKaUmcBTFzn_XoL50x5", + "source": { + "@timestamp": "2018-11-27T00:39:01.776Z", + "process": { + "pid": "32579", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9860", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192446, + "result": "success" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WtKaUmcBTFzn_XoL50x5", + "source": { + "@timestamp": "2018-11-27T00:39:01.873Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 192447, + "result": "success", + "session": "9860", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + } + }, + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32579", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9KaUmcBTFzn_XoL50x5", + "source": { + "@timestamp": "2018-11-27T00:39:01.874Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "32579", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192448, + "result": "success", + "session": "9860" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9KbUmcBTFzn_XoLP1QB", + "source": { + "@timestamp": "2018-11-27T00:39:24.137Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "138.68.111.27", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44121, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "28526", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.111.27" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNKbUmcBTFzn_XoLP1QB", + "source": { + "@timestamp": "2018-11-27T00:39:24.137Z", + "source": { + "ip": "138.68.111.27" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "138.68.111.27", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44122, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28526", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XdKbUmcBTFzn_XoLP1QB", + "source": { + "@timestamp": "2018-11-27T00:39:24.241Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28526", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.111.27" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "138.68.111.27" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "138.68.111.27", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44123 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNKiUmcBTFzn_XoLvfm3", + "source": { + "@timestamp": "2018-11-27T00:47:35.372Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19424", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "137.74.114.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142300, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "137.74.114.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CdKiUmcBTFzn_XoLvfm3", + "source": { + "@timestamp": "2018-11-27T00:47:35.374Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19424" + }, + "source": { + "ip": "137.74.114.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "137.74.114.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142301, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtKiUmcBTFzn_XoLvfm3", + "source": { + "@timestamp": "2018-11-27T00:47:35.480Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19424" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "137.74.114.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "137.74.114.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142302, + "result": "fail", + "session": "unset", + "data": { + "hostname": "137.74.114.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qdOkUmcBTFzn_XoLDBVT", + "source": { + "@timestamp": "2018-11-27T00:49:01.033Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25113", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.67.246.139" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "121.67.246.139", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184309, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtOkUmcBTFzn_XoLDBVT", + "source": { + "@timestamp": "2018-11-27T00:49:01.034Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184310, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "121.67.246.139", + "type": "user-session" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "25113", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "121.67.246.139" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9OkUmcBTFzn_XoLDBVT", + "source": { + "@timestamp": "2018-11-27T00:49:01.224Z", + "auditd": { + "data": { + "hostname": "121.67.246.139", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "121.67.246.139", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184311, + "result": "fail", + "session": "unset" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "25113", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.67.246.139" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qNOkUmcBTFzn_XoLgx_7", + "source": { + "@timestamp": "2018-11-27T00:49:31.664Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "25115", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "179.228.242.120" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "179.228.242.120", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184312, + "result": "fail" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qdOkUmcBTFzn_XoLgx_7", + "source": { + "@timestamp": "2018-11-27T00:49:31.665Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25115", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "179.228.242.120" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "179.228.242.120", + "type": "user-session" + } + }, + "sequence": 184313, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtOkUmcBTFzn_XoLgx_7", + "source": { + "@timestamp": "2018-11-27T00:49:31.831Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25115", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "179.228.242.120" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "179.228.242.120", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184314, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "179.228.242.120" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtKiUmcBTFzn_XoL-P7X", + "source": { + "@timestamp": "2018-11-27T00:47:50.509Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19431", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "39.110.219.91" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "39.110.219.91", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142303, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "B9KiUmcBTFzn_XoL-P7X", + "source": { + "@timestamp": "2018-11-27T00:47:50.511Z", + "source": { + "ip": "39.110.219.91" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142304, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "39.110.219.91", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19431", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNKiUmcBTFzn_XoL-P7X", + "source": { + "@timestamp": "2018-11-27T00:47:50.642Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19431", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "39.110.219.91" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "39.110.219.91", + "type": "user-session" + } + }, + "sequence": 142305, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "39.110.219.91" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9OkUmcBTFzn_XoLABX7", + "source": { + "@timestamp": "2018-11-27T00:48:58.129Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19439", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "41.89.47.14" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142306, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "41.89.47.14", + "type": "user-session" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNOkUmcBTFzn_XoLABX7", + "source": { + "@timestamp": "2018-11-27T00:48:58.130Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "41.89.47.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142307, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19439", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "41.89.47.14" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdOkUmcBTFzn_XoLABX7", + "source": { + "@timestamp": "2018-11-27T00:48:58.365Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "41.89.47.14", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "41.89.47.14", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 142308 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19439", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "41.89.47.14" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNOkUmcBTFzn_XoL8ilB", + "source": { + "@timestamp": "2018-11-27T00:49:59.894Z", + "process": { + "pid": "32019", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "105.16.153.210" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "105.16.153.210", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186284 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdOkUmcBTFzn_XoL8ilB", + "source": { + "@timestamp": "2018-11-27T00:49:59.895Z", + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32019", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "105.16.153.210" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "105.16.153.210", + "type": "user-session" + } + }, + "sequence": 186285, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gtOkUmcBTFzn_XoL8ilB", + "source": { + "@timestamp": "2018-11-27T00:50:00.158Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32019", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "105.16.153.210" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186286, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "105.16.153.210", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "105.16.153.210" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdOlUmcBTFzn_XoLkjc2", + "source": { + "@timestamp": "2018-11-27T00:50:40.838Z", + "source": { + "ip": "188.166.243.150" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44130, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "188.166.243.150", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28746", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtOlUmcBTFzn_XoLkjc2", + "source": { + "@timestamp": "2018-11-27T00:50:40.842Z", + "source": { + "ip": "188.166.243.150" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "188.166.243.150", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44131 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28746" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9OlUmcBTFzn_XoLkjc2", + "source": { + "@timestamp": "2018-11-27T00:50:41.034Z", + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "188.166.243.150", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "188.166.243.150" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44132, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "28746", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.166.243.150" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdOmUmcBTFzn_XoLCEHk", + "source": { + "@timestamp": "2018-11-27T00:51:11.223Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43140, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "194.35.114.10" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12495", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "194.35.114.10" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JtOmUmcBTFzn_XoLCEHk", + "source": { + "@timestamp": "2018-11-27T00:51:11.223Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12495" + }, + "source": { + "ip": "194.35.114.10" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "194.35.114.10" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43141, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9OmUmcBTFzn_XoLCEHk", + "source": { + "@timestamp": "2018-11-27T00:51:11.503Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12495" + }, + "source": { + "ip": "194.35.114.10" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "194.35.114.10", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "194.35.114.10", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43142 + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dOlUmcBTFzn_XoLvzre", + "source": { + "@timestamp": "2018-11-27T00:50:52.531Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "104.131.178.223", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44133, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28750", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.178.223" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0tOlUmcBTFzn_XoLvzre", + "source": { + "@timestamp": "2018-11-27T00:50:52.531Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "104.131.178.223", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44134, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28750" + }, + "source": { + "ip": "104.131.178.223" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "09OlUmcBTFzn_XoLvzre", + "source": { + "@timestamp": "2018-11-27T00:50:52.559Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28750", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.178.223" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "104.131.178.223" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.131.178.223", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44135 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7NSvUmcBTFzn_XoL9Rog", + "source": { + "@timestamp": "2018-11-27T01:02:01.525Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25194", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.219.52.136" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "211.219.52.136" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184321, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7dSvUmcBTFzn_XoL9Rog", + "source": { + "@timestamp": "2018-11-27T01:02:01.526Z", + "auditd": { + "sequence": 184322, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "211.219.52.136", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25194", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "211.219.52.136" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tSvUmcBTFzn_XoL9Rog", + "source": { + "@timestamp": "2018-11-27T01:02:01.686Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25194", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.219.52.136" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "211.219.52.136", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184323, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "211.219.52.136" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "btOsUmcBTFzn_XoLdc7t", + "source": { + "@timestamp": "2018-11-27T00:58:12.354Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19491", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.234.241.55" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "91.234.241.55", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142312, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "b9OsUmcBTFzn_XoLdc7t", + "source": { + "@timestamp": "2018-11-27T00:58:12.355Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19491" + }, + "source": { + "ip": "91.234.241.55" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "91.234.241.55", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 142313, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNOsUmcBTFzn_XoLdc7t", + "source": { + "@timestamp": "2018-11-27T00:58:12.497Z", + "source": { + "ip": "91.234.241.55" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "91.234.241.55", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 142314, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "91.234.241.55" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19491" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VtOsUmcBTFzn_XoLGcfx", + "source": { + "@timestamp": "2018-11-27T00:57:48.807Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19483", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.121.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142309, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.0.121.168", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9OsUmcBTFzn_XoLGcfx", + "source": { + "@timestamp": "2018-11-27T00:57:48.808Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19483", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.121.168" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "128.0.121.168", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142310 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WNOsUmcBTFzn_XoLGcfx", + "source": { + "@timestamp": "2018-11-27T00:57:48.917Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19483", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.121.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142311, + "result": "fail", + "session": "unset", + "data": { + "hostname": "128.0.121.168", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "128.0.121.168", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p9SvUmcBTFzn_XoLTQyw", + "source": { + "@timestamp": "2018-11-27T01:01:18.662Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "220.135.55.172", + "type": "user-session" + } + }, + "sequence": 192458, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32763", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "220.135.55.172" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qNSvUmcBTFzn_XoLTQyw", + "source": { + "@timestamp": "2018-11-27T01:01:18.663Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "220.135.55.172", + "type": "user-session" + } + }, + "sequence": 192459, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32763", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "220.135.55.172" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qdSvUmcBTFzn_XoLTQyw", + "source": { + "@timestamp": "2018-11-27T01:01:18.839Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "220.135.55.172" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "220.135.55.172" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192460, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32763", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "220.135.55.172" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztOuUmcBTFzn_XoLCvAK", + "source": { + "@timestamp": "2018-11-27T00:59:55.808Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19499", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "13.77.75.153" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "13.77.75.153", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142315 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z9OuUmcBTFzn_XoLCvAK", + "source": { + "@timestamp": "2018-11-27T00:59:55.809Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19499" + }, + "source": { + "ip": "13.77.75.153" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "13.77.75.153", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142316, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NOuUmcBTFzn_XoLCvAK", + "source": { + "@timestamp": "2018-11-27T00:59:55.852Z", + "process": { + "pid": "19499", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "13.77.75.153" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "13.77.75.153", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142317, + "result": "fail", + "session": "unset", + "data": { + "hostname": "13.77.75.153", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59SwUmcBTFzn_XoLmSiw", + "source": { + "@timestamp": "2018-11-27T01:02:43.654Z", + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186290, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32075", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NSwUmcBTFzn_XoLmSiw", + "source": { + "@timestamp": "2018-11-27T01:02:43.655Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32075", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186291, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dSwUmcBTFzn_XoLmSiw", + "source": { + "@timestamp": "2018-11-27T01:02:43.688Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32075", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186292, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANSwUmcBTFzn_XoL0C7C", + "source": { + "@timestamp": "2018-11-27T01:02:57.752Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32082", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186293, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdSwUmcBTFzn_XoL0C7C", + "source": { + "@timestamp": "2018-11-27T01:02:57.754Z", + "process": { + "pid": "32082", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 186294, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtSwUmcBTFzn_XoL0C7C", + "source": { + "@timestamp": "2018-11-27T01:02:57.784Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32082" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186295 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "t9OuUmcBTFzn_XoLHfKW", + "source": { + "@timestamp": "2018-11-27T01:00:00.805Z", + "source": { + "ip": "178.128.127.228" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "178.128.127.228", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44145, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28933", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "uNOuUmcBTFzn_XoLHfKW", + "source": { + "@timestamp": "2018-11-27T01:00:00.809Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "28933", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.127.228" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44146, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.128.127.228", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "udOuUmcBTFzn_XoLHfKW", + "source": { + "@timestamp": "2018-11-27T01:00:01.001Z", + "auditd": { + "sequence": 44147, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "178.128.127.228" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "178.128.127.228", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28933", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.127.228" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNOtUmcBTFzn_XoL8u_M", + "source": { + "@timestamp": "2018-11-27T00:59:49.852Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.197.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44142, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28930" + }, + "source": { + "ip": "164.132.197.108" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bdOtUmcBTFzn_XoL8u_M", + "source": { + "@timestamp": "2018-11-27T00:59:49.852Z", + "auditd": { + "sequence": 44143, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.197.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "28930", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "btOtUmcBTFzn_XoL8u_M", + "source": { + "@timestamp": "2018-11-27T00:59:49.964Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28930", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44144, + "result": "fail", + "session": "unset", + "data": { + "hostname": "164.132.197.108", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "164.132.197.108" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ptS1UmcBTFzn_XoL0JuA", + "source": { + "@timestamp": "2018-11-27T01:08:25.366Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "345" + }, + "source": { + "ip": "5.186.77.221" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "5.186.77.221", + "type": "user-session" + } + }, + "sequence": 192473 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p9S1UmcBTFzn_XoL0JuA", + "source": { + "@timestamp": "2018-11-27T01:08:25.367Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192474, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "5.186.77.221" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "345" + }, + "source": { + "ip": "5.186.77.221" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qNS1UmcBTFzn_XoL0JuA", + "source": { + "@timestamp": "2018-11-27T01:08:25.506Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "345" + }, + "source": { + "ip": "5.186.77.221" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192475, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "5.186.77.221", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "5.186.77.221", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NS1UmcBTFzn_XoL2Jxv", + "source": { + "@timestamp": "2018-11-27T01:08:27.396Z", + "source": { + "ip": "24.37.251.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186326, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "24.37.251.196", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32127", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dS1UmcBTFzn_XoL2Jxv", + "source": { + "@timestamp": "2018-11-27T01:08:27.397Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32127" + }, + "source": { + "ip": "24.37.251.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "24.37.251.196", + "type": "user-session" + } + }, + "sequence": 186327 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tS1UmcBTFzn_XoL2Jxv", + "source": { + "@timestamp": "2018-11-27T01:08:27.453Z", + "source": { + "ip": "24.37.251.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "24.37.251.196" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "24.37.251.196", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186328 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32127", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ydSzUmcBTFzn_XoLp2tF", + "source": { + "@timestamp": "2018-11-27T01:06:03.738Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "secondary": "178.128.124.241", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 186311, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32108" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "178.128.124.241" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytSzUmcBTFzn_XoLp2tF", + "source": { + "@timestamp": "2018-11-27T01:06:03.739Z", + "process": { + "pid": "32108", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.124.241" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "178.128.124.241", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186312, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9SzUmcBTFzn_XoLp2tF", + "source": { + "@timestamp": "2018-11-27T01:06:03.933Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32108", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "source": { + "ip": "178.128.124.241" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186313, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "178.128.124.241", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "secondary": "178.128.124.241", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UtSzUmcBTFzn_XoLrWwF", + "source": { + "@timestamp": "2018-11-27T01:06:05.210Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32110" + }, + "source": { + "ip": "191.92.71.194" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186314, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "191.92.71.194", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "U9SzUmcBTFzn_XoLrWwF", + "source": { + "@timestamp": "2018-11-27T01:06:05.211Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32110" + }, + "source": { + "ip": "191.92.71.194" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "191.92.71.194", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186315 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNSzUmcBTFzn_XoLrWwF", + "source": { + "@timestamp": "2018-11-27T01:06:05.347Z", + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "191.92.71.194" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186316, + "result": "fail", + "session": "unset", + "data": { + "hostname": "191.92.71.194", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "191.92.71.194", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32110", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztS0UmcBTFzn_XoLK3fA", + "source": { + "@timestamp": "2018-11-27T01:06:37.654Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "327", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "106.241.53.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192467, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "106.241.53.82" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z9S0UmcBTFzn_XoLK3fA", + "source": { + "@timestamp": "2018-11-27T01:06:37.655Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "106.241.53.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192468, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "327", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "106.241.53.82" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NS0UmcBTFzn_XoLK3fA", + "source": { + "@timestamp": "2018-11-27T01:06:37.861Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "327", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "106.241.53.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "106.241.53.82", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "106.241.53.82" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192469 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "k9S0UmcBTFzn_XoLPHgu", + "source": { + "@timestamp": "2018-11-27T01:06:41.860Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "330" + }, + "source": { + "ip": "170.210.88.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "170.210.88.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192470, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lNS0UmcBTFzn_XoLPHgu", + "source": { + "@timestamp": "2018-11-27T01:06:41.861Z", + "auditd": { + "sequence": 192471, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "170.210.88.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "330", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "170.210.88.50" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ldS0UmcBTFzn_XoLPHgu", + "source": { + "@timestamp": "2018-11-27T01:06:42.073Z", + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "170.210.88.50", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "170.210.88.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192472, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "330", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "170.210.88.50" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bdS1UmcBTFzn_XoLo5cq", + "source": { + "@timestamp": "2018-11-27T01:08:13.760Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186323, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32125", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "btS1UmcBTFzn_XoLo5cq", + "source": { + "@timestamp": "2018-11-27T01:08:13.761Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32125" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186324 + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "b9S1UmcBTFzn_XoLo5cq", + "source": { + "@timestamp": "2018-11-27T01:08:13.791Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32125" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186325, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9S0UmcBTFzn_XoLsoI4", + "source": { + "@timestamp": "2018-11-27T01:07:12.077Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186320, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32117", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNS0UmcBTFzn_XoLsoI4", + "source": { + "@timestamp": "2018-11-27T01:07:12.079Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186321, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32117", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddS0UmcBTFzn_XoLsoI4", + "source": { + "@timestamp": "2018-11-27T01:07:12.110Z", + "auditd": { + "sequence": 186322, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "U9SzUmcBTFzn_XoLw27K", + "source": { + "@timestamp": "2018-11-27T01:06:11.040Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186317, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32112", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNSzUmcBTFzn_XoLw27K", + "source": { + "@timestamp": "2018-11-27T01:06:11.041Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186318, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32112", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VdSzUmcBTFzn_XoLw27K", + "source": { + "@timestamp": "2018-11-27T01:06:11.071Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32112", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186319, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "o9S0UmcBTFzn_XoL1YXV", + "source": { + "@timestamp": "2018-11-27T01:07:21.191Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.234.223.14", + "type": "user-session" + } + }, + "sequence": 44148, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "29074", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "104.234.223.14" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pNS0UmcBTFzn_XoL1YXV", + "source": { + "@timestamp": "2018-11-27T01:07:21.195Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "104.234.223.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44149, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29074", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.234.223.14" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pdS0UmcBTFzn_XoL1YXV", + "source": { + "@timestamp": "2018-11-27T01:07:21.243Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "104.234.223.14", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "104.234.223.14" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44150 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29074" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "104.234.223.14" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dtS2UmcBTFzn_XoLXqd2", + "source": { + "@timestamp": "2018-11-27T01:09:01.707Z", + "auditd": { + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184324 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "25243", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "d9S2UmcBTFzn_XoLXqd2", + "source": { + "@timestamp": "2018-11-27T01:09:01.708Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25243", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184325, + "result": "success" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "eNS2UmcBTFzn_XoLXqd2", + "source": { + "@timestamp": "2018-11-27T01:09:01.710Z", + "process": { + "pid": "25243", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184327, + "result": "success", + "session": "9857", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "edS2UmcBTFzn_XoLXqd2", + "source": { + "@timestamp": "2018-11-27T01:09:01.806Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "25243", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184328, + "result": "success", + "session": "9857", + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + } + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "etS2UmcBTFzn_XoLXqd2", + "source": { + "@timestamp": "2018-11-27T01:09:01.808Z", + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "uid": "root", + "auid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25243", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184329, + "result": "success", + "session": "9857", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_close" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "t9S2UmcBTFzn_XoLX6cl", + "source": { + "@timestamp": "2018-11-27T01:09:01.883Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "348", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192476, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "uNS2UmcBTFzn_XoLX6cl", + "source": { + "@timestamp": "2018-11-27T01:09:01.884Z", + "event": { + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "348", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192477, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "udS2UmcBTFzn_XoLX6cl", + "source": { + "@timestamp": "2018-11-27T01:09:01.885Z", + "auditd": { + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + }, + "sequence": 192479, + "result": "success", + "session": "9861", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + } + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "pid": "348", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "utS2UmcBTFzn_XoLX6cl", + "source": { + "@timestamp": "2018-11-27T01:09:01.981Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192480, + "result": "success", + "session": "9861", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + } + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "348", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "u9S2UmcBTFzn_XoLX6cl", + "source": { + "@timestamp": "2018-11-27T01:09:01.982Z", + "event": { + "type": "user_end", + "action": "ended-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "0", + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "pid": "348", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9861", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + }, + "sequence": 192481, + "result": "success" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItS2UmcBTFzn_XoLBKBn", + "source": { + "@timestamp": "2018-11-27T01:08:38.649Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.228.67", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44151, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29096", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.228.67" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9S2UmcBTFzn_XoLBKBn", + "source": { + "@timestamp": "2018-11-27T01:08:38.649Z", + "source": { + "ip": "178.33.228.67" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.228.67", + "type": "user-session" + } + }, + "sequence": 44152 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "29096", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNS2UmcBTFzn_XoLBKBn", + "source": { + "@timestamp": "2018-11-27T01:08:38.757Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29096", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.228.67" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "178.33.228.67", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "178.33.228.67", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44153, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNS4UmcBTFzn_XoLIM6c", + "source": { + "@timestamp": "2018-11-27T01:10:56.938Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184333, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "91.230.8.194" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "91.230.8.194" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25299", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.230.8.194" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NS4UmcBTFzn_XoLMc9n", + "source": { + "@timestamp": "2018-11-27T01:11:01.244Z", + "process": { + "pid": "29148", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "85.234.34.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "85.234.34.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44158, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dS4UmcBTFzn_XoLMc9n", + "source": { + "@timestamp": "2018-11-27T01:11:01.244Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29148", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "85.234.34.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "85.234.34.92" + } + }, + "sequence": 44159, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tS4UmcBTFzn_XoLMc9n", + "source": { + "@timestamp": "2018-11-27T01:11:01.400Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29148" + }, + "source": { + "ip": "85.234.34.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44160, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "85.234.34.92", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "85.234.34.92" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctS3UmcBTFzn_XoLgcD-", + "source": { + "@timestamp": "2018-11-27T01:10:16.337Z", + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "79.137.64.132", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186333, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32141", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "79.137.64.132" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9S3UmcBTFzn_XoLgcD-", + "source": { + "@timestamp": "2018-11-27T01:10:16.339Z", + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "79.137.64.132" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186334, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "79.137.64.132", + "type": "user-session" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32141" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNS3UmcBTFzn_XoLgcD-", + "source": { + "@timestamp": "2018-11-27T01:10:16.445Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "79.137.64.132" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186335, + "result": "fail", + "session": "unset", + "data": { + "hostname": "79.137.64.132", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "79.137.64.132", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32141", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "u9S3UmcBTFzn_XoLh8GC", + "source": { + "@timestamp": "2018-11-27T01:10:17.752Z", + "auditd": { + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186336, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32148", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9S2UmcBTFzn_XoLtK-X", + "source": { + "@timestamp": "2018-11-27T01:09:23.757Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192482, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "109.202.18.235", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "397", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "109.202.18.235" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNS2UmcBTFzn_XoLtK-X", + "source": { + "@timestamp": "2018-11-27T01:09:23.758Z", + "process": { + "pid": "397", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "109.202.18.235" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "109.202.18.235", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192483, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adS2UmcBTFzn_XoLtK-X", + "source": { + "@timestamp": "2018-11-27T01:09:23.948Z", + "source": { + "ip": "109.202.18.235" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192484, + "result": "fail", + "session": "unset", + "data": { + "hostname": "109.202.18.235", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "109.202.18.235" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "397" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BdS4UmcBTFzn_XoLFs5k", + "source": { + "@timestamp": "2018-11-27T01:10:54.329Z", + "auditd": { + "sequence": 184330, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "188.68.54.39", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25297", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.68.54.39" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtS4UmcBTFzn_XoLFs5k", + "source": { + "@timestamp": "2018-11-27T01:10:54.330Z", + "auditd": { + "sequence": 184331, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "188.68.54.39", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "25297", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.68.54.39" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "B9S4UmcBTFzn_XoLFs5k", + "source": { + "@timestamp": "2018-11-27T01:10:54.443Z", + "source": { + "ip": "188.68.54.39" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184332, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "188.68.54.39", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "188.68.54.39", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25297", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9S2UmcBTFzn_XoLf6s6", + "source": { + "@timestamp": "2018-11-27T01:09:10.091Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186329 + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32135", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNS2UmcBTFzn_XoLf6s6", + "source": { + "@timestamp": "2018-11-27T01:09:10.092Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32135", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186330, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GdS2UmcBTFzn_XoLf6s6", + "source": { + "@timestamp": "2018-11-27T01:09:10.235Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32135" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "46.148.18.163" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "46.148.18.163", + "type": "user-session" + } + }, + "sequence": 186331, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l9S2UmcBTFzn_XoLxbHN", + "source": { + "@timestamp": "2018-11-27T01:09:28.162Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "399", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.68.38.86" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192485, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "103.68.38.86", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mNS2UmcBTFzn_XoLxbHN", + "source": { + "@timestamp": "2018-11-27T01:09:28.163Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "103.68.38.86" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192486 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "399" + }, + "source": { + "ip": "103.68.38.86" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mdS2UmcBTFzn_XoLxbHN", + "source": { + "@timestamp": "2018-11-27T01:09:28.435Z", + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "103.68.38.86", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192487, + "result": "fail", + "session": "unset", + "data": { + "hostname": "103.68.38.86", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "399", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "103.68.38.86" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdS3UmcBTFzn_XoL-8sa", + "source": { + "@timestamp": "2018-11-27T01:10:47.311Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "29142", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.37.69" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44155, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.38.37.69", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtS3UmcBTFzn_XoL-8sa", + "source": { + "@timestamp": "2018-11-27T01:10:47.315Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "29142", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.37.69" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "51.38.37.69", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44156, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9S3UmcBTFzn_XoL-8sa", + "source": { + "@timestamp": "2018-11-27T01:10:47.419Z", + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "51.38.37.69", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "51.38.37.69" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44157, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29142" + }, + "source": { + "ip": "51.38.37.69" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "itS2UmcBTFzn_XoLlayd", + "source": { + "@timestamp": "2018-11-27T01:09:15.827Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32137", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186332 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9S3UmcBTFzn_XoLlcLB", + "source": { + "@timestamp": "2018-11-27T01:10:21.397Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "29135", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.31.198" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "142.93.31.198" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "142.93.31.198", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44154, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PdW9UmcBTFzn_XoLr0tl", + "source": { + "@timestamp": "2018-11-27T01:17:01.176Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "29271" + }, + "auditd": { + "sequence": 44173, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PtW9UmcBTFzn_XoLr0tl", + "source": { + "@timestamp": "2018-11-27T01:17:01.176Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29271", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44174, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + } + }, + "event": { + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "P9W9UmcBTFzn_XoLr0tl", + "source": { + "@timestamp": "2018-11-27T01:17:01.180Z", + "process": { + "pid": "29271", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 44176, + "result": "success", + "session": "1444", + "data": { + "op": "PAM:session_open", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QNW9UmcBTFzn_XoLr0tl", + "source": { + "@timestamp": "2018-11-27T01:17:01.180Z", + "process": { + "pid": "29271", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 44177, + "result": "success", + "session": "1444", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdW9UmcBTFzn_XoLr0tl", + "source": { + "@timestamp": "2018-11-27T01:17:01.180Z", + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29271", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 44178, + "result": "success", + "session": "1444", + "data": { + "op": "PAM:session_close", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_end", + "action": "ended-session" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtW9UmcBTFzn_XoLr0ty", + "source": { + "@timestamp": "2018-11-27T01:17:01.191Z", + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19593", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 142321, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:accounting", + "terminal": "cron" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Q9W9UmcBTFzn_XoLr0ty", + "source": { + "@timestamp": "2018-11-27T01:17:01.191Z", + "process": { + "pid": "19593", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 142322, + "result": "success", + "session": "unset" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RNW9UmcBTFzn_XoLr0ty", + "source": { + "@timestamp": "2018-11-27T01:17:01.193Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_start", + "action": "started-session" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "process": { + "pid": "19593", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 142324, + "result": "success", + "session": "3503", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RdW9UmcBTFzn_XoLr0ty", + "source": { + "@timestamp": "2018-11-27T01:17:01.196Z", + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19593", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 142325, + "result": "success", + "session": "3503", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + } + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RtW9UmcBTFzn_XoLr0ty", + "source": { + "@timestamp": "2018-11-27T01:17:01.196Z", + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19593", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "data": { + "op": "PAM:session_close", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 142326, + "result": "success", + "session": "3503" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WdW9UmcBTFzn_XoLr0uP", + "source": { + "@timestamp": "2018-11-27T01:17:01.214Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12641", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "op": "PAM:accounting", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 43155, + "result": "success", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WtW9UmcBTFzn_XoLr0uP", + "source": { + "@timestamp": "2018-11-27T01:17:01.214Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "12641", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 43156 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9W9UmcBTFzn_XoLr0uP", + "source": { + "@timestamp": "2018-11-27T01:17:01.218Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "uid": "0", + "name_map": { + "uid": "root", + "auid": "root" + } + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "12641" + }, + "auditd": { + "data": { + "op": "PAM:session_open", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 43158, + "result": "success", + "session": "1252" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNW9UmcBTFzn_XoLr0uP", + "source": { + "@timestamp": "2018-11-27T01:17:01.218Z", + "auditd": { + "sequence": 43159, + "result": "success", + "session": "1252", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + }, + "user": { + "uid": "0", + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "pid": "12641", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XdW9UmcBTFzn_XoLr0uP", + "source": { + "@timestamp": "2018-11-27T01:17:01.222Z", + "process": { + "pid": "12641", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "1252", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 43160, + "result": "success" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "ended-session", + "module": "auditd", + "category": "user-login", + "type": "user_end" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adW9UmcBTFzn_XoLsUvf", + "source": { + "@timestamp": "2018-11-27T01:17:01.812Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "25339", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184337, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atW9UmcBTFzn_XoLsUvf", + "source": { + "@timestamp": "2018-11-27T01:17:01.813Z", + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25339", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184338, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9W9UmcBTFzn_XoLsUvf", + "source": { + "@timestamp": "2018-11-27T01:17:01.814Z", + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25339", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 184340, + "result": "success", + "session": "9858" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_start", + "action": "started-session" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNW9UmcBTFzn_XoLsUvf", + "source": { + "@timestamp": "2018-11-27T01:17:01.817Z", + "process": { + "pid": "25339", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "result": "success", + "session": "9858", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184341 + }, + "event": { + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bdW9UmcBTFzn_XoLsUvf", + "source": { + "@timestamp": "2018-11-27T01:17:01.818Z", + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "25339" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184342, + "result": "success", + "session": "9858", + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + } + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9W-UmcBTFzn_XoL5GZq", + "source": { + "@timestamp": "2018-11-27T01:18:20.287Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19602", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.59.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "209.59.65.109" + } + }, + "sequence": 142327, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNW-UmcBTFzn_XoL5GZq", + "source": { + "@timestamp": "2018-11-27T01:18:20.288Z", + "source": { + "ip": "209.59.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142328, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "209.59.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19602", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bdW-UmcBTFzn_XoL5GZq", + "source": { + "@timestamp": "2018-11-27T01:18:20.382Z", + "auditd": { + "sequence": 142329, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "209.59.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "209.59.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19602", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.59.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9W-UmcBTFzn_XoL6WZS", + "source": { + "@timestamp": "2018-11-27T01:18:21.543Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "95.156.31.74" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "95.156.31.74" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142330, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19604", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNW-UmcBTFzn_XoL6WZS", + "source": { + "@timestamp": "2018-11-27T01:18:21.545Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19604", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "95.156.31.74" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142331, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "95.156.31.74", + "type": "user-session", + "primary": "sshd" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idW-UmcBTFzn_XoL6WZS", + "source": { + "@timestamp": "2018-11-27T01:18:21.689Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19604", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "95.156.31.74" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "95.156.31.74" + }, + "summary": { + "object": { + "secondary": "95.156.31.74", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 142332 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "39W_UmcBTFzn_XoLD2nn", + "source": { + "@timestamp": "2018-11-27T01:18:31.420Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32215", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186386, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4NW_UmcBTFzn_XoLD2nn", + "source": { + "@timestamp": "2018-11-27T01:18:31.421Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32215", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186387, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4dW_UmcBTFzn_XoLD2nn", + "source": { + "@timestamp": "2018-11-27T01:18:31.453Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32215" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186388, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adW_UmcBTFzn_XoLeXOw", + "source": { + "@timestamp": "2018-11-27T01:18:58.502Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32217", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186389, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "46.148.18.163", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atW_UmcBTFzn_XoLeXOw", + "source": { + "@timestamp": "2018-11-27T01:18:58.503Z", + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "secondary": "46.148.18.163", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186390, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32217", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9W_UmcBTFzn_XoLeXOw", + "source": { + "@timestamp": "2018-11-27T01:18:58.645Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32217", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "46.148.18.163" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186391, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctW-UmcBTFzn_XoLJVU7", + "source": { + "@timestamp": "2018-11-27T01:17:31.345Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32207", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186383, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9W-UmcBTFzn_XoLJVU7", + "source": { + "@timestamp": "2018-11-27T01:17:31.346Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32207", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186384, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNW-UmcBTFzn_XoLJVU7", + "source": { + "@timestamp": "2018-11-27T01:17:31.378Z", + "process": { + "pid": "32207", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186385, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdW9UmcBTFzn_XoLfkeK", + "source": { + "@timestamp": "2018-11-27T01:16:48.669Z", + "source": { + "ip": "115.146.127.132" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "115.146.127.132", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43152, + "result": "fail", + "session": "unset" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12639", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtW9UmcBTFzn_XoLfkeK", + "source": { + "@timestamp": "2018-11-27T01:16:48.669Z", + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "115.146.127.132", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43153, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12639", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.132" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9W9UmcBTFzn_XoLfkeK", + "source": { + "@timestamp": "2018-11-27T01:16:48.873Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43154, + "result": "fail", + "session": "unset", + "data": { + "hostname": "115.146.127.132", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "115.146.127.132" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12639", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.132" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9W9UmcBTFzn_XoLUUI6", + "source": { + "@timestamp": "2018-11-27T01:16:37.072Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32202" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186374, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNW9UmcBTFzn_XoLUUI6", + "source": { + "@timestamp": "2018-11-27T01:16:37.073Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32202" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186375, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdW9UmcBTFzn_XoLUUI6", + "source": { + "@timestamp": "2018-11-27T01:16:37.104Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186376, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32202" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "btW9UmcBTFzn_XoLskuL", + "source": { + "@timestamp": "2018-11-27T01:17:01.885Z", + "auditd": { + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186377, + "result": "success", + "session": "unset" + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32204", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "b9W9UmcBTFzn_XoLskuL", + "source": { + "@timestamp": "2018-11-27T01:17:01.886Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "32204" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186378 + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNW9UmcBTFzn_XoLskuL", + "source": { + "@timestamp": "2018-11-27T01:17:01.887Z", + "auditd": { + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + }, + "sequence": 186380, + "result": "success", + "session": "3511", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_open" + } + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32204", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cdW9UmcBTFzn_XoLskuL", + "source": { + "@timestamp": "2018-11-27T01:17:01.890Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32204", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 186381, + "result": "success", + "session": "3511", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctW9UmcBTFzn_XoLskuL", + "source": { + "@timestamp": "2018-11-27T01:17:01.891Z", + "process": { + "pid": "32204", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186382, + "result": "success", + "session": "3511" + }, + "event": { + "type": "user_end", + "action": "ended-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9W9UmcBTFzn_XoLskuR", + "source": { + "@timestamp": "2018-11-27T01:17:01.987Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "458" + }, + "auditd": { + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 192494, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNW9UmcBTFzn_XoLskuR", + "source": { + "@timestamp": "2018-11-27T01:17:01.988Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "458", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192495, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + } + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddW9UmcBTFzn_XoLskuR", + "source": { + "@timestamp": "2018-11-27T01:17:01.989Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "458", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9862", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_open" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + }, + "sequence": 192497, + "result": "success" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dtW9UmcBTFzn_XoLskuR", + "source": { + "@timestamp": "2018-11-27T01:17:01.992Z", + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "process": { + "pid": "458", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9862", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192498, + "result": "success" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "d9W9UmcBTFzn_XoLskuR", + "source": { + "@timestamp": "2018-11-27T01:17:01.993Z", + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "458", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 192499, + "result": "success", + "session": "9862", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_close" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p9W_UmcBTFzn_XoLs3cF", + "source": { + "@timestamp": "2018-11-27T01:19:13.179Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "file_integrity", + "action": [ + "created" + ] + }, + "file": { + "uid": 0, + "owner": "root", + "inode": "121", + "mtime": "2018-11-27T01:19:13.174Z", + "size": 20, + "type": "file", + "gid": 0, + "mode": "0000", + "path": "/etc/sed4Tvfpv", + "ctime": "2018-11-27T01:19:13.174Z", + "group": "root" + }, + "hash": { + "sha1": "c7f9a550b77ece79052aa1a630098b911883abde" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qNW_UmcBTFzn_XoLs3cF", + "source": { + "@timestamp": "2018-11-27T01:19:13.180Z", + "event": { + "module": "file_integrity", + "action": [ + "updated" + ] + }, + "file": { + "group": "root", + "inode": "121", + "gid": 0, + "type": "file", + "mtime": "2018-11-27T01:19:13.178Z", + "ctime": "2018-11-27T01:19:13.178Z", + "uid": 0, + "mode": "0000", + "owner": "root", + "path": "/etc/sed4Tvfpv", + "size": 51 + }, + "hash": { + "sha1": "4dac5cd40b12d209e8a87bf8089fadab9edfca00" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qdW_UmcBTFzn_XoLs3cF", + "source": { + "@timestamp": "2018-11-27T01:19:13.187Z", + "file": { + "path": "/etc/sed4Tvfpv" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "file_integrity", + "action": [ + "attributes_modified" + ] + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtW_UmcBTFzn_XoLs3cF", + "source": { + "@timestamp": "2018-11-27T01:19:13.188Z", + "event": { + "action": [ + "moved" + ], + "module": "file_integrity" + }, + "file": { + "path": "/etc/sed4Tvfpv" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9W_UmcBTFzn_XoLs3cF", + "source": { + "@timestamp": "2018-11-27T01:19:13.195Z", + "event": { + "module": "file_integrity", + "action": [ + "created" + ] + }, + "file": { + "type": "file", + "owner": "root", + "mtime": "2018-11-27T01:19:13.178Z", + "ctime": "2018-11-27T01:19:13.178Z", + "group": "root", + "path": "/etc/hosts", + "gid": 0, + "uid": 0, + "inode": "121", + "mode": "0644", + "size": 209 + }, + "hash": { + "sha1": "ac0139feba2533b2670370c22551547341fde295" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNbJUmcBTFzn_XoL6leU", + "source": { + "@timestamp": "2018-11-27T01:30:22.705Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25784", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.245.204.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "152.245.204.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 184359 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XdbJUmcBTFzn_XoL6leU", + "source": { + "@timestamp": "2018-11-27T01:30:22.707Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25784", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.245.204.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "152.245.204.82", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184360, + "result": "fail" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XtbJUmcBTFzn_XoL6leU", + "source": { + "@timestamp": "2018-11-27T01:30:22.717Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25783" + }, + "source": { + "ip": "152.245.204.82" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184361, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "152.245.204.82", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9bJUmcBTFzn_XoL6leU", + "source": { + "@timestamp": "2018-11-27T01:30:22.719Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184362, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "152.245.204.82" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25783", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.245.204.82" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNbJUmcBTFzn_XoL6leU", + "source": { + "@timestamp": "2018-11-27T01:30:22.897Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25784", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.245.204.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "152.245.204.82", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "152.245.204.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184363, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdbJUmcBTFzn_XoL6leU", + "source": { + "@timestamp": "2018-11-27T01:30:22.918Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "152.245.204.82" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "152.245.204.82" + } + }, + "sequence": 184364 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25783" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "152.245.204.82" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DNbKUmcBTFzn_XoLGlxF", + "source": { + "@timestamp": "2018-11-27T01:30:34.971Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32299", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186434 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DdbKUmcBTFzn_XoLGlxF", + "source": { + "@timestamp": "2018-11-27T01:30:34.972Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32299" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186435, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DtbKUmcBTFzn_XoLGlxF", + "source": { + "@timestamp": "2018-11-27T01:30:35.002Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32299", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186436, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9bJUmcBTFzn_XoLAkOP", + "source": { + "@timestamp": "2018-11-27T01:29:23.365Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32290", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186431, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNbJUmcBTFzn_XoLAkOP", + "source": { + "@timestamp": "2018-11-27T01:29:23.366Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32290" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186432 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdbJUmcBTFzn_XoLAkOP", + "source": { + "@timestamp": "2018-11-27T01:29:23.397Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186433, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32290" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtbLUmcBTFzn_XoLIXLc", + "source": { + "@timestamp": "2018-11-27T01:31:42.449Z", + "auditd": { + "sequence": 186437, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32307", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9bLUmcBTFzn_XoLIXLc", + "source": { + "@timestamp": "2018-11-27T01:31:42.450Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32307" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186438, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNbLUmcBTFzn_XoLIXLc", + "source": { + "@timestamp": "2018-11-27T01:31:42.481Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32307" + }, + "source": { + "ip": "107.170.65.109" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186439, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "udbLUmcBTFzn_XoLfHlZ", + "source": { + "@timestamp": "2018-11-27T01:32:05.615Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "173.167.200.227", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192532, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "562" + }, + "source": { + "ip": "173.167.200.227" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "utbLUmcBTFzn_XoLfHlZ", + "source": { + "@timestamp": "2018-11-27T01:32:05.616Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "562" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "173.167.200.227" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192533, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "173.167.200.227" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "u9bLUmcBTFzn_XoLfHlZ", + "source": { + "@timestamp": "2018-11-27T01:32:05.661Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "562", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "173.167.200.227" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "173.167.200.227", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "173.167.200.227", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192534, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtbJUmcBTFzn_XoLK0dG", + "source": { + "@timestamp": "2018-11-27T01:29:33.789Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "548", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.50.250" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "138.68.50.250", + "type": "user-session" + } + }, + "sequence": 192529, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9bJUmcBTFzn_XoLK0dG", + "source": { + "@timestamp": "2018-11-27T01:29:33.789Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "548" + }, + "source": { + "ip": "138.68.50.250" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192530, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "138.68.50.250" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNbJUmcBTFzn_XoLK0dG", + "source": { + "@timestamp": "2018-11-27T01:29:33.830Z", + "auditd": { + "sequence": 192531, + "result": "fail", + "session": "unset", + "data": { + "hostname": "138.68.50.250", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "138.68.50.250", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "548", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.50.250" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtbKUmcBTFzn_XoLRF8K", + "source": { + "@timestamp": "2018-11-27T01:30:45.664Z", + "process": { + "pid": "29595", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.249.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44189, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "138.68.249.156", + "type": "user-session", + "primary": "sshd" + } + } + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9bKUmcBTFzn_XoLRF8K", + "source": { + "@timestamp": "2018-11-27T01:30:45.664Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29595" + }, + "source": { + "ip": "138.68.249.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "138.68.249.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44190 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNbKUmcBTFzn_XoLRF8K", + "source": { + "@timestamp": "2018-11-27T01:30:45.708Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "29595", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.249.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44191, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "138.68.249.156" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "138.68.249.156", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNbKUmcBTFzn_XoL3Gzp", + "source": { + "@timestamp": "2018-11-27T01:31:24.795Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "200.160.115.234", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44192, + "result": "fail" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29609", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.160.115.234" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdbKUmcBTFzn_XoL3Gzp", + "source": { + "@timestamp": "2018-11-27T01:31:24.795Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "200.160.115.234", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44193 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29609", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.160.115.234" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gtbKUmcBTFzn_XoL3Gzp", + "source": { + "@timestamp": "2018-11-27T01:31:24.971Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44194, + "result": "fail", + "session": "unset", + "data": { + "hostname": "200.160.115.234", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "200.160.115.234", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29609", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.160.115.234" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNbKUmcBTFzn_XoLLl55", + "source": { + "@timestamp": "2018-11-27T01:30:40.139Z", + "process": { + "pid": "29592", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44188, + "result": "fail", + "session": "unset", + "data": { + "hostname": "164.132.197.108", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "164.132.197.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdbNUmcBTFzn_XoLn6nH", + "source": { + "@timestamp": "2018-11-27T01:34:25.758Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 186449, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32327", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YtbNUmcBTFzn_XoLn6nH", + "source": { + "@timestamp": "2018-11-27T01:34:25.759Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32327", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186450 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Y9bNUmcBTFzn_XoLn6nH", + "source": { + "@timestamp": "2018-11-27T01:34:25.789Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32327", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186451 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adbNUmcBTFzn_XoLo6mE", + "source": { + "@timestamp": "2018-11-27T01:34:26.614Z", + "process": { + "pid": "12750", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "101.89.114.94" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43176, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "101.89.114.94", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atbNUmcBTFzn_XoLo6mE", + "source": { + "@timestamp": "2018-11-27T01:34:26.614Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12750", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "101.89.114.94" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43177, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "101.89.114.94", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9bNUmcBTFzn_XoLo6mE", + "source": { + "@timestamp": "2018-11-27T01:34:26.814Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12750", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "101.89.114.94" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "101.89.114.94", + "type": "user-session" + } + }, + "sequence": 43178, + "result": "fail", + "session": "unset", + "data": { + "hostname": "101.89.114.94", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tbPUmcBTFzn_XoLbtDN", + "source": { + "@timestamp": "2018-11-27T01:36:24.291Z", + "process": { + "pid": "32340", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186458, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "29bPUmcBTFzn_XoLbtDN", + "source": { + "@timestamp": "2018-11-27T01:36:24.292Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186459, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32340", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3NbPUmcBTFzn_XoLbtDN", + "source": { + "@timestamp": "2018-11-27T01:36:24.322Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "process": { + "pid": "32340", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186460, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EtbOUmcBTFzn_XoLf7xx", + "source": { + "@timestamp": "2018-11-27T01:35:22.989Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186455, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32333" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E9bOUmcBTFzn_XoLf7xx", + "source": { + "@timestamp": "2018-11-27T01:35:22.990Z", + "process": { + "pid": "32333", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186456, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNbOUmcBTFzn_XoLf7xx", + "source": { + "@timestamp": "2018-11-27T01:35:23.020Z", + "process": { + "pid": "32333", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186457, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tbMUmcBTFzn_XoLzZY6", + "source": { + "@timestamp": "2018-11-27T01:33:31.856Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32317", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186443, + "result": "fail", + "session": "unset" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69bMUmcBTFzn_XoLzZY6", + "source": { + "@timestamp": "2018-11-27T01:33:31.857Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32317", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 186444, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7NbMUmcBTFzn_XoLzZY6", + "source": { + "@timestamp": "2018-11-27T01:33:31.887Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32317", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 186445, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdbMUmcBTFzn_XoLAYZs", + "source": { + "@timestamp": "2018-11-27T01:32:39.681Z", + "auditd": { + "sequence": 186440, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32315", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EtbMUmcBTFzn_XoLAYZs", + "source": { + "@timestamp": "2018-11-27T01:32:39.682Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32315", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186441, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E9bMUmcBTFzn_XoLAYZs", + "source": { + "@timestamp": "2018-11-27T01:32:39.713Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32315", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186442 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dbOUmcBTFzn_XoLD7I4", + "source": { + "@timestamp": "2018-11-27T01:34:54.285Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32330", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.228.67" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186452, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "178.33.228.67" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tbOUmcBTFzn_XoLD7I4", + "source": { + "@timestamp": "2018-11-27T01:34:54.286Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32330", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "178.33.228.67" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "178.33.228.67", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186453, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69bOUmcBTFzn_XoLD7I4", + "source": { + "@timestamp": "2018-11-27T01:34:54.394Z", + "process": { + "pid": "32330", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "178.33.228.67" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186454, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "178.33.228.67", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "178.33.228.67", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tbOUmcBTFzn_XoL_cbV", + "source": { + "@timestamp": "2018-11-27T01:35:55.371Z", + "source": { + "ip": "85.113.39.134" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "85.113.39.134", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192535, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "583" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-9bOUmcBTFzn_XoL_cbV", + "source": { + "@timestamp": "2018-11-27T01:35:55.372Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "583" + }, + "source": { + "ip": "85.113.39.134" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "sequence": 192536, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "85.113.39.134" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_NbOUmcBTFzn_XoL_cbV", + "source": { + "@timestamp": "2018-11-27T01:35:55.530Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192537, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "85.113.39.134", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "85.113.39.134" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "583", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "85.113.39.134" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xdbMUmcBTFzn_XoLx5bh", + "source": { + "@timestamp": "2018-11-27T01:33:30.481Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "131.72.141.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "131.72.141.34" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43173, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtbMUmcBTFzn_XoLx5bh", + "source": { + "@timestamp": "2018-11-27T01:33:30.485Z", + "process": { + "pid": "12742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "131.72.141.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43174, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "131.72.141.34", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "x9bMUmcBTFzn_XoLx5bh", + "source": { + "@timestamp": "2018-11-27T01:33:30.637Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "131.72.141.34", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "131.72.141.34", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43175, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "131.72.141.34" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WtbNUmcBTFzn_XoLcqUk", + "source": { + "@timestamp": "2018-11-27T01:34:14.073Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32325", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.33.178" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.38.33.178", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186446, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9bNUmcBTFzn_XoLcqUk", + "source": { + "@timestamp": "2018-11-27T01:34:14.075Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32325" + }, + "source": { + "ip": "51.38.33.178" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.38.33.178", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 186447 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNbNUmcBTFzn_XoLcqUk", + "source": { + "@timestamp": "2018-11-27T01:34:14.182Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32325" + }, + "source": { + "ip": "51.38.33.178" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.38.33.178", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186448, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.38.33.178" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9bQUmcBTFzn_XoLRuMO", + "source": { + "@timestamp": "2018-11-27T01:37:19.393Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12766", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "117.172.59.127" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "117.172.59.127" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43182 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNbQUmcBTFzn_XoLRuMO", + "source": { + "@timestamp": "2018-11-27T01:37:19.393Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12766" + }, + "source": { + "ip": "117.172.59.127" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "117.172.59.127", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43183, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XdbQUmcBTFzn_XoLRuMO", + "source": { + "@timestamp": "2018-11-27T01:37:19.649Z", + "process": { + "pid": "12766", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "117.172.59.127" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "117.172.59.127" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "117.172.59.127" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43184, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "otbQUmcBTFzn_XoLVOSA", + "source": { + "@timestamp": "2018-11-27T01:37:23.093Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12773", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.85.206" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43185, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "193.70.85.206" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "193.70.85.206", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtbQUmcBTFzn_XoLaudn", + "source": { + "@timestamp": "2018-11-27T01:37:28.701Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32348" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186461, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "B9bQUmcBTFzn_XoLaudn", + "source": { + "@timestamp": "2018-11-27T01:37:28.702Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186462, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32348" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNbQUmcBTFzn_XoLaudn", + "source": { + "@timestamp": "2018-11-27T01:37:28.734Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32348" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186463, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E9bRUmcBTFzn_XoLKPdd", + "source": { + "@timestamp": "2018-11-27T01:38:17.330Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19716" + }, + "source": { + "ip": "93.157.241.40" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "93.157.241.40", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142343, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNbRUmcBTFzn_XoLKPdd", + "source": { + "@timestamp": "2018-11-27T01:38:17.331Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19716", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "93.157.241.40" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "93.157.241.40", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142344, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdbRUmcBTFzn_XoLKPdd", + "source": { + "@timestamp": "2018-11-27T01:38:17.539Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19716", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "93.157.241.40" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "93.157.241.40", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "93.157.241.40", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142345, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qNbPUmcBTFzn_XoL8dwD", + "source": { + "@timestamp": "2018-11-27T01:36:57.625Z", + "process": { + "pid": "25824", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "94.23.0.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "94.23.0.13", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184365, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qdbPUmcBTFzn_XoL8dwD", + "source": { + "@timestamp": "2018-11-27T01:36:57.626Z", + "source": { + "ip": "94.23.0.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "94.23.0.13" + } + }, + "sequence": 184366, + "result": "fail" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25824", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtbPUmcBTFzn_XoL8dwD", + "source": { + "@timestamp": "2018-11-27T01:36:57.733Z", + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25824" + }, + "source": { + "ip": "94.23.0.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184367, + "result": "fail", + "session": "unset", + "data": { + "hostname": "94.23.0.13", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "94.23.0.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "T9bQUmcBTFzn_XoLQeNm", + "source": { + "@timestamp": "2018-11-27T01:37:18.204Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.203.185.59", + "type": "user-session" + } + }, + "sequence": 192544 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "595", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.185.59" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UNbQUmcBTFzn_XoLQeNm", + "source": { + "@timestamp": "2018-11-27T01:37:18.205Z", + "process": { + "pid": "595", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.185.59" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192545, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "159.203.185.59" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UdbQUmcBTFzn_XoLQeNm", + "source": { + "@timestamp": "2018-11-27T01:37:18.237Z", + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "159.203.185.59", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192546, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "159.203.185.59" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "595", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.185.59" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RdbQUmcBTFzn_XoLGOA5", + "source": { + "@timestamp": "2018-11-27T01:37:07.663Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "593", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.242.169.217" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "82.242.169.217", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192541, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RtbQUmcBTFzn_XoLGOA5", + "source": { + "@timestamp": "2018-11-27T01:37:07.664Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "82.242.169.217", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192542, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "593", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.242.169.217" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R9bQUmcBTFzn_XoLGOA5", + "source": { + "@timestamp": "2018-11-27T01:37:08.073Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "593", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.242.169.217" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192543, + "result": "fail", + "session": "unset", + "data": { + "hostname": "82.242.169.217", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "82.242.169.217", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtbPUmcBTFzn_XoL29qM", + "source": { + "@timestamp": "2018-11-27T01:36:52.130Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "91.230.8.194", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 192538 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "591" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "91.230.8.194" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9bPUmcBTFzn_XoL29qM", + "source": { + "@timestamp": "2018-11-27T01:36:52.131Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "591", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.230.8.194" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "91.230.8.194", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192539 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNbPUmcBTFzn_XoL29qM", + "source": { + "@timestamp": "2018-11-27T01:36:52.258Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "91.230.8.194", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "91.230.8.194", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192540 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "591", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.230.8.194" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vtbQUmcBTFzn_XoLKeAA", + "source": { + "@timestamp": "2018-11-27T01:37:11.956Z", + "source": { + "ip": "51.254.201.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "51.254.201.64" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 43179, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12764", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "v9bQUmcBTFzn_XoLKeAA", + "source": { + "@timestamp": "2018-11-27T01:37:11.956Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12764", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.254.201.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.254.201.64", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43180, + "result": "fail" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wNbQUmcBTFzn_XoLKeAA", + "source": { + "@timestamp": "2018-11-27T01:37:12.064Z", + "process": { + "pid": "12764", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.254.201.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43181, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "51.254.201.64", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "51.254.201.64" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltbQUmcBTFzn_XoL3fAn", + "source": { + "@timestamp": "2018-11-27T01:37:58.076Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "46.17.40.237", + "type": "user-session" + } + }, + "sequence": 142342, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "46.17.40.237" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19713", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.17.40.237" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VtfUUmcBTFzn_XoLxEaR", + "source": { + "@timestamp": "2018-11-27T01:42:13.909Z", + "source": { + "ip": "147.75.96.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "147.75.96.90", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44195, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29821", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9fUUmcBTFzn_XoLxEaR", + "source": { + "@timestamp": "2018-11-27T01:42:13.913Z", + "source": { + "ip": "147.75.96.90" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44196, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "147.75.96.90", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29821" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WNfUUmcBTFzn_XoLxEaR", + "source": { + "@timestamp": "2018-11-27T01:42:13.945Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29821" + }, + "source": { + "ip": "147.75.96.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44197, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "147.75.96.90", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "147.75.96.90" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wtfUUmcBTFzn_XoLzEYU", + "source": { + "@timestamp": "2018-11-27T01:42:15.845Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29824", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.4.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44198, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "144.217.4.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "w9fUUmcBTFzn_XoLzEYU", + "source": { + "@timestamp": "2018-11-27T01:42:15.845Z", + "process": { + "pid": "29824", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.4.14" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44199, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "144.217.4.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xNfUUmcBTFzn_XoLzEYU", + "source": { + "@timestamp": "2018-11-27T01:42:15.889Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29824", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.4.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44200, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "144.217.4.14" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "144.217.4.14", + "type": "user-session" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NfUUmcBTFzn_XoL0Ubg", + "source": { + "@timestamp": "2018-11-27T01:42:17.334Z", + "process": { + "pid": "19742", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "192.252.209.190" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "secondary": "192.252.209.190", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 142355 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dfUUmcBTFzn_XoL0Ubg", + "source": { + "@timestamp": "2018-11-27T01:42:17.335Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "192.252.209.190", + "type": "user-session" + } + }, + "sequence": 142356, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.252.209.190" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0tfUUmcBTFzn_XoL0Ubg", + "source": { + "@timestamp": "2018-11-27T01:42:17.366Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.252.209.190" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142357, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "192.252.209.190" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "192.252.209.190", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tNfUUmcBTFzn_XoLIDfE", + "source": { + "@timestamp": "2018-11-27T01:41:31.994Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19739", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.196.12.151" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "82.196.12.151", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142352, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tdfUUmcBTFzn_XoLIDfE", + "source": { + "@timestamp": "2018-11-27T01:41:31.995Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "82.196.12.151", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142353, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19739", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.196.12.151" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ttfUUmcBTFzn_XoLIDfE", + "source": { + "@timestamp": "2018-11-27T01:41:32.100Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19739", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.196.12.151" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142354, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "82.196.12.151" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "82.196.12.151", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dfVUmcBTFzn_XoLRFCU", + "source": { + "@timestamp": "2018-11-27T01:42:46.698Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "202.28.34.200", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 184380 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25911", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tfVUmcBTFzn_XoLRFCU", + "source": { + "@timestamp": "2018-11-27T01:42:46.700Z", + "auditd": { + "sequence": 184381, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "202.28.34.200", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25911" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_9fVUmcBTFzn_XoLRFCU", + "source": { + "@timestamp": "2018-11-27T01:42:46.932Z", + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "202.28.34.200" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "202.28.34.200", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184382, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "25911", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANfUUmcBTFzn_XoL5ElJ", + "source": { + "@timestamp": "2018-11-27T01:42:22.047Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25908" + }, + "source": { + "ip": "104.234.223.14" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.234.223.14", + "type": "user-session" + } + }, + "sequence": 184377, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdfUUmcBTFzn_XoL5ElJ", + "source": { + "@timestamp": "2018-11-27T01:42:22.048Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.234.223.14", + "type": "user-session" + } + }, + "sequence": 184378, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25908", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.234.223.14" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtfUUmcBTFzn_XoL5ElJ", + "source": { + "@timestamp": "2018-11-27T01:42:22.097Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "25908", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.234.223.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184379, + "result": "fail", + "session": "unset", + "data": { + "hostname": "104.234.223.14", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.234.223.14", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79fUUmcBTFzn_XoLuUSW", + "source": { + "@timestamp": "2018-11-27T01:42:11.115Z", + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186479, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32381", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NfUUmcBTFzn_XoLuUSW", + "source": { + "@timestamp": "2018-11-27T01:42:11.116Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32381", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186480, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8dfUUmcBTFzn_XoLuUSW", + "source": { + "@timestamp": "2018-11-27T01:42:11.146Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32381", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186481, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntfUUmcBTFzn_XoLPzou", + "source": { + "@timestamp": "2018-11-27T01:41:39.780Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25901", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.91.116.197" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "185.91.116.197", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184374, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9fUUmcBTFzn_XoLPzou", + "source": { + "@timestamp": "2018-11-27T01:41:39.781Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25901", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.91.116.197" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "185.91.116.197", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184375, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNfUUmcBTFzn_XoLPzou", + "source": { + "@timestamp": "2018-11-27T01:41:39.902Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25901" + }, + "source": { + "ip": "185.91.116.197" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "185.91.116.197", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "185.91.116.197", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 184376, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdfUUmcBTFzn_XoLaj6n", + "source": { + "@timestamp": "2018-11-27T01:41:50.908Z", + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32377" + }, + "source": { + "ip": "37.187.113.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186476, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "37.187.113.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TtfUUmcBTFzn_XoLaj6n", + "source": { + "@timestamp": "2018-11-27T01:41:50.909Z", + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186477, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "37.187.113.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32377" + }, + "source": { + "ip": "37.187.113.229" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "T9fUUmcBTFzn_XoLaj6n", + "source": { + "@timestamp": "2018-11-27T01:41:51.016Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32377", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.113.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "37.187.113.229" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "37.187.113.229" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186478, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdfVUmcBTFzn_XoLildy", + "source": { + "@timestamp": "2018-11-27T01:43:04.584Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "92.222.47.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184383, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "25918", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "92.222.47.243" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gtfVUmcBTFzn_XoLildy", + "source": { + "@timestamp": "2018-11-27T01:43:04.585Z", + "source": { + "ip": "92.222.47.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "92.222.47.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184384, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25918", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "g9fVUmcBTFzn_XoLildy", + "source": { + "@timestamp": "2018-11-27T01:43:04.690Z", + "source": { + "ip": "92.222.47.243" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "92.222.47.243", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "92.222.47.243", + "type": "user-session" + } + }, + "sequence": 184385, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25918" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tfUUmcBTFzn_XoL-0sw", + "source": { + "@timestamp": "2018-11-27T01:42:27.906Z", + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "185.21.16.108", + "type": "user-session" + } + }, + "sequence": 44201, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "29828", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.21.16.108" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79fUUmcBTFzn_XoL-0sw", + "source": { + "@timestamp": "2018-11-27T01:42:27.906Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "29828", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.21.16.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "185.21.16.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44202, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NfUUmcBTFzn_XoL-0sw", + "source": { + "@timestamp": "2018-11-27T01:42:28.038Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29828", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.21.16.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "185.21.16.108", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "185.21.16.108" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44203, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNfcUmcBTFzn_XoLuPTT", + "source": { + "@timestamp": "2018-11-27T01:50:55.209Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32438" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186506, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdfcUmcBTFzn_XoLuPTT", + "source": { + "@timestamp": "2018-11-27T01:50:55.210Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186507, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32438" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NtfcUmcBTFzn_XoLuPTT", + "source": { + "@timestamp": "2018-11-27T01:50:55.240Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32438", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186508, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OtfcUmcBTFzn_XoLu_Sp", + "source": { + "@timestamp": "2018-11-27T01:50:55.885Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.80.6.244", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142382, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19808", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.80.6.244" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "O9fcUmcBTFzn_XoLu_Sp", + "source": { + "@timestamp": "2018-11-27T01:50:55.886Z", + "source": { + "ip": "178.80.6.244" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "178.80.6.244" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142383, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19808", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PNfcUmcBTFzn_XoLu_Sp", + "source": { + "@timestamp": "2018-11-27T01:50:56.100Z", + "auditd": { + "data": { + "hostname": "178.80.6.244", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "178.80.6.244" + } + }, + "sequence": 142384, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19808", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.80.6.244" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ttfaUmcBTFzn_XoL780P", + "source": { + "@timestamp": "2018-11-27T01:48:58.021Z", + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.236.181.158" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142376, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19793", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "t9faUmcBTFzn_XoL780P", + "source": { + "@timestamp": "2018-11-27T01:48:58.022Z", + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "104.236.181.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142377, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19793", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "uNfaUmcBTFzn_XoL780P", + "source": { + "@timestamp": "2018-11-27T01:48:58.064Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "104.236.181.158" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "104.236.181.158" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142378, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19793", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tNfbUmcBTFzn_XoLTdQu", + "source": { + "@timestamp": "2018-11-27T01:49:22.116Z", + "process": { + "pid": "19795", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "153.142.75.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "secondary": "153.142.75.192", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 142379 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tdfbUmcBTFzn_XoLTdQu", + "source": { + "@timestamp": "2018-11-27T01:49:22.117Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19795", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "153.142.75.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142380, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "153.142.75.192", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ttfbUmcBTFzn_XoLTdQu", + "source": { + "@timestamp": "2018-11-27T01:49:22.274Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19795", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "153.142.75.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "153.142.75.192" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "153.142.75.192", + "type": "user-session" + } + }, + "sequence": 142381, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GtfaUmcBTFzn_XoLLr2X", + "source": { + "@timestamp": "2018-11-27T01:48:08.749Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19785", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "190.0.10.138" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 142373, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9faUmcBTFzn_XoLLr2X", + "source": { + "@timestamp": "2018-11-27T01:48:08.750Z", + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "190.0.10.138", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142374 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19785", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNfaUmcBTFzn_XoLLr2X", + "source": { + "@timestamp": "2018-11-27T01:48:08.857Z", + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142375, + "result": "fail", + "session": "unset", + "data": { + "hostname": "190.0.10.138", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "190.0.10.138" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19785", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9faUmcBTFzn_XoLbcKr", + "source": { + "@timestamp": "2018-11-27T01:48:24.897Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32420" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186500, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNfaUmcBTFzn_XoLbcKr", + "source": { + "@timestamp": "2018-11-27T01:48:24.899Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186501, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32420" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdfaUmcBTFzn_XoLbcKr", + "source": { + "@timestamp": "2018-11-27T01:48:24.929Z", + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186502, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32420", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItfZUmcBTFzn_XoLRqn8", + "source": { + "@timestamp": "2018-11-27T01:47:09.456Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32412" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186497, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9fZUmcBTFzn_XoLRqn8", + "source": { + "@timestamp": "2018-11-27T01:47:09.457Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32412", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186498, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNfZUmcBTFzn_XoLRqn8", + "source": { + "@timestamp": "2018-11-27T01:47:09.491Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32412", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186499, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtfbUmcBTFzn_XoLltt6", + "source": { + "@timestamp": "2018-11-27T01:49:40.879Z", + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186503, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32428", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9fbUmcBTFzn_XoLltt6", + "source": { + "@timestamp": "2018-11-27T01:49:40.881Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32428" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186504 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNfbUmcBTFzn_XoLltt6", + "source": { + "@timestamp": "2018-11-27T01:49:40.911Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186505, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32428" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNfZUmcBTFzn_XoL6LbT", + "source": { + "@timestamp": "2018-11-27T01:47:50.888Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19783", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "176.31.75.53" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142370, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "176.31.75.53" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdfZUmcBTFzn_XoL6LbT", + "source": { + "@timestamp": "2018-11-27T01:47:50.889Z", + "source": { + "ip": "176.31.75.53" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142371, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "176.31.75.53", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19783", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztfZUmcBTFzn_XoL6LbT", + "source": { + "@timestamp": "2018-11-27T01:47:50.996Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "176.31.75.53" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "176.31.75.53", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142372, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19783", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "176.31.75.53" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dfcUmcBTFzn_XoLVuuz", + "source": { + "@timestamp": "2018-11-27T01:50:30.087Z", + "source": { + "ip": "178.33.45.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44204, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.45.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29987" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tfcUmcBTFzn_XoLVuuz", + "source": { + "@timestamp": "2018-11-27T01:50:30.087Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "29987", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.45.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.45.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44205, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69fcUmcBTFzn_XoLVuuz", + "source": { + "@timestamp": "2018-11-27T01:50:30.195Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29987", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.45.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44206, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "178.33.45.156" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "178.33.45.156", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "i9jhUmcBTFzn_XoLAlEZ", + "source": { + "@timestamp": "2018-11-27T01:55:36.110Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26002" + }, + "source": { + "ip": "178.48.181.9" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "178.48.181.9", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 184395 + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jNjhUmcBTFzn_XoLAlEZ", + "source": { + "@timestamp": "2018-11-27T01:55:36.111Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26002" + }, + "source": { + "ip": "178.48.181.9" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184396, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "178.48.181.9", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jdjhUmcBTFzn_XoLAlEZ", + "source": { + "@timestamp": "2018-11-27T01:55:36.272Z", + "source": { + "ip": "178.48.181.9" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184397, + "result": "fail", + "session": "unset", + "data": { + "hostname": "178.48.181.9", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "178.48.181.9" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26002" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNjhUmcBTFzn_XoLBFLi", + "source": { + "@timestamp": "2018-11-27T01:55:36.824Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186518, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32466", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HdjhUmcBTFzn_XoLBFLi", + "source": { + "@timestamp": "2018-11-27T01:55:36.825Z", + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32466", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186519, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HtjhUmcBTFzn_XoLBFLi", + "source": { + "@timestamp": "2018-11-27T01:55:36.858Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186520, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32466", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9jhUmcBTFzn_XoLml-F", + "source": { + "@timestamp": "2018-11-27T01:56:15.131Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "83.99.24.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186524, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32470", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "83.99.24.14" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNjhUmcBTFzn_XoLml-F", + "source": { + "@timestamp": "2018-11-27T01:56:15.132Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32470" + }, + "source": { + "ip": "83.99.24.14" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "83.99.24.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186525, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdjhUmcBTFzn_XoLml-F", + "source": { + "@timestamp": "2018-11-27T01:56:15.245Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32470", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "83.99.24.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "83.99.24.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186526, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "83.99.24.14" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YtjhUmcBTFzn_XoLml-F", + "source": { + "@timestamp": "2018-11-27T01:56:15.822Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "51.38.68.237" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186527, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32472", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.68.237" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Y9jhUmcBTFzn_XoLml-F", + "source": { + "@timestamp": "2018-11-27T01:56:15.823Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32472", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "51.38.68.237" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186528, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "51.38.68.237" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZNjhUmcBTFzn_XoLml-F", + "source": { + "@timestamp": "2018-11-27T01:56:15.930Z", + "auditd": { + "sequence": 186529, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "51.38.68.237" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "51.38.68.237" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32472" + }, + "source": { + "ip": "51.38.68.237" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jNjgUmcBTFzn_XoL304M", + "source": { + "@timestamp": "2018-11-27T01:55:27.134Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30088", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.142.225" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "91.121.142.225", + "type": "user-session" + } + }, + "sequence": 44210, + "result": "fail" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jdjgUmcBTFzn_XoL304M", + "source": { + "@timestamp": "2018-11-27T01:55:27.134Z", + "process": { + "pid": "30088", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "91.121.142.225" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "91.121.142.225" + } + }, + "sequence": 44211 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jtjgUmcBTFzn_XoL304M", + "source": { + "@timestamp": "2018-11-27T01:55:27.238Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30088", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.142.225" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "91.121.142.225" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "91.121.142.225" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44212, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "j9jgUmcBTFzn_XoL304M", + "source": { + "@timestamp": "2018-11-27T01:55:27.846Z", + "source": { + "ip": "104.234.223.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44213, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "104.234.223.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "30090", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kNjgUmcBTFzn_XoL304M", + "source": { + "@timestamp": "2018-11-27T01:55:27.850Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "104.234.223.14", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44214 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30090" + }, + "source": { + "ip": "104.234.223.14" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdjgUmcBTFzn_XoL304M", + "source": { + "@timestamp": "2018-11-27T01:55:27.898Z", + "process": { + "pid": "30090", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.234.223.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44215, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "104.234.223.14", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.234.223.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vNjfUmcBTFzn_XoL8jpi", + "source": { + "@timestamp": "2018-11-27T01:54:26.552Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32457", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186515, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vdjfUmcBTFzn_XoL8jpi", + "source": { + "@timestamp": "2018-11-27T01:54:26.553Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32457" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186516, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vtjfUmcBTFzn_XoL8jpi", + "source": { + "@timestamp": "2018-11-27T01:54:26.584Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186517, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32457", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59jgUmcBTFzn_XoLk0ht", + "source": { + "@timestamp": "2018-11-27T01:55:07.779Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "65.127.203.242", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142395, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19840", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "65.127.203.242" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NjgUmcBTFzn_XoLk0ht", + "source": { + "@timestamp": "2018-11-27T01:55:07.780Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19840", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "65.127.203.242" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "65.127.203.242", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142396, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6djgUmcBTFzn_XoLk0ht", + "source": { + "@timestamp": "2018-11-27T01:55:07.840Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19840", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "65.127.203.242" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "65.127.203.242", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 142397, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "65.127.203.242", + "terminal": "ssh" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "P9jhUmcBTFzn_XoLbFvp", + "source": { + "@timestamp": "2018-11-27T01:56:03.454Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.197.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186521 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32468", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QNjhUmcBTFzn_XoLbFvp", + "source": { + "@timestamp": "2018-11-27T01:56:03.455Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32468", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "164.132.197.108" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186522, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdjhUmcBTFzn_XoLbFvp", + "source": { + "@timestamp": "2018-11-27T01:56:03.574Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "hostname": "164.132.197.108", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "164.132.197.108", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186523, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32468", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kNjgUmcBTFzn_XoLv0zp", + "source": { + "@timestamp": "2018-11-27T01:55:19.167Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "752", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "36.84.80.31" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "36.84.80.31", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192556, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdjgUmcBTFzn_XoLv0zp", + "source": { + "@timestamp": "2018-11-27T01:55:19.168Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192557, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "36.84.80.31", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "752", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "36.84.80.31" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktjgUmcBTFzn_XoLv0zp", + "source": { + "@timestamp": "2018-11-27T01:55:19.429Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "36.84.80.31" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "36.84.80.31", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192558 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "752", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "36.84.80.31" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_NjhUmcBTFzn_XoLd1s3", + "source": { + "@timestamp": "2018-11-27T01:56:06.089Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "197.149.137.86", + "type": "user-session" + } + }, + "sequence": 44216, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30106", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "197.149.137.86" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_djhUmcBTFzn_XoLd1s3", + "source": { + "@timestamp": "2018-11-27T01:56:06.089Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30106", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "197.149.137.86" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "197.149.137.86", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44217, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tjhUmcBTFzn_XoLd1s3", + "source": { + "@timestamp": "2018-11-27T01:56:06.317Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30106", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "197.149.137.86" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "197.149.137.86", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44218, + "result": "fail", + "session": "unset", + "data": { + "hostname": "197.149.137.86", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JtjhUmcBTFzn_XoL7GYK", + "source": { + "@timestamp": "2018-11-27T01:56:36.000Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26010", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.191.209" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184398, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "54.37.191.209" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "54.37.191.209", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NtjlUmcBTFzn_XoLuLrU", + "source": { + "@timestamp": "2018-11-27T02:00:45.031Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26032", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.145.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.145.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184399, + "result": "fail", + "session": "unset" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9jlUmcBTFzn_XoLuLrU", + "source": { + "@timestamp": "2018-11-27T02:00:45.032Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "26032", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.145.205" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.145.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184400 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONjlUmcBTFzn_XoLuLrU", + "source": { + "@timestamp": "2018-11-27T02:00:45.255Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "128.199.145.205", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "128.199.145.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184401 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26032", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "128.199.145.205" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdjlUmcBTFzn_XoLubrj", + "source": { + "@timestamp": "2018-11-27T02:00:45.301Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32510" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186545, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OtjlUmcBTFzn_XoLubrj", + "source": { + "@timestamp": "2018-11-27T02:00:45.302Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186546 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32510" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "O9jlUmcBTFzn_XoLubrj", + "source": { + "@timestamp": "2018-11-27T02:00:45.333Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186547, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32510", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R9jlUmcBTFzn_XoLvrqH", + "source": { + "@timestamp": "2018-11-27T02:00:46.487Z", + "source": { + "ip": "51.254.140.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43217, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "51.254.140.108" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12917", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNjlUmcBTFzn_XoLvrqH", + "source": { + "@timestamp": "2018-11-27T02:00:46.487Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12917", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "51.254.140.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43218, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "51.254.140.108" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdjlUmcBTFzn_XoLvrqH", + "source": { + "@timestamp": "2018-11-27T02:00:46.595Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12917", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.254.140.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43219, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "51.254.140.108", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "51.254.140.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StjlUmcBTFzn_XoLvrqH", + "source": { + "@timestamp": "2018-11-27T02:00:47.131Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12919", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "79.133.56.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "79.133.56.139", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43220, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9jlUmcBTFzn_XoLvrqH", + "source": { + "@timestamp": "2018-11-27T02:00:47.135Z", + "process": { + "pid": "12919", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "79.133.56.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "79.133.56.139", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 43221 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNjlUmcBTFzn_XoLvrqH", + "source": { + "@timestamp": "2018-11-27T02:00:47.243Z", + "source": { + "ip": "79.133.56.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "79.133.56.139" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "79.133.56.139" + } + }, + "sequence": 43222 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12919" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wdjmUmcBTFzn_XoL8NQE", + "source": { + "@timestamp": "2018-11-27T02:02:04.698Z", + "process": { + "pid": "19884", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "50.71.229.131" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "50.71.229.131", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142407 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wtjmUmcBTFzn_XoL8NQE", + "source": { + "@timestamp": "2018-11-27T02:02:04.699Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19884", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "50.71.229.131" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142408, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "50.71.229.131", + "type": "user-session", + "primary": "sshd" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "w9jmUmcBTFzn_XoL8NQE", + "source": { + "@timestamp": "2018-11-27T02:02:04.762Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "50.71.229.131" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142409, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "50.71.229.131", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "50.71.229.131", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19884", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xdjmUmcBTFzn_XoL8tSP", + "source": { + "@timestamp": "2018-11-27T02:02:05.349Z", + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32513" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186548, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtjmUmcBTFzn_XoL8tSP", + "source": { + "@timestamp": "2018-11-27T02:02:05.350Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32513" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186549, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "x9jmUmcBTFzn_XoL8tSP", + "source": { + "@timestamp": "2018-11-27T02:02:05.381Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32513", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186550, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9jlUmcBTFzn_XoLPq9B", + "source": { + "@timestamp": "2018-11-27T02:00:13.654Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142398, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "217.182.55.191", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19871", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.182.55.191" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WNjlUmcBTFzn_XoLPq9B", + "source": { + "@timestamp": "2018-11-27T02:00:13.656Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "217.182.55.191", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142399, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19871", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.182.55.191" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WdjlUmcBTFzn_XoLPq9B", + "source": { + "@timestamp": "2018-11-27T02:00:13.762Z", + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19871", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.182.55.191" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142400, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "217.182.55.191", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "217.182.55.191", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4djmUmcBTFzn_XoLT8Yc", + "source": { + "@timestamp": "2018-11-27T02:01:23.506Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "91.121.110.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142401, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19879" + }, + "source": { + "ip": "91.121.110.50" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4tjmUmcBTFzn_XoLT8Yc", + "source": { + "@timestamp": "2018-11-27T02:01:23.507Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142402, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "91.121.110.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19879", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "91.121.110.50" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "49jmUmcBTFzn_XoLT8Yc", + "source": { + "@timestamp": "2018-11-27T02:01:23.614Z", + "auditd": { + "session": "unset", + "data": { + "hostname": "91.121.110.50", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "91.121.110.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142403, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19879", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.110.50" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktjnUmcBTFzn_XoLvuUr", + "source": { + "@timestamp": "2018-11-27T02:02:57.473Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32520" + }, + "source": { + "ip": "213.191.147.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "213.191.147.66" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186551, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "k9jnUmcBTFzn_XoLvuUr", + "source": { + "@timestamp": "2018-11-27T02:02:57.474Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186552, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "213.191.147.66", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32520", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "213.191.147.66" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lNjnUmcBTFzn_XoLvuUr", + "source": { + "@timestamp": "2018-11-27T02:02:57.617Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32520", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "213.191.147.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186553, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "213.191.147.66" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "213.191.147.66", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tjmUmcBTFzn_XoLlMzO", + "source": { + "@timestamp": "2018-11-27T02:01:41.348Z", + "source": { + "ip": "211.219.52.136" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "211.219.52.136", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142404, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19881", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79jmUmcBTFzn_XoLlMzO", + "source": { + "@timestamp": "2018-11-27T02:01:41.349Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19881", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.219.52.136" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "211.219.52.136", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142405 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NjmUmcBTFzn_XoLlMzO", + "source": { + "@timestamp": "2018-11-27T02:01:41.509Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19881", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.219.52.136" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "211.219.52.136", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142406, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "211.219.52.136", + "terminal": "ssh" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9joUmcBTFzn_XoLK-92", + "source": { + "@timestamp": "2018-11-27T02:03:25.452Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32523" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186554, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNjoUmcBTFzn_XoLK-92", + "source": { + "@timestamp": "2018-11-27T02:03:25.453Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32523" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186555 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idjoUmcBTFzn_XoLK-92", + "source": { + "@timestamp": "2018-11-27T02:03:25.484Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32523", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186556 + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtjoUmcBTFzn_XoLAuyv", + "source": { + "@timestamp": "2018-11-27T02:03:15.008Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "191.255.74.211", + "type": "user-session" + } + }, + "sequence": 43223 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12938", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "191.255.74.211" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9joUmcBTFzn_XoLAuyv", + "source": { + "@timestamp": "2018-11-27T02:03:15.008Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "191.255.74.211" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43224 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12938", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "191.255.74.211" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNjoUmcBTFzn_XoLAuyv", + "source": { + "@timestamp": "2018-11-27T02:03:15.172Z", + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "data": { + "hostname": "191.255.74.211", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "191.255.74.211", + "type": "user-session" + } + }, + "sequence": 43225, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12938", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "191.255.74.211" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9jlUmcBTFzn_XoLX7Lz", + "source": { + "@timestamp": "2018-11-27T02:00:22.277Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "152.115.61.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44222, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "152.115.61.52", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30191", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNjlUmcBTFzn_XoLX7Lz", + "source": { + "@timestamp": "2018-11-27T02:00:22.277Z", + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "152.115.61.52" + } + }, + "sequence": 44223, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30191", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.115.61.52" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GdjlUmcBTFzn_XoLX7Lz", + "source": { + "@timestamp": "2018-11-27T02:00:22.397Z", + "process": { + "pid": "30191", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.115.61.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "152.115.61.52", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "152.115.61.52" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44224 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtnuUmcBTFzn_XoLAnDn", + "source": { + "@timestamp": "2018-11-27T02:09:48.280Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30394" + }, + "source": { + "ip": "185.227.110.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.227.110.251" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44237, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "B9nuUmcBTFzn_XoLAnDn", + "source": { + "@timestamp": "2018-11-27T02:09:48.280Z", + "source": { + "ip": "185.227.110.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44238, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "185.227.110.251", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30394" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNnuUmcBTFzn_XoLAnDn", + "source": { + "@timestamp": "2018-11-27T02:09:48.468Z", + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30394", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.227.110.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "185.227.110.251" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "185.227.110.251", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44239, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9nuUmcBTFzn_XoLDHBr", + "source": { + "@timestamp": "2018-11-27T02:09:50.721Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "218.149.228.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "218.149.228.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184418, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26142", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNnuUmcBTFzn_XoLDHBr", + "source": { + "@timestamp": "2018-11-27T02:09:50.722Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26142", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "218.149.228.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "218.149.228.158", + "type": "user-session" + } + }, + "sequence": 184419, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdnuUmcBTFzn_XoLDHBr", + "source": { + "@timestamp": "2018-11-27T02:09:51.346Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184420, + "result": "fail", + "session": "unset", + "data": { + "hostname": "218.149.228.158", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "218.149.228.158" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26142", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "218.149.228.158" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79ntUmcBTFzn_XoLGltv", + "source": { + "@timestamp": "2018-11-27T02:08:48.772Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186566, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32556", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NntUmcBTFzn_XoLGltv", + "source": { + "@timestamp": "2018-11-27T02:08:48.774Z", + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186567, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32556", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8dntUmcBTFzn_XoLGltv", + "source": { + "@timestamp": "2018-11-27T02:08:48.804Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186568, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32556", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99ntUmcBTFzn_XoLHFsj", + "source": { + "@timestamp": "2018-11-27T02:08:49.207Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184409, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "145.239.82.62", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26086", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "145.239.82.62" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NntUmcBTFzn_XoLHFsj", + "source": { + "@timestamp": "2018-11-27T02:08:49.208Z", + "auditd": { + "sequence": 184410, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "145.239.82.62", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26086", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "145.239.82.62" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dntUmcBTFzn_XoLHFsj", + "source": { + "@timestamp": "2018-11-27T02:08:49.341Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26086" + }, + "source": { + "ip": "145.239.82.62" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "145.239.82.62", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184411, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "145.239.82.62" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNntUmcBTFzn_XoLc2Oa", + "source": { + "@timestamp": "2018-11-27T02:09:11.600Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19924", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "109.115.54.245" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142413, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "109.115.54.245", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CdntUmcBTFzn_XoLc2Oa", + "source": { + "@timestamp": "2018-11-27T02:09:11.601Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "109.115.54.245", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142414, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19924" + }, + "source": { + "ip": "109.115.54.245" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtntUmcBTFzn_XoLc2Oa", + "source": { + "@timestamp": "2018-11-27T02:09:11.721Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19924", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "109.115.54.245" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "109.115.54.245", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "109.115.54.245", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142415 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RNnuUmcBTFzn_XoLWnfO", + "source": { + "@timestamp": "2018-11-27T02:10:10.787Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32565" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186569, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RdnuUmcBTFzn_XoLWnfO", + "source": { + "@timestamp": "2018-11-27T02:10:10.788Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186570, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32565", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RtnuUmcBTFzn_XoLWnfO", + "source": { + "@timestamp": "2018-11-27T02:10:10.819Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32565", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186571, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdntUmcBTFzn_XoLiGV_", + "source": { + "@timestamp": "2018-11-27T02:09:16.902Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19926", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "71.90.181.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142416, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "71.90.181.64", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtntUmcBTFzn_XoLiGV_", + "source": { + "@timestamp": "2018-11-27T02:09:16.903Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19926", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "71.90.181.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "71.90.181.64", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142417 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A9ntUmcBTFzn_XoLiGV_", + "source": { + "@timestamp": "2018-11-27T02:09:16.974Z", + "auditd": { + "sequence": 142418, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "71.90.181.64" + }, + "summary": { + "object": { + "secondary": "71.90.181.64", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19926", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "71.90.181.64" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tntUmcBTFzn_XoLSl-h", + "source": { + "@timestamp": "2018-11-27T02:09:01.110Z", + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "830", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192568, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:accounting", + "acct": "root" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "29ntUmcBTFzn_XoLSl-h", + "source": { + "@timestamp": "2018-11-27T02:09:01.110Z", + "auditd": { + "sequence": 192569, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "830", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3NntUmcBTFzn_XoLSl-h", + "source": { + "@timestamp": "2018-11-27T02:09:01.112Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "830", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "op": "PAM:session_open", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 192571, + "result": "success", + "session": "9864" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_start", + "action": "started-session" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3dntUmcBTFzn_XoLSl-h", + "source": { + "@timestamp": "2018-11-27T02:09:01.215Z", + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "830", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192572, + "result": "success", + "session": "9864", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3tntUmcBTFzn_XoLSl-h", + "source": { + "@timestamp": "2018-11-27T02:09:01.216Z", + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "830", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "op": "PAM:session_close", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192573, + "result": "success", + "session": "9864" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "ended-session", + "module": "auditd", + "category": "user-login", + "type": "user_end" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dntUmcBTFzn_XoLTV_Y", + "source": { + "@timestamp": "2018-11-27T02:09:01.933Z", + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26094", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184412, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:accounting", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tntUmcBTFzn_XoLTV_Y", + "source": { + "@timestamp": "2018-11-27T02:09:01.933Z", + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26094", + "exe": "/usr/sbin/cron" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184413, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_9ntUmcBTFzn_XoLTV_Y", + "source": { + "@timestamp": "2018-11-27T02:09:01.935Z", + "auditd": { + "result": "success", + "session": "9860", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184415 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "26094", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANntUmcBTFzn_XoLTWDY", + "source": { + "@timestamp": "2018-11-27T02:09:02.034Z", + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "9860", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 184416, + "result": "success" + }, + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "uid": "0", + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "pid": "26094", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdntUmcBTFzn_XoLTWDY", + "source": { + "@timestamp": "2018-11-27T02:09:02.035Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_end", + "action": "ended-session" + }, + "user": { + "name_map": { + "uid": "root", + "auid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "26094", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_close" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + }, + "sequence": 184417, + "result": "success", + "session": "9860" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "odnuUmcBTFzn_XoLa3iq", + "source": { + "@timestamp": "2018-11-27T02:10:15.075Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.244.25.108" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 44240, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30401" + }, + "source": { + "ip": "185.244.25.108" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "otnuUmcBTFzn_XoLa3iq", + "source": { + "@timestamp": "2018-11-27T02:10:15.075Z", + "process": { + "pid": "30401", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "185.244.25.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "185.244.25.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44241, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "o9nuUmcBTFzn_XoLa3iq", + "source": { + "@timestamp": "2018-11-27T02:10:15.175Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "data": { + "hostname": "185.244.25.108", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "185.244.25.108", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44242, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30401", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.244.25.108" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z9nuUmcBTFzn_XoLh3rt", + "source": { + "@timestamp": "2018-11-27T02:10:22.335Z", + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "146.196.59.36", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 44243, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "30405", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "146.196.59.36" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NnuUmcBTFzn_XoLh3rt", + "source": { + "@timestamp": "2018-11-27T02:10:22.335Z", + "source": { + "ip": "146.196.59.36" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "146.196.59.36" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44244 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30405", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dnuUmcBTFzn_XoLh3rt", + "source": { + "@timestamp": "2018-11-27T02:10:22.583Z", + "process": { + "pid": "30405", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "146.196.59.36" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44245, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "146.196.59.36", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "146.196.59.36" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9tnuUmcBTFzn_XoLM3ME", + "source": { + "@timestamp": "2018-11-27T02:10:00.602Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "file_integrity", + "action": [ + "created" + ] + }, + "file": { + "size": 0, + "type": "file", + "uid": 0, + "owner": "root", + "group": "root", + "mode": "0000", + "mtime": "2018-11-27T02:10:00.596Z", + "gid": 0, + "inode": "185", + "path": "/etc/sed6b0EHM", + "ctime": "2018-11-27T02:10:00.596Z" + }, + "hash": { + "sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99nuUmcBTFzn_XoLM3ME", + "source": { + "@timestamp": "2018-11-27T02:10:00.603Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "event": { + "module": "file_integrity", + "action": [ + "updated" + ] + }, + "file": { + "inode": "185", + "size": 50, + "type": "file", + "uid": 0, + "owner": "root", + "mode": "0000", + "path": "/etc/sed6b0EHM", + "group": "root", + "mtime": "2018-11-27T02:10:00.600Z", + "ctime": "2018-11-27T02:10:00.600Z", + "gid": 0 + }, + "hash": { + "sha1": "58a8b2bb04893785eb5a48598a16a3fa8ad2fa36" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NnuUmcBTFzn_XoLM3ME", + "source": { + "@timestamp": "2018-11-27T02:10:00.605Z", + "file": { + "path": "/etc/sed6b0EHM" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "file_integrity", + "action": [ + "attributes_modified" + ] + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dnuUmcBTFzn_XoLM3ME", + "source": { + "@timestamp": "2018-11-27T02:10:00.606Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "file_integrity", + "action": [ + "moved" + ] + }, + "file": { + "path": "/etc/sed6b0EHM" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tnuUmcBTFzn_XoLM3ME", + "source": { + "@timestamp": "2018-11-27T02:10:00.607Z", + "event": { + "action": [ + "created" + ], + "module": "file_integrity" + }, + "file": { + "owner": "root", + "uid": 0, + "mode": "0644", + "inode": "185", + "mtime": "2018-11-27T02:10:00.600Z", + "gid": 0, + "group": "root", + "path": "/etc/hosts", + "ctime": "2018-11-27T02:10:00.600Z", + "type": "file", + "size": 205 + }, + "hash": { + "sha1": "5a4ccf92aa02bc100c5b20faeed3691286e039e5" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VdnzUmcBTFzn_XoLR-PG", + "source": { + "@timestamp": "2018-11-27T02:15:33.590Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "51.75.23.199", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43238 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13014", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.75.23.199" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VtnzUmcBTFzn_XoLR-PG", + "source": { + "@timestamp": "2018-11-27T02:15:33.590Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13014" + }, + "source": { + "ip": "51.75.23.199" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43239, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "51.75.23.199", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9nzUmcBTFzn_XoLR-PG", + "source": { + "@timestamp": "2018-11-27T02:15:33.702Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13014", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.75.23.199" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "51.75.23.199", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43240, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.75.23.199" + } + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3tnzUmcBTFzn_XoLUOOL", + "source": { + "@timestamp": "2018-11-27T02:15:35.841Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "939" + }, + "source": { + "ip": "181.28.191.54" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "181.28.191.54", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192586, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "39nzUmcBTFzn_XoLUOOL", + "source": { + "@timestamp": "2018-11-27T02:15:35.843Z", + "auditd": { + "sequence": 192587, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "181.28.191.54", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "939" + }, + "source": { + "ip": "181.28.191.54" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4NnzUmcBTFzn_XoLUOOL", + "source": { + "@timestamp": "2018-11-27T02:15:36.030Z", + "auditd": { + "sequence": 192588, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "181.28.191.54", + "terminal": "ssh" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "181.28.191.54" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "939", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "181.28.191.54" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NnxUmcBTFzn_XoLYbnr", + "source": { + "@timestamp": "2018-11-27T02:13:29.217Z", + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "180.76.239.66" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 184427, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26172" + }, + "source": { + "ip": "180.76.239.66" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dnxUmcBTFzn_XoLYbnr", + "source": { + "@timestamp": "2018-11-27T02:13:29.218Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "26172", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "180.76.239.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "180.76.239.66" + } + }, + "sequence": 184428, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tnxUmcBTFzn_XoLYbnr", + "source": { + "@timestamp": "2018-11-27T02:13:29.430Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184429, + "result": "fail", + "session": "unset", + "data": { + "hostname": "180.76.239.66", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "180.76.239.66", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26172", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "180.76.239.66" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "H9nxUmcBTFzn_XoLY7rL", + "source": { + "@timestamp": "2018-11-27T02:13:29.694Z", + "process": { + "pid": "30475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.43.198" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44252, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.43.198", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INnxUmcBTFzn_XoLY7rL", + "source": { + "@timestamp": "2018-11-27T02:13:29.694Z", + "source": { + "ip": "164.132.43.198" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.43.198", + "type": "user-session" + } + }, + "sequence": 44253, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30475", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "IdnxUmcBTFzn_XoLY7rL", + "source": { + "@timestamp": "2018-11-27T02:13:29.798Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "30475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.43.198" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "164.132.43.198", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "164.132.43.198", + "type": "user-session" + } + }, + "sequence": 44254 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LtnwUmcBTFzn_XoL5q-R", + "source": { + "@timestamp": "2018-11-27T02:12:57.636Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32583" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186578, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "L9nwUmcBTFzn_XoL5q-R", + "source": { + "@timestamp": "2018-11-27T02:12:57.638Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186579 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32583", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MNnwUmcBTFzn_XoL5q-R", + "source": { + "@timestamp": "2018-11-27T02:12:57.669Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186580 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32583", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctnyUmcBTFzn_XoLDsgI", + "source": { + "@timestamp": "2018-11-27T02:14:13.278Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32591" + }, + "source": { + "ip": "182.61.32.147" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186581, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "182.61.32.147" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9nyUmcBTFzn_XoLDsgI", + "source": { + "@timestamp": "2018-11-27T02:14:13.279Z", + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "182.61.32.147", + "type": "user-session" + } + }, + "sequence": 186582, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32591" + }, + "source": { + "ip": "182.61.32.147" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNnyUmcBTFzn_XoLDsgI", + "source": { + "@timestamp": "2018-11-27T02:14:13.485Z", + "source": { + "ip": "182.61.32.147" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186583, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "182.61.32.147" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "182.61.32.147", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32591" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9nyUmcBTFzn_XoLLcvi", + "source": { + "@timestamp": "2018-11-27T02:14:21.431Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186584, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32593" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNnyUmcBTFzn_XoLLcvi", + "source": { + "@timestamp": "2018-11-27T02:14:21.432Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + } + }, + "sequence": 186585, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32593", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdnyUmcBTFzn_XoLLcvi", + "source": { + "@timestamp": "2018-11-27T02:14:21.462Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186586, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32593", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdnxUmcBTFzn_XoL1sT3", + "source": { + "@timestamp": "2018-11-27T02:13:59.181Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "924", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "201.155.38.30" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "201.155.38.30" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 192580, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NtnxUmcBTFzn_XoL1sT3", + "source": { + "@timestamp": "2018-11-27T02:13:59.183Z", + "source": { + "ip": "201.155.38.30" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "201.155.38.30", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 192581, + "result": "fail" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "924", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9nxUmcBTFzn_XoL1sT3", + "source": { + "@timestamp": "2018-11-27T02:13:59.755Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "924", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.155.38.30" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "201.155.38.30" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "201.155.38.30" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192582, + "result": "fail", + "session": "unset" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9nxUmcBTFzn_XoL58U9", + "source": { + "@timestamp": "2018-11-27T02:14:03.342Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13001" + }, + "source": { + "ip": "137.74.199.177" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43235, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "137.74.199.177" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNnxUmcBTFzn_XoL58U9", + "source": { + "@timestamp": "2018-11-27T02:14:03.342Z", + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13001", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "137.74.199.177" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43236, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "137.74.199.177", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdnxUmcBTFzn_XoL58U9", + "source": { + "@timestamp": "2018-11-27T02:14:03.458Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "137.74.199.177", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "137.74.199.177", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43237, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13001" + }, + "source": { + "ip": "137.74.199.177" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jNnzUmcBTFzn_XoLLeBy", + "source": { + "@timestamp": "2018-11-27T02:15:26.857Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "937", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "190.0.10.138", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192583, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jdnzUmcBTFzn_XoLLeBy", + "source": { + "@timestamp": "2018-11-27T02:15:26.858Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "937", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "190.0.10.138" + } + }, + "sequence": 192584, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jtnzUmcBTFzn_XoLLeBy", + "source": { + "@timestamp": "2018-11-27T02:15:26.950Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "937", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "190.0.10.138" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "190.0.10.138", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192585 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9nzUmcBTFzn_XoLXeXh", + "source": { + "@timestamp": "2018-11-27T02:15:39.252Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "142.93.18.15" + } + }, + "sequence": 44255, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "30517", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.18.15" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNnzUmcBTFzn_XoLXeXh", + "source": { + "@timestamp": "2018-11-27T02:15:39.252Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30517", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.18.15" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "142.93.18.15", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44256 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "odnzUmcBTFzn_XoLXeXh", + "source": { + "@timestamp": "2018-11-27T02:15:39.292Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30517", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.18.15" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "142.93.18.15", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44257, + "result": "fail", + "session": "unset", + "data": { + "hostname": "142.93.18.15", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Utr3UmcBTFzn_XoLVD0D", + "source": { + "@timestamp": "2018-11-27T02:19:58.873Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "secondary": "164.132.197.108", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 184439, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26214", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "U9r3UmcBTFzn_XoLVD0D", + "source": { + "@timestamp": "2018-11-27T02:19:58.874Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "26214", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.197.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184440 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNr3UmcBTFzn_XoLVD0D", + "source": { + "@timestamp": "2018-11-27T02:19:58.986Z", + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "164.132.197.108" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "164.132.197.108", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184441, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26214", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.197.108" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltr3UmcBTFzn_XoLWD2x", + "source": { + "@timestamp": "2018-11-27T02:20:00.071Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32625", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186602, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l9r3UmcBTFzn_XoLWD2x", + "source": { + "@timestamp": "2018-11-27T02:20:00.072Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186603, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32625", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mNr3UmcBTFzn_XoLWD2x", + "source": { + "@timestamp": "2018-11-27T02:20:00.103Z", + "process": { + "pid": "32625", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 186604, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "htr4UmcBTFzn_XoLpVlZ", + "source": { + "@timestamp": "2018-11-27T02:21:25.223Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "37.195.105.57" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43262, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13059", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.195.105.57" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9r4UmcBTFzn_XoLpVlZ", + "source": { + "@timestamp": "2018-11-27T02:21:25.227Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13059", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.195.105.57" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.195.105.57", + "type": "user-session" + } + }, + "sequence": 43263, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNr4UmcBTFzn_XoLpVlZ", + "source": { + "@timestamp": "2018-11-27T02:21:25.431Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13059", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.195.105.57" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "sequence": 43264, + "result": "fail", + "session": "unset", + "data": { + "hostname": "37.195.105.57", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "37.195.105.57", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idr4UmcBTFzn_XoLpVnm", + "source": { + "@timestamp": "2018-11-27T02:21:25.372Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32633" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186605, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "itr4UmcBTFzn_XoLpVnm", + "source": { + "@timestamp": "2018-11-27T02:21:25.373Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186606, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32633", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "i9r4UmcBTFzn_XoLpVnm", + "source": { + "@timestamp": "2018-11-27T02:21:25.404Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32633", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 186607, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6Nr4UmcBTFzn_XoL4l6d", + "source": { + "@timestamp": "2018-11-27T02:21:40.914Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "20001", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.62.233.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142431, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "82.62.233.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dr4UmcBTFzn_XoL4l6d", + "source": { + "@timestamp": "2018-11-27T02:21:40.915Z", + "process": { + "pid": "20001", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "82.62.233.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "82.62.233.163", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142432, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tr4UmcBTFzn_XoL4l6d", + "source": { + "@timestamp": "2018-11-27T02:21:41.064Z", + "source": { + "ip": "82.62.233.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "82.62.233.163" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "82.62.233.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142433, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "20001", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xtr5UmcBTFzn_XoL9Ha7", + "source": { + "@timestamp": "2018-11-27T02:22:51.088Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32641" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186608, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9r5UmcBTFzn_XoL9Ha7", + "source": { + "@timestamp": "2018-11-27T02:22:51.090Z", + "auditd": { + "sequence": 186609, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32641", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNr5UmcBTFzn_XoL9Ha7", + "source": { + "@timestamp": "2018-11-27T02:22:51.120Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32641", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186610, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZNr5UmcBTFzn_XoL03NO", + "source": { + "@timestamp": "2018-11-27T02:22:42.532Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "104.248.11.46", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 192601 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "986", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.11.46" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Zdr5UmcBTFzn_XoL03NO", + "source": { + "@timestamp": "2018-11-27T02:22:42.533Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "986" + }, + "source": { + "ip": "104.248.11.46" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.248.11.46", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192602 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ztr5UmcBTFzn_XoL03NO", + "source": { + "@timestamp": "2018-11-27T02:22:42.564Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "986" + }, + "source": { + "ip": "104.248.11.46" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "104.248.11.46", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.248.11.46", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192603, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xdr5UmcBTFzn_XoL23R3", + "source": { + "@timestamp": "2018-11-27T02:22:44.622Z", + "source": { + "ip": "91.67.54.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "91.67.54.251" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192604, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "988", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xtr5UmcBTFzn_XoL23R3", + "source": { + "@timestamp": "2018-11-27T02:22:44.623Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "988", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.67.54.251" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "sequence": 192605, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "91.67.54.251", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9r5UmcBTFzn_XoL23R3", + "source": { + "@timestamp": "2018-11-27T02:22:44.754Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "988", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.67.54.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "91.67.54.251" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "91.67.54.251", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192606, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INr4UmcBTFzn_XoLPlHT", + "source": { + "@timestamp": "2018-11-27T02:20:58.980Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30623" + }, + "source": { + "ip": "35.189.59.154" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "35.189.59.154", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44267, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Idr4UmcBTFzn_XoLPlHT", + "source": { + "@timestamp": "2018-11-27T02:20:58.980Z", + "source": { + "ip": "35.189.59.154" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "35.189.59.154" + } + }, + "sequence": 44268, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "30623", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Itr4UmcBTFzn_XoLPlHT", + "source": { + "@timestamp": "2018-11-27T02:20:59.156Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "35.189.59.154", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "35.189.59.154", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44269 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30623", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "35.189.59.154" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7Nr3UmcBTFzn_XoLyEYO", + "source": { + "@timestamp": "2018-11-27T02:20:28.574Z", + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30616" + }, + "source": { + "ip": "91.196.149.76" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44264, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "91.196.149.76", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7dr3UmcBTFzn_XoLyEYO", + "source": { + "@timestamp": "2018-11-27T02:20:28.574Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "91.196.149.76", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44265, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30616" + }, + "source": { + "ip": "91.196.149.76" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tr3UmcBTFzn_XoLyEYO", + "source": { + "@timestamp": "2018-11-27T02:20:28.710Z", + "process": { + "pid": "30616", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.196.149.76" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "91.196.149.76" + }, + "summary": { + "object": { + "secondary": "91.196.149.76", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 44266, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "str3UmcBTFzn_XoLOzru", + "source": { + "@timestamp": "2018-11-27T02:19:52.704Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13051", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.38.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43259, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "193.70.38.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "s9r3UmcBTFzn_XoLOzru", + "source": { + "@timestamp": "2018-11-27T02:19:52.704Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "13051", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.38.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "193.70.38.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43260, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tNr3UmcBTFzn_XoLOzru", + "source": { + "@timestamp": "2018-11-27T02:19:52.820Z", + "process": { + "pid": "13051", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.38.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "193.70.38.229" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "193.70.38.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43261, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "O9r9UmcBTFzn_XoL4syL", + "source": { + "@timestamp": "2018-11-27T02:27:08.552Z", + "source": { + "ip": "150.95.110.147" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "150.95.110.147", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43265, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "13101", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PNr9UmcBTFzn_XoL4syL", + "source": { + "@timestamp": "2018-11-27T02:27:08.552Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13101", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "150.95.110.147" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "150.95.110.147", + "type": "user-session" + } + }, + "sequence": 43266 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Pdr9UmcBTFzn_XoL4syL", + "source": { + "@timestamp": "2018-11-27T02:27:08.760Z", + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "150.95.110.147" + }, + "summary": { + "object": { + "secondary": "150.95.110.147", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43267, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13101" + }, + "source": { + "ip": "150.95.110.147" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5tr9UmcBTFzn_XoL7Mz5", + "source": { + "@timestamp": "2018-11-27T02:27:11.246Z", + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186617, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32666" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59r9UmcBTFzn_XoL7Mz5", + "source": { + "@timestamp": "2018-11-27T02:27:11.247Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32666" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186618, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6Nr9UmcBTFzn_XoL7Mz5", + "source": { + "@timestamp": "2018-11-27T02:27:11.279Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32666", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186619, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtr7UmcBTFzn_XoLqZv2", + "source": { + "@timestamp": "2018-11-27T02:24:43.020Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "134.175.33.189" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142434 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "20021", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "134.175.33.189" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9r7UmcBTFzn_XoLqZv2", + "source": { + "@timestamp": "2018-11-27T02:24:43.021Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "134.175.33.189", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142435, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "20021", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "134.175.33.189" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNr7UmcBTFzn_XoLqZv2", + "source": { + "@timestamp": "2018-11-27T02:24:43.229Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142436, + "result": "fail", + "session": "unset", + "data": { + "hostname": "134.175.33.189", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "134.175.33.189", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20021" + }, + "source": { + "ip": "134.175.33.189" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9r7UmcBTFzn_XoLRZIS", + "source": { + "@timestamp": "2018-11-27T02:24:17.192Z", + "process": { + "pid": "32649", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186611, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WNr7UmcBTFzn_XoLRZIS", + "source": { + "@timestamp": "2018-11-27T02:24:17.193Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186612, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32649", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Wdr7UmcBTFzn_XoLRZIS", + "source": { + "@timestamp": "2018-11-27T02:24:17.223Z", + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32649", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186613, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tdr8UmcBTFzn_XoLmK-a", + "source": { + "@timestamp": "2018-11-27T02:25:44.112Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186614 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32658", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ttr8UmcBTFzn_XoLmK-a", + "source": { + "@timestamp": "2018-11-27T02:25:44.114Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186615, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32658" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "t9r8UmcBTFzn_XoLmK-a", + "source": { + "@timestamp": "2018-11-27T02:25:44.144Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186616 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32658", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Kdr8UmcBTFzn_XoL8rcs", + "source": { + "@timestamp": "2018-11-27T02:26:07.005Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1003", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.12.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "144.217.12.168", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 192607, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ktr8UmcBTFzn_XoL8rcs", + "source": { + "@timestamp": "2018-11-27T02:26:07.006Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1003", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.12.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "144.217.12.168", + "type": "user-session" + } + }, + "sequence": 192608 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9r8UmcBTFzn_XoL8rcs", + "source": { + "@timestamp": "2018-11-27T02:26:07.048Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1003", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.12.168" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "144.217.12.168", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "144.217.12.168", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192609 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dr7UmcBTFzn_XoLa5XB", + "source": { + "@timestamp": "2018-11-27T02:24:27.095Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26248", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.138.6.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.138.6.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184442, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tr7UmcBTFzn_XoLa5XB", + "source": { + "@timestamp": "2018-11-27T02:24:27.096Z", + "process": { + "pid": "26248", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.138.6.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184443, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.138.6.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69r7UmcBTFzn_XoLa5XB", + "source": { + "@timestamp": "2018-11-27T02:24:27.306Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26248", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.138.6.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "159.138.6.50", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "159.138.6.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184444, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mdr9UmcBTFzn_XoLS7_z", + "source": { + "@timestamp": "2018-11-27T02:26:30.024Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.228.67", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192610, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "1010", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.228.67" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mtr9UmcBTFzn_XoLS7_z", + "source": { + "@timestamp": "2018-11-27T02:26:30.025Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1010", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.228.67" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "178.33.228.67", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192611, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "m9r9UmcBTFzn_XoLS7_z", + "source": { + "@timestamp": "2018-11-27T02:26:30.133Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "178.33.228.67", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "178.33.228.67", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192612, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1010" + }, + "source": { + "ip": "178.33.228.67" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Gdr-UmcBTFzn_XoLHdFd", + "source": { + "@timestamp": "2018-11-27T02:27:23.630Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "213.34.172.74", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44273 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30753" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "213.34.172.74" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Gtr-UmcBTFzn_XoLHdFd", + "source": { + "@timestamp": "2018-11-27T02:27:23.634Z", + "source": { + "ip": "213.34.172.74" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "213.34.172.74", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44274 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30753" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9r-UmcBTFzn_XoLHdFd", + "source": { + "@timestamp": "2018-11-27T02:27:23.758Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30753", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "213.34.172.74" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44275, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "213.34.172.74", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "213.34.172.74", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "o9r7UmcBTFzn_XoLJpB1", + "source": { + "@timestamp": "2018-11-27T02:24:09.351Z", + "process": { + "pid": "30690", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "175.205.114.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "175.205.114.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44270 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pNr7UmcBTFzn_XoLJpB1", + "source": { + "@timestamp": "2018-11-27T02:24:09.351Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "175.205.114.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44271, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30690", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "175.205.114.52" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pdr7UmcBTFzn_XoLJpB1", + "source": { + "@timestamp": "2018-11-27T02:24:09.523Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "175.205.114.52" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "175.205.114.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44272 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30690" + }, + "source": { + "ip": "175.205.114.52" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3NsDU2cBTFzn_XoLlEgC", + "source": { + "@timestamp": "2018-11-27T02:33:21.687Z", + "auditd": { + "sequence": 186632, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "92.86.47.26", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "92.86.47.26" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32702", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "92.86.47.26" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9sDU2cBTFzn_XoLmUlp", + "source": { + "@timestamp": "2018-11-27T02:33:23.071Z", + "auditd": { + "sequence": 192616, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "145.239.137.89" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1048" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "145.239.137.89" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNsDU2cBTFzn_XoLmUlp", + "source": { + "@timestamp": "2018-11-27T02:33:23.072Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1048", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "145.239.137.89" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "145.239.137.89", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192617 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bdsDU2cBTFzn_XoLmUlp", + "source": { + "@timestamp": "2018-11-27T02:33:23.187Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "145.239.137.89", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "145.239.137.89" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192618, + "result": "fail" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1048", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "145.239.137.89" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "f9sDU2cBTFzn_XoLp0rb", + "source": { + "@timestamp": "2018-11-27T02:33:26.769Z", + "auditd": { + "sequence": 142437, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "115.113.54.122", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "20065", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.113.54.122" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNsDU2cBTFzn_XoLp0rb", + "source": { + "@timestamp": "2018-11-27T02:33:26.771Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "115.113.54.122", + "type": "user-session" + } + }, + "sequence": 142438, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "20065", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.113.54.122" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdsDU2cBTFzn_XoLp0rb", + "source": { + "@timestamp": "2018-11-27T02:33:27.053Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "20065", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.113.54.122" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "115.113.54.122", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "115.113.54.122", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142439, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9sGU2cBTFzn_XoLiIku", + "source": { + "@timestamp": "2018-11-27T02:36:35.268Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26335", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.59.9.162" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "37.59.9.162" + } + }, + "sequence": 184445 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNsGU2cBTFzn_XoLiIku", + "source": { + "@timestamp": "2018-11-27T02:36:35.269Z", + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26335" + }, + "source": { + "ip": "37.59.9.162" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "37.59.9.162" + } + }, + "sequence": 184446 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdsGU2cBTFzn_XoLiIku", + "source": { + "@timestamp": "2018-11-27T02:36:35.380Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "26335", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.59.9.162" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "37.59.9.162", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184447, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "37.59.9.162", + "terminal": "ssh" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "uNsFU2cBTFzn_XoLNGx8", + "source": { + "@timestamp": "2018-11-27T02:35:08.305Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "81.174.25.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "81.174.25.52" + } + }, + "sequence": 192619 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1062", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "udsFU2cBTFzn_XoLNGx8", + "source": { + "@timestamp": "2018-11-27T02:35:08.307Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1062", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.25.52" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192620, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "81.174.25.52" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "utsFU2cBTFzn_XoLNGx8", + "source": { + "@timestamp": "2018-11-27T02:35:08.440Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "81.174.25.52" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "81.174.25.52", + "type": "user-session" + } + }, + "sequence": 192621 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1062", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.25.52" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yNsFU2cBTFzn_XoLA2fV", + "source": { + "@timestamp": "2018-11-27T02:34:55.845Z", + "source": { + "ip": "74.208.43.208" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "74.208.43.208", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44282, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30899" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ydsFU2cBTFzn_XoLA2fV", + "source": { + "@timestamp": "2018-11-27T02:34:55.849Z", + "source": { + "ip": "74.208.43.208" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "74.208.43.208", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44283, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30899", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytsFU2cBTFzn_XoLA2fV", + "source": { + "@timestamp": "2018-11-27T02:34:55.873Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30899" + }, + "source": { + "ip": "74.208.43.208" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "74.208.43.208", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "74.208.43.208", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44284 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vNsHU2cBTFzn_XoLOZig", + "source": { + "@timestamp": "2018-11-27T02:37:20.688Z", + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30953", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "87.249.215.83" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44289, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "87.249.215.83" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vdsHU2cBTFzn_XoLOZig", + "source": { + "@timestamp": "2018-11-27T02:37:20.688Z", + "source": { + "ip": "87.249.215.83" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "87.249.215.83", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 44290, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30953" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vtsHU2cBTFzn_XoLOZig", + "source": { + "@timestamp": "2018-11-27T02:37:20.864Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30953", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "87.249.215.83" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "87.249.215.83" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "87.249.215.83" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44291, + "result": "fail" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MtsEU2cBTFzn_XoLzWOC", + "source": { + "@timestamp": "2018-11-27T02:34:41.940Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "30892", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "175.116.217.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "175.116.217.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44279, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9sEU2cBTFzn_XoLzWOC", + "source": { + "@timestamp": "2018-11-27T02:34:41.944Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "30892", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "175.116.217.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "175.116.217.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44280, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNsEU2cBTFzn_XoLzWOC", + "source": { + "@timestamp": "2018-11-27T02:34:42.116Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "175.116.217.13" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "175.116.217.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44281, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30892", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "175.116.217.13" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59sHU2cBTFzn_XoLBZOc", + "source": { + "@timestamp": "2018-11-27T02:37:07.375Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30947", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.55.190.46" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "45.55.190.46" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44286 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NsHU2cBTFzn_XoLBZOc", + "source": { + "@timestamp": "2018-11-27T02:37:07.375Z", + "auditd": { + "sequence": 44287, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "45.55.190.46", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30947", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.55.190.46" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dsHU2cBTFzn_XoLBZOc", + "source": { + "@timestamp": "2018-11-27T02:37:07.407Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "45.55.190.46" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "45.55.190.46", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "45.55.190.46", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44288 + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30947", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Y9sGU2cBTFzn_XoL6ZGy", + "source": { + "@timestamp": "2018-11-27T02:37:00.227Z", + "source": { + "ip": "103.48.12.177" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44285, + "result": "fail", + "session": "unset", + "data": { + "hostname": "103.48.12.177", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "103.48.12.177" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30943", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNsJU2cBTFzn_XoLCcBJ", + "source": { + "@timestamp": "2018-11-27T02:39:19.382Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "secondary": "167.99.84.229", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43278, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13175", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "167.99.84.229" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdsJU2cBTFzn_XoLCcBJ", + "source": { + "@timestamp": "2018-11-27T02:39:19.386Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13175" + }, + "source": { + "ip": "167.99.84.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43279, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "167.99.84.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JtsJU2cBTFzn_XoLCcBJ", + "source": { + "@timestamp": "2018-11-27T02:39:19.486Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13175" + }, + "source": { + "ip": "167.99.84.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "167.99.84.229", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "167.99.84.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 43280, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9sJU2cBTFzn_XoLCcCX", + "source": { + "@timestamp": "2018-11-27T02:39:19.468Z", + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "89.223.28.0", + "type": "user-session" + } + }, + "sequence": 184454, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "26405", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.223.28.0" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNsJU2cBTFzn_XoLCcCX", + "source": { + "@timestamp": "2018-11-27T02:39:19.469Z", + "source": { + "ip": "89.223.28.0" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "89.223.28.0", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184455 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26405", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdsJU2cBTFzn_XoLCcCX", + "source": { + "@timestamp": "2018-11-27T02:39:19.630Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26405" + }, + "source": { + "ip": "89.223.28.0" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "89.223.28.0", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "89.223.28.0", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184456, + "result": "fail" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7dsJU2cBTFzn_XoLVsZ3", + "source": { + "@timestamp": "2018-11-27T02:39:39.149Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "188.166.58.40", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192640, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1141", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.166.58.40" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tsJU2cBTFzn_XoLVsZ3", + "source": { + "@timestamp": "2018-11-27T02:39:39.150Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "188.166.58.40", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192641, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1141", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.166.58.40" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79sJU2cBTFzn_XoLVsZ3", + "source": { + "@timestamp": "2018-11-27T02:39:39.256Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1141" + }, + "source": { + "ip": "188.166.58.40" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "188.166.58.40", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "188.166.58.40", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192642 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtsJU2cBTFzn_XoLWMfm", + "source": { + "@timestamp": "2018-11-27T02:39:39.771Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "139.59.171.172", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44295 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31024", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.171.172" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9sJU2cBTFzn_XoLWMfm", + "source": { + "@timestamp": "2018-11-27T02:39:39.771Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31024", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.171.172" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "139.59.171.172" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44296, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNsJU2cBTFzn_XoLWMfm", + "source": { + "@timestamp": "2018-11-27T02:39:39.863Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31024", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.171.172" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "139.59.171.172", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "139.59.171.172" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44297, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNsIU2cBTFzn_XoLc7MQ", + "source": { + "@timestamp": "2018-11-27T02:38:40.934Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1086" + }, + "source": { + "ip": "139.99.168.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "139.99.168.192", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192628, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HdsIU2cBTFzn_XoLc7MQ", + "source": { + "@timestamp": "2018-11-27T02:38:40.935Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1086", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.99.168.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "139.99.168.192" + } + }, + "sequence": 192629, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HtsIU2cBTFzn_XoLc7MQ", + "source": { + "@timestamp": "2018-11-27T02:38:41.215Z", + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "139.99.168.192", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "139.99.168.192", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192630, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "1086", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.99.168.192" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "nNsJU2cBTFzn_XoLTcVS", + "source": { + "@timestamp": "2018-11-27T02:39:36.808Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "1139", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "52.60.179.151" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "52.60.179.151", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192637, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ndsJU2cBTFzn_XoLTcVS", + "source": { + "@timestamp": "2018-11-27T02:39:36.809Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "52.60.179.151", + "type": "user-session" + } + }, + "sequence": 192638, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1139", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "52.60.179.151" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntsJU2cBTFzn_XoLTcVS", + "source": { + "@timestamp": "2018-11-27T02:39:36.855Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "52.60.179.151" + }, + "summary": { + "object": { + "secondary": "52.60.179.151", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192639, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1139", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "52.60.179.151" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNsHU2cBTFzn_XoLr6LF", + "source": { + "@timestamp": "2018-11-27T02:37:50.939Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1076", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.114.136" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "37.187.114.136", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 192622 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdsHU2cBTFzn_XoLr6LF", + "source": { + "@timestamp": "2018-11-27T02:37:50.940Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "37.187.114.136", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192623 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1076", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.114.136" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stsHU2cBTFzn_XoLr6LF", + "source": { + "@timestamp": "2018-11-27T02:37:51.046Z", + "auditd": { + "sequence": 192624, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "37.187.114.136", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "37.187.114.136" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1076", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.114.136" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9sIU2cBTFzn_XoLPq6w", + "source": { + "@timestamp": "2018-11-27T02:38:27.526Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1084", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "85.214.81.104" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "85.214.81.104", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192625, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNsIU2cBTFzn_XoLPq6w", + "source": { + "@timestamp": "2018-11-27T02:38:27.527Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "85.214.81.104" + } + }, + "sequence": 192626, + "result": "fail" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1084", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "85.214.81.104" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdsIU2cBTFzn_XoLPq6w", + "source": { + "@timestamp": "2018-11-27T02:38:27.644Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1084" + }, + "source": { + "ip": "85.214.81.104" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "85.214.81.104", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "85.214.81.104", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 192627, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9sJU2cBTFzn_XoLm8zp", + "source": { + "@timestamp": "2018-11-27T02:39:56.927Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "13.66.193.177", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186633, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "32736", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "13.66.193.177" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONsJU2cBTFzn_XoLm8zp", + "source": { + "@timestamp": "2018-11-27T02:39:56.928Z", + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "13.66.193.177", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186634, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32736", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "13.66.193.177" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdsJU2cBTFzn_XoLm8zp", + "source": { + "@timestamp": "2018-11-27T02:39:56.989Z", + "source": { + "ip": "13.66.193.177" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186635, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "13.66.193.177" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "13.66.193.177" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "32736", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "btsHU2cBTFzn_XoLaZwR", + "source": { + "@timestamp": "2018-11-27T02:37:32.833Z", + "source": { + "ip": "36.67.135.42" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "36.67.135.42", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44292 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30958" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "b9sHU2cBTFzn_XoLaZwR", + "source": { + "@timestamp": "2018-11-27T02:37:32.837Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30958" + }, + "source": { + "ip": "36.67.135.42" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "36.67.135.42", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44293 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNsHU2cBTFzn_XoLaZwR", + "source": { + "@timestamp": "2018-11-27T02:37:33.045Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44294, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "36.67.135.42", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "36.67.135.42", + "type": "user-session" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "30958", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "36.67.135.42" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNsIU2cBTFzn_XoLwbmn", + "source": { + "@timestamp": "2018-11-27T02:39:01.052Z", + "auditd": { + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184448 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "26360", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XdsIU2cBTFzn_XoLwbmn", + "source": { + "@timestamp": "2018-11-27T02:39:01.052Z", + "process": { + "pid": "26360", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 184449, + "result": "success" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XtsIU2cBTFzn_XoLwbmn", + "source": { + "@timestamp": "2018-11-27T02:39:01.054Z", + "process": { + "pid": "26360", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "op": "PAM:session_open", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 184451, + "result": "success", + "session": "9862" + }, + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X9sIU2cBTFzn_XoLwbmn", + "source": { + "@timestamp": "2018-11-27T02:39:01.154Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "26360", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9862", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184452, + "result": "success" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNsIU2cBTFzn_XoLwbmn", + "source": { + "@timestamp": "2018-11-27T02:39:01.156Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_end", + "action": "ended-session" + }, + "user": { + "auid": "0", + "name_map": { + "uid": "root", + "auid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26360", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + }, + "sequence": 184453, + "result": "success", + "session": "9862" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9sIU2cBTFzn_XoLwrlb", + "source": { + "@timestamp": "2018-11-27T02:39:01.233Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "1088", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192631, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:accounting", + "acct": "root" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNsIU2cBTFzn_XoLwrlb", + "source": { + "@timestamp": "2018-11-27T02:39:01.234Z", + "event": { + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "1088", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192632, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddsIU2cBTFzn_XoLwrlb", + "source": { + "@timestamp": "2018-11-27T02:39:01.235Z", + "user": { + "auid": "0", + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1088", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9866", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192634, + "result": "success" + }, + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dtsIU2cBTFzn_XoLwrlb", + "source": { + "@timestamp": "2018-11-27T02:39:01.327Z", + "user": { + "auid": "0", + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "1088" + }, + "auditd": { + "session": "9866", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 192635, + "result": "success" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "d9sIU2cBTFzn_XoLwrlb", + "source": { + "@timestamp": "2018-11-27T02:39:01.327Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "9866", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_close" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192636, + "result": "success" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1088", + "exe": "/usr/sbin/cron" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ndwMU2cBTFzn_XoLNAWN", + "source": { + "@timestamp": "2018-11-27T02:42:47.067Z", + "source": { + "ip": "107.170.76.170" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.76.170", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 43284, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13197", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntwMU2cBTFzn_XoLNAWN", + "source": { + "@timestamp": "2018-11-27T02:42:47.071Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13197", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "107.170.76.170" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.76.170", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43285, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9wMU2cBTFzn_XoLNAWN", + "source": { + "@timestamp": "2018-11-27T02:42:47.107Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.76.170", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "107.170.76.170", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43286, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13197" + }, + "source": { + "ip": "107.170.76.170" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NwMU2cBTFzn_XoLOwZZ", + "source": { + "@timestamp": "2018-11-27T02:42:48.812Z", + "event": { + "category": "configuration", + "type": "netfilter_cfg", + "action": "loaded-firewall-rule-to", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "sgid": "0", + "name_map": { + "egid": "root", + "euid": "root", + "fsgid": "root", + "fsuid": "root", + "gid": "root", + "sgid": "root", + "suid": "root", + "uid": "root" + }, + "gid": "0", + "suid": "0", + "fsuid": "0", + "egid": "0", + "uid": "0", + "auid": "unset", + "euid": "0", + "fsgid": "0" + }, + "process": { + "exe": "/sbin/xtables-multi", + "pid": "13199", + "ppid": "1379", + "title": "/sbin/iptables -w -D sshguard -s 147.135.208.7 -j DROP", + "name": "iptables" + }, + "auditd": { + "data": { + "table": "filter", + "tty": "(none)", + "family": "2", + "a1": "0", + "exit": "0", + "a3": "1666870", + "syscall": "setsockopt", + "a2": "40", + "arch": "x86_64", + "a0": "5", + "entries": "155" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "firewall", + "primary": "filter" + }, + "how": "/sbin/xtables-multi" + }, + "sequence": 43287, + "result": "success", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WdwMU2cBTFzn_XoLRgdH", + "source": { + "@timestamp": "2018-11-27T02:42:51.613Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "84.19.176.196", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184460 + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26436", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "84.19.176.196" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WtwMU2cBTFzn_XoLRgdH", + "source": { + "@timestamp": "2018-11-27T02:42:51.614Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "26436", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "84.19.176.196" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184461, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "84.19.176.196", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9wMU2cBTFzn_XoLRgdH", + "source": { + "@timestamp": "2018-11-27T02:42:51.728Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "84.19.176.196" + } + }, + "sequence": 184462, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "84.19.176.196" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26436", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "84.19.176.196" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdwMU2cBTFzn_XoLSQex", + "source": { + "@timestamp": "2018-11-27T02:42:52.477Z", + "process": { + "pid": "20119", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "58.97.13.206" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "58.97.13.206" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142443, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtwMU2cBTFzn_XoLSQex", + "source": { + "@timestamp": "2018-11-27T02:42:52.479Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "20119", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "58.97.13.206" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "58.97.13.206", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142444, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9wMU2cBTFzn_XoLSQex", + "source": { + "@timestamp": "2018-11-27T02:42:52.702Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "58.97.13.206", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "58.97.13.206", + "type": "user-session" + } + }, + "sequence": 142445, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "20119", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "58.97.13.206" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qdwMU2cBTFzn_XoLVwgF", + "source": { + "@timestamp": "2018-11-27T02:42:55.899Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "45.55.239.241", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 142446 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "20121", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.55.239.241" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtwMU2cBTFzn_XoLVwgF", + "source": { + "@timestamp": "2018-11-27T02:42:55.899Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "20121", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.55.239.241" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "45.55.239.241", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 142447 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9wMU2cBTFzn_XoLVwgF", + "source": { + "@timestamp": "2018-11-27T02:42:55.930Z", + "source": { + "ip": "45.55.239.241" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "45.55.239.241" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "45.55.239.241", + "type": "user-session" + } + }, + "sequence": 142448, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20121" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdsLU2cBTFzn_XoLffYn", + "source": { + "@timestamp": "2018-11-27T02:42:00.124Z", + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "104.131.124.166", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184457, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26431", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.124.166" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JtsLU2cBTFzn_XoLffYn", + "source": { + "@timestamp": "2018-11-27T02:42:00.125Z", + "process": { + "pid": "26431", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.124.166" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184458, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.131.124.166", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9sLU2cBTFzn_XoLffYn", + "source": { + "@timestamp": "2018-11-27T02:42:00.158Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26431" + }, + "source": { + "ip": "104.131.124.166" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184459, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "104.131.124.166", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "104.131.124.166", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNwMU2cBTFzn_XoLDAJ2", + "source": { + "@timestamp": "2018-11-27T02:42:36.811Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "20117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "202.28.34.200" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142440, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CdwMU2cBTFzn_XoLDAJ2", + "source": { + "@timestamp": "2018-11-27T02:42:36.812Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "20117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "202.28.34.200", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 142441 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtwMU2cBTFzn_XoLDAJ2", + "source": { + "@timestamp": "2018-11-27T02:42:37.043Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "20117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "202.28.34.200", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142442, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "202.28.34.200", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtwMU2cBTFzn_XoLKwWd", + "source": { + "@timestamp": "2018-11-27T02:42:44.787Z", + "source": { + "ip": "103.249.205.78" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186639, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "103.249.205.78" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32752" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Q9wMU2cBTFzn_XoLKwWd", + "source": { + "@timestamp": "2018-11-27T02:42:44.788Z", + "source": { + "ip": "103.249.205.78" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "103.249.205.78", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186640 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32752", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RNwMU2cBTFzn_XoLKwWd", + "source": { + "@timestamp": "2018-11-27T02:42:45.017Z", + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "103.249.205.78", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186641, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "103.249.205.78" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32752", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.249.205.78" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "btsKU2cBTFzn_XoL6ul0", + "source": { + "@timestamp": "2018-11-27T02:41:22.569Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1149" + }, + "source": { + "ip": "149.56.15.98" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "149.56.15.98", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192643, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "b9sKU2cBTFzn_XoL6ul0", + "source": { + "@timestamp": "2018-11-27T02:41:22.571Z", + "source": { + "ip": "149.56.15.98" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192644, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "149.56.15.98", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1149", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNsKU2cBTFzn_XoL6ul0", + "source": { + "@timestamp": "2018-11-27T02:41:22.613Z", + "source": { + "ip": "149.56.15.98" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192645, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "149.56.15.98" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "149.56.15.98", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1149", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99sKU2cBTFzn_XoLJtjT", + "source": { + "@timestamp": "2018-11-27T02:40:32.489Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32738" + }, + "source": { + "ip": "37.59.183.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.59.183.21", + "type": "user-session" + } + }, + "sequence": 186636 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NsKU2cBTFzn_XoLJtjT", + "source": { + "@timestamp": "2018-11-27T02:40:32.490Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32738", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.59.183.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186637, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "37.59.183.21" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dsKU2cBTFzn_XoLJtjT", + "source": { + "@timestamp": "2018-11-27T02:40:32.600Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "37.59.183.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186638, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "37.59.183.21" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32738", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.59.183.21" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dsKU2cBTFzn_XoLCtYx", + "source": { + "@timestamp": "2018-11-27T02:40:25.154Z", + "process": { + "pid": "31052", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.237.238" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.248.237.238" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44298, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tsKU2cBTFzn_XoLCtYx", + "source": { + "@timestamp": "2018-11-27T02:40:25.158Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31052", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.237.238" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "104.248.237.238", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44299, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69sKU2cBTFzn_XoLCtYx", + "source": { + "@timestamp": "2018-11-27T02:40:25.190Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31052" + }, + "source": { + "ip": "104.248.237.238" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "104.248.237.238" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44300, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "104.248.237.238", + "terminal": "ssh" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TtsKU2cBTFzn_XoLcN9z", + "source": { + "@timestamp": "2018-11-27T02:40:51.334Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13183", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "191.255.248.91" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "191.255.248.91" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43281 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "T9sKU2cBTFzn_XoLcN9z", + "source": { + "@timestamp": "2018-11-27T02:40:51.334Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "191.255.248.91", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43282 + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13183" + }, + "source": { + "ip": "191.255.248.91" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UNsKU2cBTFzn_XoLcN9z", + "source": { + "@timestamp": "2018-11-27T02:40:51.490Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13183", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "191.255.248.91" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43283, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "191.255.248.91" + }, + "summary": { + "object": { + "secondary": "191.255.248.91", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "O90YU2cBTFzn_XoLthfG", + "source": { + "@timestamp": "2018-11-27T02:56:26.843Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "212.46.209.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192667 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1253" + }, + "source": { + "ip": "212.46.209.158" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PN0YU2cBTFzn_XoLthfG", + "source": { + "@timestamp": "2018-11-27T02:56:26.844Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "212.46.209.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192668, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1253", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "212.46.209.158" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Pd0YU2cBTFzn_XoLthfG", + "source": { + "@timestamp": "2018-11-27T02:56:27.038Z", + "source": { + "ip": "212.46.209.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "212.46.209.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192669, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "212.46.209.158" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1253" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Wd0YU2cBTFzn_XoLuRey", + "source": { + "@timestamp": "2018-11-27T02:56:27.592Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "20207", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "212.89.171.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "212.89.171.146", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142463, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Wt0YU2cBTFzn_XoLuRey", + "source": { + "@timestamp": "2018-11-27T02:56:27.593Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "212.89.171.146", + "type": "user-session" + } + }, + "sequence": 142464 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "20207", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "212.89.171.146" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W90YU2cBTFzn_XoLuRey", + "source": { + "@timestamp": "2018-11-27T02:56:27.731Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20207" + }, + "source": { + "ip": "212.89.171.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142465, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "212.89.171.146" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "212.89.171.146", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UN0ZU2cBTFzn_XoLKSHH", + "source": { + "@timestamp": "2018-11-27T02:56:56.285Z", + "auditd": { + "sequence": 184490, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "193.70.85.206", + "type": "user-session" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26545", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.85.206" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ud0ZU2cBTFzn_XoLKSHH", + "source": { + "@timestamp": "2018-11-27T02:56:56.286Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "193.70.85.206" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184491, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26545", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.85.206" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ut0ZU2cBTFzn_XoLKSHH", + "source": { + "@timestamp": "2018-11-27T02:56:56.392Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26545", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.85.206" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184492, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "193.70.85.206", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "secondary": "193.70.85.206", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0t0ZU2cBTFzn_XoL6TKj", + "source": { + "@timestamp": "2018-11-27T02:57:45.401Z", + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26553", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.36.221.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "89.36.221.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184493, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "090ZU2cBTFzn_XoL6TKj", + "source": { + "@timestamp": "2018-11-27T02:57:45.402Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "89.36.221.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 184494, + "result": "fail" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26553", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.36.221.229" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1N0ZU2cBTFzn_XoL6TKj", + "source": { + "@timestamp": "2018-11-27T02:57:45.502Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26553", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.36.221.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184495, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "89.36.221.229" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "89.36.221.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "f90YU2cBTFzn_XoL-B3u", + "source": { + "@timestamp": "2018-11-27T02:56:43.779Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26542", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.111.27" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "138.68.111.27", + "type": "user-session" + } + }, + "sequence": 184487, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gN0YU2cBTFzn_XoL-B3u", + "source": { + "@timestamp": "2018-11-27T02:56:43.781Z", + "auditd": { + "sequence": 184488, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "138.68.111.27", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26542", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "138.68.111.27" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gd0YU2cBTFzn_XoL-B3u", + "source": { + "@timestamp": "2018-11-27T02:56:43.889Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184489, + "result": "fail", + "session": "unset", + "data": { + "hostname": "138.68.111.27", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "138.68.111.27", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26542", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.111.27" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YN0ZU2cBTFzn_XoLMCE9", + "source": { + "@timestamp": "2018-11-27T02:56:57.939Z", + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "5.39.77.167", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192670, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1261" + }, + "source": { + "ip": "5.39.77.167" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Yd0ZU2cBTFzn_XoLMCE9", + "source": { + "@timestamp": "2018-11-27T02:56:57.940Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "5.39.77.167", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 192671, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1261" + }, + "source": { + "ip": "5.39.77.167" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Yt0ZU2cBTFzn_XoLMCE9", + "source": { + "@timestamp": "2018-11-27T02:56:58.047Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192672, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "5.39.77.167", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "5.39.77.167", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1261", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "5.39.77.167" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yN0YU2cBTFzn_XoLnBVF", + "source": { + "@timestamp": "2018-11-27T02:56:20.058Z", + "source": { + "ip": "189.16.195.18" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "189.16.195.18" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192664 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1251", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yd0YU2cBTFzn_XoLnBVF", + "source": { + "@timestamp": "2018-11-27T02:56:20.060Z", + "process": { + "pid": "1251", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "189.16.195.18" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "189.16.195.18", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192665, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yt0YU2cBTFzn_XoLnBVF", + "source": { + "@timestamp": "2018-11-27T02:56:20.223Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1251" + }, + "source": { + "ip": "189.16.195.18" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192666, + "result": "fail", + "session": "unset", + "data": { + "hostname": "189.16.195.18", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "189.16.195.18", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ld0YU2cBTFzn_XoL6hym", + "source": { + "@timestamp": "2018-11-27T02:56:40.122Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "157.100.133.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43303, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13281", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "157.100.133.21" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lt0YU2cBTFzn_XoL6hym", + "source": { + "@timestamp": "2018-11-27T02:56:40.122Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13281", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "157.100.133.21" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "157.100.133.21", + "type": "user-session" + } + }, + "sequence": 43304, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l90YU2cBTFzn_XoL6hym", + "source": { + "@timestamp": "2018-11-27T02:56:40.242Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "157.100.133.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43305, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "157.100.133.21" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13281", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "157.100.133.21" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wt0ZU2cBTFzn_XoLqiw3", + "source": { + "@timestamp": "2018-11-27T02:57:29.161Z", + "source": { + "ip": "37.59.62.23" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "37.59.62.23", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44318 + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31535", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "w90ZU2cBTFzn_XoLqiw3", + "source": { + "@timestamp": "2018-11-27T02:57:29.161Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31535", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.59.62.23" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.59.62.23", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44319 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xN0ZU2cBTFzn_XoLqiw3", + "source": { + "@timestamp": "2018-11-27T02:57:29.269Z", + "source": { + "ip": "37.59.62.23" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "37.59.62.23", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 44320, + "result": "fail", + "session": "unset", + "data": { + "hostname": "37.59.62.23", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31535", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ld0ZU2cBTFzn_XoLxC9z", + "source": { + "@timestamp": "2018-11-27T02:57:35.874Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "summary": { + "how": "/lib/systemd/systemd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "apt-daily", + "type": "service" + } + }, + "sequence": 43306, + "result": "success", + "session": "unset", + "data": { + "unit": "apt-daily" + } + }, + "event": { + "category": "system-services", + "type": "service_start", + "action": "started-service", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1", + "name": "systemd", + "exe": "/lib/systemd/systemd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Lt0ZU2cBTFzn_XoLxC9z", + "source": { + "@timestamp": "2018-11-27T02:57:35.874Z", + "event": { + "category": "system-services", + "type": "service_stop", + "action": "stopped-service", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1", + "name": "systemd", + "exe": "/lib/systemd/systemd" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "apt-daily", + "type": "service" + }, + "how": "/lib/systemd/systemd" + }, + "sequence": 43307, + "result": "success", + "session": "unset", + "data": { + "unit": "apt-daily" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p893UmcBTFzn_XoLs0bb", + "source": { + "@timestamp": "2018-11-27T00:00:34.801Z", + "process": { + "pid": "19147", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.35.110.58" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "200.35.110.58", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142246, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qM93UmcBTFzn_XoLs0bb", + "source": { + "@timestamp": "2018-11-27T00:00:34.802Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "200.35.110.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142247, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19147", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.35.110.58" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qc93UmcBTFzn_XoLs0bb", + "source": { + "@timestamp": "2018-11-27T00:00:34.906Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "200.35.110.58" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142248, + "result": "fail", + "session": "unset", + "data": { + "hostname": "200.35.110.58", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19147", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "200.35.110.58" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Lc97UmcBTFzn_XoLKpLT", + "source": { + "@timestamp": "2018-11-27T00:04:21.865Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31749" + }, + "source": { + "ip": "164.132.112.233" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.112.233", + "type": "user-session" + } + }, + "sequence": 186182, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ls97UmcBTFzn_XoLKpLT", + "source": { + "@timestamp": "2018-11-27T00:04:21.866Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31749", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.112.233" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186183, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.112.233", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "L897UmcBTFzn_XoLKpLT", + "source": { + "@timestamp": "2018-11-27T00:04:21.973Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "164.132.112.233" + } + }, + "sequence": 186184, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "164.132.112.233", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31749" + }, + "source": { + "ip": "164.132.112.233" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "o894UmcBTFzn_XoLA00h", + "source": { + "@timestamp": "2018-11-27T00:00:55.095Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "139.198.120.32", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192390, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31971", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.198.120.32" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pM94UmcBTFzn_XoLA00h", + "source": { + "@timestamp": "2018-11-27T00:00:55.096Z", + "auditd": { + "sequence": 192391, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "139.198.120.32", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31971" + }, + "source": { + "ip": "139.198.120.32" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pc94UmcBTFzn_XoLA00h", + "source": { + "@timestamp": "2018-11-27T00:00:55.269Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "31971", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.198.120.32" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "139.198.120.32" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "139.198.120.32", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192392 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "eM95UmcBTFzn_XoLP2hD", + "source": { + "@timestamp": "2018-11-27T00:02:15.998Z", + "source": { + "ip": "106.12.29.232" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192393, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "106.12.29.232", + "type": "user-session" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31979", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ec95UmcBTFzn_XoLP2hD", + "source": { + "@timestamp": "2018-11-27T00:02:15.999Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31979" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "106.12.29.232" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "106.12.29.232", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192394 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "es95UmcBTFzn_XoLP2hD", + "source": { + "@timestamp": "2018-11-27T00:02:16.292Z", + "source": { + "ip": "106.12.29.232" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "106.12.29.232" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "106.12.29.232", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192395 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31979", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PM99UmcBTFzn_XoLjscA", + "source": { + "@timestamp": "2018-11-27T00:06:58.326Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "54.37.154.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186188, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31766", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.154.254" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Pc99UmcBTFzn_XoLjscA", + "source": { + "@timestamp": "2018-11-27T00:06:58.327Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31766", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.154.254" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "54.37.154.254", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186189 + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ps99UmcBTFzn_XoLjscA", + "source": { + "@timestamp": "2018-11-27T00:06:58.438Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "54.37.154.254" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "54.37.154.254" + } + }, + "sequence": 186190 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31766", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.154.254" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cM95UmcBTFzn_XoLKGaD", + "source": { + "@timestamp": "2018-11-27T00:02:10.186Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31740", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.24.100.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186179, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "211.24.100.205", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cc95UmcBTFzn_XoLKGaD", + "source": { + "@timestamp": "2018-11-27T00:02:10.188Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31740", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.24.100.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "211.24.100.205", + "type": "user-session" + } + }, + "sequence": 186180, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cs95UmcBTFzn_XoLKGaD", + "source": { + "@timestamp": "2018-11-27T00:02:10.392Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31740", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.24.100.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "211.24.100.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186181, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "211.24.100.205" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hs93UmcBTFzn_XoLcEF7", + "source": { + "@timestamp": "2018-11-27T00:00:17.552Z", + "source": { + "ip": "142.93.210.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "142.93.210.90" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192387, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31968", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h893UmcBTFzn_XoLcEF7", + "source": { + "@timestamp": "2018-11-27T00:00:17.552Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31968" + }, + "source": { + "ip": "142.93.210.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192388, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "142.93.210.90", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iM93UmcBTFzn_XoLcEF7", + "source": { + "@timestamp": "2018-11-27T00:00:17.784Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31968" + }, + "source": { + "ip": "142.93.210.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "142.93.210.90" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192389, + "result": "fail", + "session": "unset", + "data": { + "hostname": "142.93.210.90", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "k899UmcBTFzn_XoL6M7W", + "source": { + "@timestamp": "2018-11-27T00:07:21.573Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "27895", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "174.50.26.154" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "174.50.26.154", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 44073, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lM99UmcBTFzn_XoL6M7W", + "source": { + "@timestamp": "2018-11-27T00:07:21.577Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "174.50.26.154", + "type": "user-session" + } + }, + "sequence": 44074, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "27895", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "174.50.26.154" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lc99UmcBTFzn_XoL6M7W", + "source": { + "@timestamp": "2018-11-27T00:07:21.673Z", + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "27895" + }, + "source": { + "ip": "174.50.26.154" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44075, + "result": "fail", + "session": "unset", + "data": { + "hostname": "174.50.26.154", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "174.50.26.154", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aM97UmcBTFzn_XoL4qJ8", + "source": { + "@timestamp": "2018-11-27T00:05:08.881Z", + "process": { + "pid": "31758", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.38.82.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186185 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ac97UmcBTFzn_XoL4qJ8", + "source": { + "@timestamp": "2018-11-27T00:05:08.882Z", + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186186, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.38.82.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31758", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "as97UmcBTFzn_XoL4qJ8", + "source": { + "@timestamp": "2018-11-27T00:05:08.989Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31758", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186187, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.38.82.60" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "51.38.82.60" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4M99UmcBTFzn_XoLtco1", + "source": { + "@timestamp": "2018-11-27T00:07:08.363Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31768", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.101.26.63" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "46.101.26.63", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186191 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4c99UmcBTFzn_XoLtco1", + "source": { + "@timestamp": "2018-11-27T00:07:08.364Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31768", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.101.26.63" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.101.26.63", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186192, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4s99UmcBTFzn_XoLtco1", + "source": { + "@timestamp": "2018-11-27T00:07:08.463Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31768", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.101.26.63" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186193, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "46.101.26.63" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "46.101.26.63" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_NCBUmcBTFzn_XoLzSMR", + "source": { + "@timestamp": "2018-11-27T00:11:36.615Z", + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "86.96.203.107", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186212 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31802", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.96.203.107" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dCBUmcBTFzn_XoLzSMR", + "source": { + "@timestamp": "2018-11-27T00:11:36.616Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31802", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.96.203.107" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "86.96.203.107", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186213, + "result": "fail", + "session": "unset" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tCBUmcBTFzn_XoLzSMR", + "source": { + "@timestamp": "2018-11-27T00:11:36.828Z", + "source": { + "ip": "86.96.203.107" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "86.96.203.107" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "86.96.203.107", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186214, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31802" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WdCBUmcBTFzn_XoLzyVY", + "source": { + "@timestamp": "2018-11-27T00:11:37.195Z", + "auditd": { + "sequence": 43095, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.248.236.32" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12257", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.236.32" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WtCBUmcBTFzn_XoLzyVY", + "source": { + "@timestamp": "2018-11-27T00:11:37.195Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "12257", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.236.32" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43096, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "104.248.236.32", + "type": "user-session", + "primary": "sshd" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9CBUmcBTFzn_XoLzyVY", + "source": { + "@timestamp": "2018-11-27T00:11:37.223Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43097, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "104.248.236.32", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "104.248.236.32", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12257", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.236.32" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZNCBUmcBTFzn_XoL0yWS", + "source": { + "@timestamp": "2018-11-27T00:11:38.280Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "32078", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.26.184" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "91.121.26.184", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192402 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZdCBUmcBTFzn_XoL0yWS", + "source": { + "@timestamp": "2018-11-27T00:11:38.280Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "91.121.26.184", + "type": "user-session" + } + }, + "sequence": 192403, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32078", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.26.184" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtCBUmcBTFzn_XoL0yWS", + "source": { + "@timestamp": "2018-11-27T00:11:38.388Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32078", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "91.121.26.184" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192404, + "result": "fail", + "session": "unset", + "data": { + "hostname": "91.121.26.184", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "91.121.26.184", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HtCBUmcBTFzn_XoLJBa0", + "source": { + "@timestamp": "2018-11-27T00:10:53.514Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19210", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "206.189.183.75" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "206.189.183.75" + } + }, + "sequence": 142258, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "H9CBUmcBTFzn_XoLJBa0", + "source": { + "@timestamp": "2018-11-27T00:10:53.515Z", + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "206.189.183.75" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142259, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19210" + }, + "source": { + "ip": "206.189.183.75" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INCBUmcBTFzn_XoLJBa0", + "source": { + "@timestamp": "2018-11-27T00:10:53.546Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142260, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "206.189.183.75" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "206.189.183.75" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19210", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "206.189.183.75" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9CCUmcBTFzn_XoL5z0B", + "source": { + "@timestamp": "2018-11-27T00:12:48.790Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19223" + }, + "source": { + "ip": "188.166.213.254" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "188.166.213.254", + "type": "user-session" + } + }, + "sequence": 142261, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNCCUmcBTFzn_XoL5z0B", + "source": { + "@timestamp": "2018-11-27T00:12:48.791Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19223", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.166.213.254" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142262, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "188.166.213.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adCCUmcBTFzn_XoL5z0B", + "source": { + "@timestamp": "2018-11-27T00:12:48.985Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19223", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.166.213.254" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142263, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "188.166.213.254" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "188.166.213.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytCAUmcBTFzn_XoLfAfq", + "source": { + "@timestamp": "2018-11-27T00:10:10.560Z", + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31792", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "123.136.161.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "123.136.161.146" + } + }, + "sequence": 186206, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9CAUmcBTFzn_XoLfAfq", + "source": { + "@timestamp": "2018-11-27T00:10:10.561Z", + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "123.136.161.146", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186207, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31792", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "123.136.161.146" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNCAUmcBTFzn_XoLfAfq", + "source": { + "@timestamp": "2018-11-27T00:10:10.789Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31792", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "123.136.161.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "123.136.161.146" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "123.136.161.146" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186208, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NCBUmcBTFzn_XoLRxhI", + "source": { + "@timestamp": "2018-11-27T00:11:02.367Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31799", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.241.146.65" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186209, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "103.241.146.65", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dCBUmcBTFzn_XoLRxhI", + "source": { + "@timestamp": "2018-11-27T00:11:02.368Z", + "source": { + "ip": "103.241.146.65" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "103.241.146.65", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186210 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31799", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tCBUmcBTFzn_XoLRxhI", + "source": { + "@timestamp": "2018-11-27T00:11:02.619Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31799", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.241.146.65" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186211, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "103.241.146.65", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "103.241.146.65" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdCDUmcBTFzn_XoLZUd0", + "source": { + "@timestamp": "2018-11-27T00:13:21.161Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "104.248.159.44", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186218, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31813", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.159.44" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktCDUmcBTFzn_XoLZUd0", + "source": { + "@timestamp": "2018-11-27T00:13:21.162Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.248.159.44", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186219, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31813" + }, + "source": { + "ip": "104.248.159.44" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "k9CDUmcBTFzn_XoLZUd0", + "source": { + "@timestamp": "2018-11-27T00:13:21.355Z", + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "104.248.159.44", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.248.159.44", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186220, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31813", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.159.44" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdCCUmcBTFzn_XoLfDPd", + "source": { + "@timestamp": "2018-11-27T00:12:21.596Z", + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186215, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31805", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztCCUmcBTFzn_XoLfDPd", + "source": { + "@timestamp": "2018-11-27T00:12:21.598Z", + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186216, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31805" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z9CCUmcBTFzn_XoLfDPd", + "source": { + "@timestamp": "2018-11-27T00:12:21.740Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186217, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "46.148.18.163", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31805", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9CAUmcBTFzn_XoL2xDJ", + "source": { + "@timestamp": "2018-11-27T00:10:34.814Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "177.206.128.131", + "type": "user-session" + } + }, + "sequence": 43092, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12250", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "177.206.128.131" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNCAUmcBTFzn_XoL2xDJ", + "source": { + "@timestamp": "2018-11-27T00:10:34.814Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12250", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "177.206.128.131" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "177.206.128.131", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43093, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdCAUmcBTFzn_XoL2xDJ", + "source": { + "@timestamp": "2018-11-27T00:10:35.006Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12250", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "177.206.128.131" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43094, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "177.206.128.131" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "177.206.128.131", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cdCCUmcBTFzn_XoLBilE", + "source": { + "@timestamp": "2018-11-27T00:11:51.257Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "142.93.109.33" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "142.93.109.33", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43098, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12259", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctCCUmcBTFzn_XoLBilE", + "source": { + "@timestamp": "2018-11-27T00:11:51.257Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12259", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.109.33" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "142.93.109.33", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43099, + "result": "fail" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9CCUmcBTFzn_XoLBilE", + "source": { + "@timestamp": "2018-11-27T00:11:51.365Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12259", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.109.33" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "142.93.109.33" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43100, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "142.93.109.33", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5NCHUmcBTFzn_XoLiqIH", + "source": { + "@timestamp": "2018-11-27T00:17:52.669Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192414, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "161.132.195.76", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32116", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "161.132.195.76" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5dCHUmcBTFzn_XoLiqIH", + "source": { + "@timestamp": "2018-11-27T00:17:52.670Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32116", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "161.132.195.76" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "161.132.195.76" + } + }, + "sequence": 192415, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5tCHUmcBTFzn_XoLiqIH", + "source": { + "@timestamp": "2018-11-27T00:17:52.776Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32116" + }, + "source": { + "ip": "161.132.195.76" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "161.132.195.76", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192416, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "161.132.195.76", + "terminal": "ssh" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9CHUmcBTFzn_XoLj6PQ", + "source": { + "@timestamp": "2018-11-27T00:17:54.150Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31844" + }, + "source": { + "ip": "202.175.83.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "202.175.83.165" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186236, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNCHUmcBTFzn_XoLj6PQ", + "source": { + "@timestamp": "2018-11-27T00:17:54.151Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31844" + }, + "source": { + "ip": "202.175.83.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186237, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "202.175.83.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdCHUmcBTFzn_XoLj6PQ", + "source": { + "@timestamp": "2018-11-27T00:17:54.333Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31844" + }, + "source": { + "ip": "202.175.83.165" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186238, + "result": "fail", + "session": "unset", + "data": { + "hostname": "202.175.83.165", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "202.175.83.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNCHUmcBTFzn_XoLkqTG", + "source": { + "@timestamp": "2018-11-27T00:17:54.909Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32118", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "128.199.107.237" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.107.237", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192417, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdCHUmcBTFzn_XoLkqTG", + "source": { + "@timestamp": "2018-11-27T00:17:54.910Z", + "source": { + "ip": "128.199.107.237" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.107.237", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192418, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32118", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NtCHUmcBTFzn_XoLkqTG", + "source": { + "@timestamp": "2018-11-27T00:17:55.100Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "128.199.107.237" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "128.199.107.237", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "128.199.107.237", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192419 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32118", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "P9CHUmcBTFzn_XoLmKRB", + "source": { + "@timestamp": "2018-11-27T00:17:56.311Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "197.149.137.86", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192420, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32120", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "197.149.137.86" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QNCHUmcBTFzn_XoLmKRB", + "source": { + "@timestamp": "2018-11-27T00:17:56.312Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "197.149.137.86", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192421, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32120", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "197.149.137.86" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdCHUmcBTFzn_XoLmKRB", + "source": { + "@timestamp": "2018-11-27T00:17:56.547Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "197.149.137.86", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "197.149.137.86" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192422 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32120" + }, + "source": { + "ip": "197.149.137.86" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kNCIUmcBTFzn_XoL68Ge", + "source": { + "@timestamp": "2018-11-27T00:19:23.188Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31854" + }, + "source": { + "ip": "165.227.63.250" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "165.227.63.250", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186242, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdCIUmcBTFzn_XoL68Ge", + "source": { + "@timestamp": "2018-11-27T00:19:23.189Z", + "process": { + "pid": "31854", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "165.227.63.250" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "165.227.63.250", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186243 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktCIUmcBTFzn_XoL68Ge", + "source": { + "@timestamp": "2018-11-27T00:19:23.230Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31854", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "165.227.63.250" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "165.227.63.250", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "165.227.63.250", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186244, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7tCIUmcBTFzn_XoL_MPx", + "source": { + "@timestamp": "2018-11-27T00:19:27.623Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24879" + }, + "source": { + "ip": "185.137.92.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.137.92.168" + } + }, + "sequence": 184264 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "79CIUmcBTFzn_XoL_MPx", + "source": { + "@timestamp": "2018-11-27T00:19:27.624Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "24879", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.137.92.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "185.137.92.168", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184265 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8NCIUmcBTFzn_XoL_MPx", + "source": { + "@timestamp": "2018-11-27T00:19:27.733Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24879", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.137.92.168" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "185.137.92.168" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "185.137.92.168" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184266, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdCJUmcBTFzn_XoLMcci", + "source": { + "@timestamp": "2018-11-27T00:19:40.983Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31857", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.58.119.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186245, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.58.119.156" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stCJUmcBTFzn_XoLMcci", + "source": { + "@timestamp": "2018-11-27T00:19:40.984Z", + "source": { + "ip": "185.58.119.156" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.58.119.156" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186246, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31857", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "s9CJUmcBTFzn_XoLMcci", + "source": { + "@timestamp": "2018-11-27T00:19:41.111Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31857", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.58.119.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186247, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "185.58.119.156", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "185.58.119.156", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RdCJUmcBTFzn_XoLOcgJ", + "source": { + "@timestamp": "2018-11-27T00:19:43.008Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "201.134.231.33" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186248, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31859", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.134.231.33" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RtCJUmcBTFzn_XoLOcgJ", + "source": { + "@timestamp": "2018-11-27T00:19:43.009Z", + "process": { + "pid": "31859", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.134.231.33" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "201.134.231.33", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 186249, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R9CJUmcBTFzn_XoLOcgJ", + "source": { + "@timestamp": "2018-11-27T00:19:43.074Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "201.134.231.33", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 186250, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "201.134.231.33", + "terminal": "ssh" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31859", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.134.231.33" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtCGUmcBTFzn_XoL3pS1", + "source": { + "@timestamp": "2018-11-27T00:17:08.809Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32108" + }, + "source": { + "ip": "220.116.47.116" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "220.116.47.116", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192411, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9CGUmcBTFzn_XoL3pS1", + "source": { + "@timestamp": "2018-11-27T00:17:08.810Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "220.116.47.116", + "type": "user-session" + } + }, + "sequence": 192412, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32108" + }, + "source": { + "ip": "220.116.47.116" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNCGUmcBTFzn_XoL3pS1", + "source": { + "@timestamp": "2018-11-27T00:17:08.983Z", + "source": { + "ip": "220.116.47.116" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "220.116.47.116", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "220.116.47.116", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192413, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32108", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNCIUmcBTFzn_XoLa7Yh", + "source": { + "@timestamp": "2018-11-27T00:18:50.295Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24869" + }, + "source": { + "ip": "222.117.50.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "222.117.50.66" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184258, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdCIUmcBTFzn_XoLa7Yh", + "source": { + "@timestamp": "2018-11-27T00:18:50.297Z", + "process": { + "pid": "24869", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.117.50.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "222.117.50.66", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184259 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtCIUmcBTFzn_XoLa7Yh", + "source": { + "@timestamp": "2018-11-27T00:18:50.462Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "222.117.50.66", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "222.117.50.66", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 184260, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24869", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.117.50.66" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNCIUmcBTFzn_XoLeri8", + "source": { + "@timestamp": "2018-11-27T00:18:54.288Z", + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186239, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31851", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdCIUmcBTFzn_XoLeri8", + "source": { + "@timestamp": "2018-11-27T00:18:54.289Z", + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186240, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31851", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StCIUmcBTFzn_XoLeri8", + "source": { + "@timestamp": "2018-11-27T00:18:54.436Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31851" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "46.148.18.163", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186241 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9CJUmcBTFzn_XoLDcR_", + "source": { + "@timestamp": "2018-11-27T00:19:31.861Z", + "source": { + "ip": "85.234.34.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "85.234.34.90", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 184267, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "24881", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNCJUmcBTFzn_XoLDcR_", + "source": { + "@timestamp": "2018-11-27T00:19:31.862Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "85.234.34.90", + "type": "user-session" + } + }, + "sequence": 184268, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24881" + }, + "source": { + "ip": "85.234.34.90" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adCJUmcBTFzn_XoLDcR_", + "source": { + "@timestamp": "2018-11-27T00:19:32.020Z", + "source": { + "ip": "85.234.34.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "85.234.34.90", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "85.234.34.90", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184269, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24881" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OtCIUmcBTFzn_XoL08CH", + "source": { + "@timestamp": "2018-11-27T00:19:17.019Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24877", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "27.254.90.106" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "27.254.90.106", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184261 + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "O9CIUmcBTFzn_XoL08CH", + "source": { + "@timestamp": "2018-11-27T00:19:17.020Z", + "source": { + "ip": "27.254.90.106" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184262, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "27.254.90.106", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24877", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PNCIUmcBTFzn_XoL08CH", + "source": { + "@timestamp": "2018-11-27T00:19:17.244Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "27.254.90.106", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "27.254.90.106", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184263 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24877", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "27.254.90.106" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dCJUmcBTFzn_XoLv9T4", + "source": { + "@timestamp": "2018-11-27T00:20:17.545Z", + "auditd": { + "sequence": 44088, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "87.191.133.16", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28146", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "87.191.133.16" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tCJUmcBTFzn_XoLv9T4", + "source": { + "@timestamp": "2018-11-27T00:20:17.545Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28146" + }, + "source": { + "ip": "87.191.133.16" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "87.191.133.16", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44089, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_9CJUmcBTFzn_XoLv9T4", + "source": { + "@timestamp": "2018-11-27T00:20:17.665Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "87.191.133.16", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "87.191.133.16", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44090, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28146", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "source": { + "ip": "87.191.133.16" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtGOUmcBTFzn_XoLCjLw", + "source": { + "@timestamp": "2018-11-27T00:24:58.886Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24919", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.55.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184276, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.128.55.52", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "x9GOUmcBTFzn_XoLCjLw", + "source": { + "@timestamp": "2018-11-27T00:24:58.888Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "178.128.55.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184277, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "178.128.55.52", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24919", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yNGOUmcBTFzn_XoLCjLw", + "source": { + "@timestamp": "2018-11-27T00:24:59.080Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24919", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.55.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "178.128.55.52", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "178.128.55.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184278 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtGOUmcBTFzn_XoLEzP0", + "source": { + "@timestamp": "2018-11-27T00:25:01.159Z", + "auditd": { + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:accounting", + "terminal": "cron" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44103, + "result": "success" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "was-authorized", + "module": "auditd", + "category": "user-login", + "type": "user_acct" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "28242", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9GOUmcBTFzn_XoLEzP0", + "source": { + "@timestamp": "2018-11-27T00:25:01.159Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28242", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 44104, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNGOUmcBTFzn_XoLEzP0", + "source": { + "@timestamp": "2018-11-27T00:25:01.159Z", + "process": { + "pid": "28242", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 44106, + "result": "success", + "session": "1443", + "data": { + "op": "PAM:session_open", + "terminal": "cron", + "acct": "root" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_start", + "action": "started-session" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GdGOUmcBTFzn_XoLEzP0", + "source": { + "@timestamp": "2018-11-27T00:25:01.163Z", + "event": { + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "0", + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "28242" + }, + "auditd": { + "sequence": 44107, + "result": "success", + "session": "1443", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GtGOUmcBTFzn_XoLEzP0", + "source": { + "@timestamp": "2018-11-27T00:25:01.163Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "28242", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 44108, + "result": "success", + "session": "1443", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_close" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_end", + "action": "ended-session", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9GOUmcBTFzn_XoLLTXy", + "source": { + "@timestamp": "2018-11-27T00:25:07.848Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24921" + }, + "source": { + "ip": "78.217.134.141" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "78.217.134.141", + "type": "user-session" + } + }, + "sequence": 184279 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNGOUmcBTFzn_XoLLTXy", + "source": { + "@timestamp": "2018-11-27T00:25:07.849Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24921" + }, + "source": { + "ip": "78.217.134.141" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "78.217.134.141" + } + }, + "sequence": 184280 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdGOUmcBTFzn_XoLLTXy", + "source": { + "@timestamp": "2018-11-27T00:25:07.962Z", + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24921", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "78.217.134.141" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "78.217.134.141", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "78.217.134.141", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184281, + "result": "fail" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NGOUmcBTFzn_XoLLjX5", + "source": { + "@timestamp": "2018-11-27T00:25:08.111Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "151.80.144.39", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142273 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19291", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "151.80.144.39" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dGOUmcBTFzn_XoLLjX5", + "source": { + "@timestamp": "2018-11-27T00:25:08.112Z", + "process": { + "pid": "19291", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "151.80.144.39" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142274, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "151.80.144.39", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0tGOUmcBTFzn_XoLLjX5", + "source": { + "@timestamp": "2018-11-27T00:25:08.218Z", + "auditd": { + "sequence": 142275, + "result": "fail", + "session": "unset", + "data": { + "hostname": "151.80.144.39", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "151.80.144.39", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19291" + }, + "source": { + "ip": "151.80.144.39" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xNGOUmcBTFzn_XoLYDl2", + "source": { + "@timestamp": "2018-11-27T00:25:20.780Z", + "process": { + "pid": "24924", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.208.143.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184282, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "104.208.143.92", + "type": "user-session", + "primary": "sshd" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xdGOUmcBTFzn_XoLYDl2", + "source": { + "@timestamp": "2018-11-27T00:25:20.781Z", + "process": { + "pid": "24924", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.208.143.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184283, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.208.143.92" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtGOUmcBTFzn_XoLYDl2", + "source": { + "@timestamp": "2018-11-27T00:25:20.819Z", + "process": { + "pid": "24924", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.208.143.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "104.208.143.92", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "104.208.143.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184284, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "nNGPUmcBTFzn_XoLF0mX", + "source": { + "@timestamp": "2018-11-27T00:26:07.661Z", + "source": { + "ip": "197.13.4.211" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "197.13.4.211", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 184285 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "24931", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ndGPUmcBTFzn_XoLF0mX", + "source": { + "@timestamp": "2018-11-27T00:26:07.662Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "197.13.4.211" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184286, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24931", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "197.13.4.211" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntGPUmcBTFzn_XoLF0mX", + "source": { + "@timestamp": "2018-11-27T00:26:07.796Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24931", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "197.13.4.211" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "197.13.4.211" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "197.13.4.211", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184287 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9GPUmcBTFzn_XoLi1R8", + "source": { + "@timestamp": "2018-11-27T00:26:37.330Z", + "source": { + "ip": "128.199.216.13" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.216.13", + "type": "user-session" + } + }, + "sequence": 192431, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32510", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONGPUmcBTFzn_XoLi1R8", + "source": { + "@timestamp": "2018-11-27T00:26:37.331Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32510", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.216.13" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.216.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192432 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdGPUmcBTFzn_XoLi1R8", + "source": { + "@timestamp": "2018-11-27T00:26:37.524Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "32510", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.216.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192433, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "128.199.216.13", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "128.199.216.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNGNUmcBTFzn_XoLxiyC", + "source": { + "@timestamp": "2018-11-27T00:24:41.365Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "147.135.208.7", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43116, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12336" + }, + "source": { + "ip": "147.135.208.7" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idGNUmcBTFzn_XoLxiyC", + "source": { + "@timestamp": "2018-11-27T00:24:41.365Z", + "source": { + "ip": "147.135.208.7" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43117, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "147.135.208.7", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12336", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "itGNUmcBTFzn_XoLxiyC", + "source": { + "@timestamp": "2018-11-27T00:24:41.497Z", + "auditd": { + "sequence": 43118, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "147.135.208.7" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "147.135.208.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12336" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "147.135.208.7" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3NGPUmcBTFzn_XoLV05i", + "source": { + "@timestamp": "2018-11-27T00:26:23.985Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.38.38.221", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44109, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "28278", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.38.221" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3dGPUmcBTFzn_XoLV05i", + "source": { + "@timestamp": "2018-11-27T00:26:23.989Z", + "process": { + "pid": "28278", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.38.221" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "51.38.38.221", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44110, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3tGPUmcBTFzn_XoLV05i", + "source": { + "@timestamp": "2018-11-27T00:26:24.093Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "51.38.38.221", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.38.38.221", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44111, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28278", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.38.221" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdGNUmcBTFzn_XoLoilI", + "source": { + "@timestamp": "2018-11-27T00:24:32.089Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28228", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.138.233.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "202.138.233.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44100 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NtGNUmcBTFzn_XoLoilI", + "source": { + "@timestamp": "2018-11-27T00:24:32.089Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28228", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "202.138.233.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "202.138.233.92" + } + }, + "sequence": 44101 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9GNUmcBTFzn_XoLoilI", + "source": { + "@timestamp": "2018-11-27T00:24:32.345Z", + "process": { + "pid": "28228", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "202.138.233.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44102, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "202.138.233.92", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "202.138.233.92", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69GPUmcBTFzn_XoLM0ud", + "source": { + "@timestamp": "2018-11-27T00:26:14.833Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1", + "name": "systemd", + "exe": "/lib/systemd/systemd" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "unit": "apt-daily" + }, + "summary": { + "object": { + "primary": "apt-daily", + "type": "service" + }, + "how": "/lib/systemd/systemd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192429 + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "system-services", + "type": "service_start", + "action": "started-service", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7NGPUmcBTFzn_XoLM0ud", + "source": { + "@timestamp": "2018-11-27T00:26:14.834Z", + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "1", + "name": "systemd", + "exe": "/lib/systemd/systemd" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "apt-daily", + "type": "service" + }, + "how": "/lib/systemd/systemd" + }, + "sequence": 192430, + "result": "success", + "session": "unset", + "data": { + "unit": "apt-daily" + } + }, + "event": { + "action": "stopped-service", + "module": "auditd", + "category": "system-services", + "type": "service_stop" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dGTUmcBTFzn_XoLE6A1", + "source": { + "@timestamp": "2018-11-27T00:30:28.676Z", + "process": { + "pid": "28355", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "212.227.192.118" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44115, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "212.227.192.118", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tGTUmcBTFzn_XoLE6A1", + "source": { + "@timestamp": "2018-11-27T00:30:28.680Z", + "process": { + "pid": "28355", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "212.227.192.118" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "212.227.192.118", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44116, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-9GTUmcBTFzn_XoLE6A1", + "source": { + "@timestamp": "2018-11-27T00:30:28.788Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "212.227.192.118" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "212.227.192.118", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44117, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28355" + }, + "source": { + "ip": "212.227.192.118" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_NGTUmcBTFzn_XoLIaG8", + "source": { + "@timestamp": "2018-11-27T00:30:32.403Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32532", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.56.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.56.243", + "type": "user-session" + } + }, + "sequence": 192437 + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dGTUmcBTFzn_XoLIaG8", + "source": { + "@timestamp": "2018-11-27T00:30:32.404Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32532" + }, + "source": { + "ip": "164.132.56.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "164.132.56.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192438, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tGTUmcBTFzn_XoLIaG8", + "source": { + "@timestamp": "2018-11-27T00:30:32.516Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32532", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "164.132.56.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "164.132.56.243", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192439, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "164.132.56.243" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9GVUmcBTFzn_XoLvdvo", + "source": { + "@timestamp": "2018-11-27T00:33:23.454Z", + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184297, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "222.252.30.117", + "type": "user-session" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24978", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.252.30.117" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNGVUmcBTFzn_XoLvdvo", + "source": { + "@timestamp": "2018-11-27T00:33:23.455Z", + "source": { + "ip": "222.252.30.117" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184298, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "222.252.30.117", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "24978", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "odGVUmcBTFzn_XoLvdvo", + "source": { + "@timestamp": "2018-11-27T00:33:23.682Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "24978", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.252.30.117" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "222.252.30.117", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 184299, + "result": "fail", + "session": "unset", + "data": { + "hostname": "222.252.30.117", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dGUUmcBTFzn_XoLfr-C", + "source": { + "@timestamp": "2018-11-27T00:32:01.688Z", + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "194.35.114.10", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184294, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "24969", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "194.35.114.10" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0tGUUmcBTFzn_XoLfr-C", + "source": { + "@timestamp": "2018-11-27T00:32:01.689Z", + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "194.35.114.10" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "194.35.114.10", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184295, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24969" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "09GUUmcBTFzn_XoLfr-C", + "source": { + "@timestamp": "2018-11-27T00:32:01.975Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "194.35.114.10", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "194.35.114.10", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 184296, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24969" + }, + "source": { + "ip": "194.35.114.10" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdGUUmcBTFzn_XoLVrxv", + "source": { + "@timestamp": "2018-11-27T00:31:51.428Z", + "source": { + "ip": "54.222.243.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "54.222.243.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184291, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24967" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtGUUmcBTFzn_XoLVrxv", + "source": { + "@timestamp": "2018-11-27T00:31:51.429Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "24967" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "54.222.243.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "54.222.243.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 184292 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9GUUmcBTFzn_XoLVrxv", + "source": { + "@timestamp": "2018-11-27T00:31:51.655Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "24967", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.222.243.60" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "54.222.243.60", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "54.222.243.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184293, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNGWUmcBTFzn_XoLZOnx", + "source": { + "@timestamp": "2018-11-27T00:34:06.215Z", + "auditd": { + "sequence": 186263, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "187.188.146.35", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31932" + }, + "source": { + "ip": "187.188.146.35" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idGWUmcBTFzn_XoLZOnx", + "source": { + "@timestamp": "2018-11-27T00:34:06.216Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "187.188.146.35", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186264, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31932", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "187.188.146.35" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "itGWUmcBTFzn_XoLZOnx", + "source": { + "@timestamp": "2018-11-27T00:34:06.294Z", + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "187.188.146.35" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "187.188.146.35", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186265, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31932", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "187.188.146.35" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5NGTUmcBTFzn_XoLoqzb", + "source": { + "@timestamp": "2018-11-27T00:31:05.454Z", + "source": { + "ip": "190.153.219.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43128, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "190.153.219.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12380", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5dGTUmcBTFzn_XoLoqzb", + "source": { + "@timestamp": "2018-11-27T00:31:05.454Z", + "process": { + "pid": "12380", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.153.219.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "190.153.219.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43129, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5tGTUmcBTFzn_XoLoqzb", + "source": { + "@timestamp": "2018-11-27T00:31:05.610Z", + "auditd": { + "sequence": 43130, + "result": "fail", + "session": "unset", + "data": { + "hostname": "190.153.219.50", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "190.153.219.50", + "type": "user-session" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12380", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.153.219.50" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "f9GUUmcBTFzn_XoLl8LQ", + "source": { + "@timestamp": "2018-11-27T00:32:08.159Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12388", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.75.29.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.75.29.64", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43131, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNGUUmcBTFzn_XoLl8LQ", + "source": { + "@timestamp": "2018-11-27T00:32:08.163Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.75.29.64", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43132, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12388", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.75.29.64" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdGUUmcBTFzn_XoLl8LQ", + "source": { + "@timestamp": "2018-11-27T00:32:08.283Z", + "source": { + "ip": "51.75.29.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "51.75.29.64" + } + }, + "sequence": 43133, + "result": "fail", + "session": "unset", + "data": { + "hostname": "51.75.29.64", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12388", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9GUUmcBTFzn_XoLpsMN", + "source": { + "@timestamp": "2018-11-27T00:32:11.807Z", + "source": { + "ip": "159.203.94.6" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "159.203.94.6" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43134, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12390", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNGUUmcBTFzn_XoLpsMN", + "source": { + "@timestamp": "2018-11-27T00:32:11.807Z", + "process": { + "pid": "12390", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.94.6" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.203.94.6", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43135 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LdGUUmcBTFzn_XoLpsMN", + "source": { + "@timestamp": "2018-11-27T00:32:11.839Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12390", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.94.6" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "159.203.94.6", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "159.203.94.6", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43136 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "49GUUmcBTFzn_XoL7sk-", + "source": { + "@timestamp": "2018-11-27T00:32:30.290Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28397", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.255.35.58" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44118, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "51.255.35.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5NGUUmcBTFzn_XoL7sk-", + "source": { + "@timestamp": "2018-11-27T00:32:30.290Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "28397", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.255.35.58" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44119, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "51.255.35.58", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5dGUUmcBTFzn_XoL7sk-", + "source": { + "@timestamp": "2018-11-27T00:32:30.394Z", + "auditd": { + "sequence": 44120, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.255.35.58" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.255.35.58", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28397", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.255.35.58" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtKdUmcBTFzn_XoLzIys", + "source": { + "@timestamp": "2018-11-27T00:42:11.490Z", + "process": { + "pid": "28582", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "51.75.23.199" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.75.23.199", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44127, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9KdUmcBTFzn_XoLzIys", + "source": { + "@timestamp": "2018-11-27T00:42:11.494Z", + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "51.75.23.199", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44128, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "28582", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.75.23.199" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNKdUmcBTFzn_XoLzIys", + "source": { + "@timestamp": "2018-11-27T00:42:11.598Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28582" + }, + "source": { + "ip": "51.75.23.199" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44129, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "51.75.23.199", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "51.75.23.199" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atKdUmcBTFzn_XoLzYxc", + "source": { + "@timestamp": "2018-11-27T00:42:11.696Z", + "source": { + "ip": "180.76.100.10" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186281, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "180.76.100.10", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31982" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9KdUmcBTFzn_XoLzYxc", + "source": { + "@timestamp": "2018-11-27T00:42:11.697Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31982", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "180.76.100.10" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186282, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "180.76.100.10", + "type": "user-session", + "primary": "sshd" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNKdUmcBTFzn_XoLzYxc", + "source": { + "@timestamp": "2018-11-27T00:42:11.935Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31982", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "180.76.100.10" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "180.76.100.10", + "type": "user-session" + } + }, + "sequence": 186283, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "180.76.100.10", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9KfUmcBTFzn_XoLkLSD", + "source": { + "@timestamp": "2018-11-27T00:44:07.193Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "115.146.127.134", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142297, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19404", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.134" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONKfUmcBTFzn_XoLkLSD", + "source": { + "@timestamp": "2018-11-27T00:44:07.194Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "115.146.127.134" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142298, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19404", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.134" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdKfUmcBTFzn_XoLkLSD", + "source": { + "@timestamp": "2018-11-27T00:44:07.394Z", + "process": { + "pid": "19404", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.134" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142299, + "result": "fail", + "session": "unset", + "data": { + "hostname": "115.146.127.134", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "115.146.127.134", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ftKgUmcBTFzn_XoLxc3Y", + "source": { + "@timestamp": "2018-11-27T00:45:26.381Z", + "auditd": { + "sequence": 184306, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "201.245.191.102", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25092" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "201.245.191.102" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "f9KgUmcBTFzn_XoLxc3Y", + "source": { + "@timestamp": "2018-11-27T00:45:26.382Z", + "source": { + "ip": "201.245.191.102" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "secondary": "201.245.191.102", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184307, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25092", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNKgUmcBTFzn_XoLxc3Y", + "source": { + "@timestamp": "2018-11-27T00:45:26.503Z", + "process": { + "pid": "25092", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.245.191.102" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "201.245.191.102", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "201.245.191.102", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184308, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59KeUmcBTFzn_XoLO5ZL", + "source": { + "@timestamp": "2018-11-27T00:42:39.841Z", + "process": { + "pid": "19396", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.97.173.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142294, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "209.97.173.192", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NKeUmcBTFzn_XoLO5ZL", + "source": { + "@timestamp": "2018-11-27T00:42:39.843Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19396", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.97.173.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "secondary": "209.97.173.192", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142295, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dKeUmcBTFzn_XoLO5ZL", + "source": { + "@timestamp": "2018-11-27T00:42:40.035Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19396", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.97.173.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142296, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "209.97.173.192" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "209.97.173.192", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xdKbUmcBTFzn_XoL6WOD", + "source": { + "@timestamp": "2018-11-27T00:40:07.833Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32633" + }, + "source": { + "ip": "134.175.28.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192449, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "134.175.28.156", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtKbUmcBTFzn_XoL6WOD", + "source": { + "@timestamp": "2018-11-27T00:40:07.834Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32633", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "134.175.28.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "134.175.28.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192450, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "x9KbUmcBTFzn_XoL6WOD", + "source": { + "@timestamp": "2018-11-27T00:40:08.034Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "134.175.28.156", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "134.175.28.156", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192451 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32633", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "134.175.28.156" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntKbUmcBTFzn_XoL2WE6", + "source": { + "@timestamp": "2018-11-27T00:40:03.664Z", + "source": { + "ip": "79.134.4.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "79.134.4.138", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 186278 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31968", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9KbUmcBTFzn_XoL2WE6", + "source": { + "@timestamp": "2018-11-27T00:40:03.665Z", + "process": { + "pid": "31968", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "79.134.4.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "79.134.4.138", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186279, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNKbUmcBTFzn_XoL2WE6", + "source": { + "@timestamp": "2018-11-27T00:40:03.838Z", + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "sequence": 186280, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "79.134.4.138", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "79.134.4.138", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31968" + }, + "source": { + "ip": "79.134.4.138" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lNKdUmcBTFzn_XoLiIaH", + "source": { + "@timestamp": "2018-11-27T00:41:54.077Z", + "source": { + "ip": "203.66.168.81" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "203.66.168.81", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142291 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19393" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ldKdUmcBTFzn_XoLiIaH", + "source": { + "@timestamp": "2018-11-27T00:41:54.078Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142292, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "203.66.168.81", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19393", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "203.66.168.81" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltKdUmcBTFzn_XoLiIaH", + "source": { + "@timestamp": "2018-11-27T00:41:54.267Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19393" + }, + "source": { + "ip": "203.66.168.81" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "203.66.168.81" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "203.66.168.81", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142293 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNKeUmcBTFzn_XoLtKCT", + "source": { + "@timestamp": "2018-11-27T00:43:10.887Z", + "source": { + "ip": "116.93.119.13" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "116.93.119.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43137, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12451", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdKeUmcBTFzn_XoLtKCT", + "source": { + "@timestamp": "2018-11-27T00:43:10.887Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12451", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "116.93.119.13" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "116.93.119.13", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43138 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztKeUmcBTFzn_XoLtKCT", + "source": { + "@timestamp": "2018-11-27T00:43:11.127Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12451" + }, + "source": { + "ip": "116.93.119.13" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "116.93.119.13", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "116.93.119.13" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43139 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdKbUmcBTFzn_XoLs16u", + "source": { + "@timestamp": "2018-11-27T00:39:54.048Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "28538", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "41.185.28.133" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "41.185.28.133", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44124, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YtKbUmcBTFzn_XoLs16u", + "source": { + "@timestamp": "2018-11-27T00:39:54.052Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "41.185.28.133", + "type": "user-session" + } + }, + "sequence": 44125, + "result": "fail" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "28538", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "41.185.28.133" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Y9KbUmcBTFzn_XoLs16u", + "source": { + "@timestamp": "2018-11-27T00:39:54.292Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28538", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "41.185.28.133" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "41.185.28.133", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "41.185.28.133" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44126, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "otOnUmcBTFzn_XoLmmNb", + "source": { + "@timestamp": "2018-11-27T00:52:54.001Z", + "process": { + "pid": "25143", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.0.10.138" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184318, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "190.0.10.138" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "o9OnUmcBTFzn_XoLmmNb", + "source": { + "@timestamp": "2018-11-27T00:52:54.002Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25143", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "190.0.10.138", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184319, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pNOnUmcBTFzn_XoLmmNb", + "source": { + "@timestamp": "2018-11-27T00:52:54.109Z", + "source": { + "ip": "190.0.10.138" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184320, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "190.0.10.138", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "190.0.10.138", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25143" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59OrUmcBTFzn_XoL6cFF", + "source": { + "@timestamp": "2018-11-27T00:57:36.347Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192455, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "202.28.34.200", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.28.34.200" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NOrUmcBTFzn_XoL6cFF", + "source": { + "@timestamp": "2018-11-27T00:57:36.348Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32742" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192456, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "202.28.34.200", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dOrUmcBTFzn_XoL6cFF", + "source": { + "@timestamp": "2018-11-27T00:57:36.577Z", + "process": { + "pid": "32742", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "202.28.34.200" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "202.28.34.200", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "202.28.34.200" + } + }, + "sequence": 192457 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "P9OsUmcBTFzn_XoLBsX4", + "source": { + "@timestamp": "2018-11-27T00:57:43.944Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12534", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.10.44.255" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "103.10.44.255", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43146, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QNOsUmcBTFzn_XoLBsX4", + "source": { + "@timestamp": "2018-11-27T00:57:43.948Z", + "process": { + "pid": "12534", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.10.44.255" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43147, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "103.10.44.255" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdOsUmcBTFzn_XoLBsX4", + "source": { + "@timestamp": "2018-11-27T00:57:44.144Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12534", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.10.44.255" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "103.10.44.255", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "103.10.44.255", + "type": "user-session" + } + }, + "sequence": 43148, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNOpUmcBTFzn_XoLlY-1", + "source": { + "@timestamp": "2018-11-27T00:55:03.881Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "146.0.105.29", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186287 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32040", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "146.0.105.29" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdOpUmcBTFzn_XoLlY-1", + "source": { + "@timestamp": "2018-11-27T00:55:03.882Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "146.0.105.29", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186288, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32040", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "146.0.105.29" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtOpUmcBTFzn_XoLlY-1", + "source": { + "@timestamp": "2018-11-27T00:55:04.004Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "146.0.105.29", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186289, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "146.0.105.29" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32040", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "146.0.105.29" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtOpUmcBTFzn_XoL5pZA", + "source": { + "@timestamp": "2018-11-27T00:55:24.501Z", + "process": { + "pid": "12520", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.19.148.142" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "217.19.148.142", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43143, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9OpUmcBTFzn_XoL5pZA", + "source": { + "@timestamp": "2018-11-27T00:55:24.501Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12520" + }, + "source": { + "ip": "217.19.148.142" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "217.19.148.142", + "type": "user-session" + } + }, + "sequence": 43144, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNOpUmcBTFzn_XoL5pZA", + "source": { + "@timestamp": "2018-11-27T00:55:24.637Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12520", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.19.148.142" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "217.19.148.142" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "217.19.148.142", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43145, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NOmUmcBTFzn_XoLfUpL", + "source": { + "@timestamp": "2018-11-27T00:51:41.026Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "59.120.243.8", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184315, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25134", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "59.120.243.8" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dOmUmcBTFzn_XoLfUpL", + "source": { + "@timestamp": "2018-11-27T00:51:41.027Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "59.120.243.8", + "type": "user-session" + } + }, + "sequence": 184316, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25134", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "59.120.243.8" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tOmUmcBTFzn_XoLfUpL", + "source": { + "@timestamp": "2018-11-27T00:51:41.202Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25134" + }, + "source": { + "ip": "59.120.243.8" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "59.120.243.8", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "59.120.243.8", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184317, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9OpUmcBTFzn_XoLWIru", + "source": { + "@timestamp": "2018-11-27T00:54:48.324Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "32723", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "124.6.139.242" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "124.6.139.242", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 192452, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNOpUmcBTFzn_XoLWIru", + "source": { + "@timestamp": "2018-11-27T00:54:48.325Z", + "process": { + "pid": "32723", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "124.6.139.242" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "124.6.139.242", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192453, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "idOpUmcBTFzn_XoLWIru", + "source": { + "@timestamp": "2018-11-27T00:54:48.556Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32723", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "124.6.139.242" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "124.6.139.242" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "124.6.139.242", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192454, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YtOqUmcBTFzn_XoLnqU0", + "source": { + "@timestamp": "2018-11-27T00:56:11.591Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "28851", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "93.152.166.29" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44139, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "secondary": "93.152.166.29", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Y9OqUmcBTFzn_XoLnqU0", + "source": { + "@timestamp": "2018-11-27T00:56:11.591Z", + "source": { + "ip": "93.152.166.29" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "93.152.166.29", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44140, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "28851" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZNOqUmcBTFzn_XoLnqU0", + "source": { + "@timestamp": "2018-11-27T00:56:11.743Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "28851", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "93.152.166.29" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "93.152.166.29", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44141, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "93.152.166.29", + "op": "PAM:bad_ident" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9OnUmcBTFzn_XoLxWfH", + "source": { + "@timestamp": "2018-11-27T00:53:05.113Z", + "process": { + "pid": "28796", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.117.50.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44136, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "222.117.50.66", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNOnUmcBTFzn_XoLxWfH", + "source": { + "@timestamp": "2018-11-27T00:53:05.113Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "28796", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.117.50.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "222.117.50.66", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44137 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdOnUmcBTFzn_XoLxWfH", + "source": { + "@timestamp": "2018-11-27T00:53:05.277Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "28796", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "222.117.50.66" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "222.117.50.66", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44138, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "222.117.50.66", + "op": "PAM:bad_ident" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tSyUmcBTFzn_XoLI0rV", + "source": { + "@timestamp": "2018-11-27T01:04:24.552Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32096", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.133" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186305, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "115.146.127.133" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_9SyUmcBTFzn_XoLI0rV", + "source": { + "@timestamp": "2018-11-27T01:04:24.554Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32096", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "115.146.127.133" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186306, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "115.146.127.133", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANSyUmcBTFzn_XoLI0vV", + "source": { + "@timestamp": "2018-11-27T01:04:24.758Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32096" + }, + "source": { + "ip": "115.146.127.133" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186307, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "115.146.127.133" + }, + "summary": { + "object": { + "secondary": "115.146.127.133", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNSxUmcBTFzn_XoL-0d6", + "source": { + "@timestamp": "2018-11-27T01:04:14.224Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32089", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186302, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "odSxUmcBTFzn_XoL-0d6", + "source": { + "@timestamp": "2018-11-27T01:04:14.225Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32089" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186303, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "otSxUmcBTFzn_XoL-0d6", + "source": { + "@timestamp": "2018-11-27T01:04:14.256Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32089" + }, + "source": { + "ip": "107.170.65.109" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186304, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNSyUmcBTFzn_XoL2FqQ", + "source": { + "@timestamp": "2018-11-27T01:05:10.789Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186308 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32100", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdSyUmcBTFzn_XoL2FqQ", + "source": { + "@timestamp": "2018-11-27T01:05:10.790Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32100", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186309, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JtSyUmcBTFzn_XoL2FqQ", + "source": { + "@timestamp": "2018-11-27T01:05:10.821Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186310, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32100", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9tSxUmcBTFzn_XoLATF1", + "source": { + "@timestamp": "2018-11-27T01:03:10.216Z", + "auditd": { + "sequence": 142318, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "81.174.25.52" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19519", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.25.52" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99SxUmcBTFzn_XoLATF1", + "source": { + "@timestamp": "2018-11-27T01:03:10.217Z", + "process": { + "pid": "19519", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.25.52" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "81.174.25.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142319 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NSxUmcBTFzn_XoLATF1", + "source": { + "@timestamp": "2018-11-27T01:03:10.360Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "81.174.25.52" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "81.174.25.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142320, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19519", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.25.52" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69SyUmcBTFzn_XoLSE3q", + "source": { + "@timestamp": "2018-11-27T01:04:34.043Z", + "source": { + "ip": "110.170.166.101" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "110.170.166.101", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43149, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12572", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7NSyUmcBTFzn_XoLSE3q", + "source": { + "@timestamp": "2018-11-27T01:04:34.043Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12572", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "110.170.166.101" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43150, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "110.170.166.101" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7dSyUmcBTFzn_XoLSE3q", + "source": { + "@timestamp": "2018-11-27T01:04:34.263Z", + "auditd": { + "summary": { + "object": { + "secondary": "110.170.166.101", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43151, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "110.170.166.101", + "op": "PAM:bad_ident" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12572" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "110.170.166.101" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R9SzUmcBTFzn_XoLbGcD", + "source": { + "@timestamp": "2018-11-27T01:05:48.570Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192461, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.155.249.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "316", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "178.155.249.205" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNSzUmcBTFzn_XoLbGcD", + "source": { + "@timestamp": "2018-11-27T01:05:48.571Z", + "process": { + "pid": "316", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.155.249.205" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192462, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "178.155.249.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdSzUmcBTFzn_XoLbGcD", + "source": { + "@timestamp": "2018-11-27T01:05:48.697Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "316", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.155.249.205" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "178.155.249.205" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "178.155.249.205", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192463 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wtSxUmcBTFzn_XoLPTZz", + "source": { + "@timestamp": "2018-11-27T01:03:25.577Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32085", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186296, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "w9SxUmcBTFzn_XoLPTZz", + "source": { + "@timestamp": "2018-11-27T01:03:25.578Z", + "process": { + "pid": "32085", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186297, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xNSxUmcBTFzn_XoLPTZz", + "source": { + "@timestamp": "2018-11-27T01:03:25.609Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186298, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32085", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jdSxUmcBTFzn_XoLZToB", + "source": { + "@timestamp": "2018-11-27T01:03:35.702Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32087", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.37.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.131.37.34", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186299, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jtSxUmcBTFzn_XoLZToB", + "source": { + "@timestamp": "2018-11-27T01:03:35.707Z", + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.131.37.34" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186300 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32087", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.37.34" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "j9SxUmcBTFzn_XoLZToB", + "source": { + "@timestamp": "2018-11-27T01:03:35.739Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "104.131.37.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "104.131.37.34", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.131.37.34", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186301, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32087", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ydSzUmcBTFzn_XoLemeL", + "source": { + "@timestamp": "2018-11-27T01:05:52.289Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192464, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "195.68.29.234" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "323", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "195.68.29.234" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytSzUmcBTFzn_XoLemeL", + "source": { + "@timestamp": "2018-11-27T01:05:52.290Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "195.68.29.234" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192465, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "323", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "195.68.29.234" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9SzUmcBTFzn_XoLemeL", + "source": { + "@timestamp": "2018-11-27T01:05:52.396Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "195.68.29.234" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "195.68.29.234" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192466, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "323" + }, + "source": { + "ip": "195.68.29.234" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNS4UmcBTFzn_XoLe9YN", + "source": { + "@timestamp": "2018-11-27T01:11:20.098Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32151", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186337, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdS4UmcBTFzn_XoLe9YN", + "source": { + "@timestamp": "2018-11-27T01:11:20.099Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32151", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186338 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stS4UmcBTFzn_XoLe9YN", + "source": { + "@timestamp": "2018-11-27T01:11:20.130Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32151" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 186339, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MNS5UmcBTFzn_XoLKuU8", + "source": { + "@timestamp": "2018-11-27T01:12:04.946Z", + "auditd": { + "sequence": 192488, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "192.208.184.216", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "428", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "192.208.184.216" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MdS5UmcBTFzn_XoLKuU8", + "source": { + "@timestamp": "2018-11-27T01:12:04.947Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192489, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "192.208.184.216", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "428", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.208.184.216" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MtS5UmcBTFzn_XoLKuU8", + "source": { + "@timestamp": "2018-11-27T01:12:04.962Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "428", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.208.184.216" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192490, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "192.208.184.216" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "192.208.184.216", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GtW7UmcBTFzn_XoLNhOL", + "source": { + "@timestamp": "2018-11-27T01:14:19.169Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32173" + }, + "source": { + "ip": "73.15.91.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "73.15.91.251", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186350 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9W7UmcBTFzn_XoLNhOL", + "source": { + "@timestamp": "2018-11-27T01:14:19.170Z", + "source": { + "ip": "73.15.91.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186351, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "73.15.91.251" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32173", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNW7UmcBTFzn_XoLNhOL", + "source": { + "@timestamp": "2018-11-27T01:14:19.234Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32173", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "73.15.91.251" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186352, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "73.15.91.251", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "73.15.91.251", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R9W6UmcBTFzn_XoL9Aya", + "source": { + "@timestamp": "2018-11-27T01:14:02.288Z", + "process": { + "pid": "32171", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.144.84.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "201.144.84.82", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186347 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNW6UmcBTFzn_XoL9Aya", + "source": { + "@timestamp": "2018-11-27T01:14:02.289Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "201.144.84.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186348, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32171", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.144.84.82" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdW6UmcBTFzn_XoL9Aya", + "source": { + "@timestamp": "2018-11-27T01:14:02.352Z", + "source": { + "ip": "201.144.84.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "201.144.84.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186349, + "result": "fail", + "session": "unset", + "data": { + "hostname": "201.144.84.82", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32171", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19W7UmcBTFzn_XoLRBML", + "source": { + "@timestamp": "2018-11-27T01:14:22.625Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32175", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 186353 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NW7UmcBTFzn_XoLRBML", + "source": { + "@timestamp": "2018-11-27T01:14:22.627Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186354, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32175", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dW7UmcBTFzn_XoLRBML", + "source": { + "@timestamp": "2018-11-27T01:14:22.658Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32175" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186355, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltW6UmcBTFzn_XoLawEv", + "source": { + "@timestamp": "2018-11-27T01:13:27.109Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186344, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32168" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l9W6UmcBTFzn_XoLawEv", + "source": { + "@timestamp": "2018-11-27T01:13:27.110Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32168", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186345, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mNW6UmcBTFzn_XoLawEv", + "source": { + "@timestamp": "2018-11-27T01:13:27.142Z", + "process": { + "pid": "32168", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + } + }, + "sequence": 186346, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdS5UmcBTFzn_XoLl-71", + "source": { + "@timestamp": "2018-11-27T01:12:33.036Z", + "auditd": { + "sequence": 186341, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32161" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gtS5UmcBTFzn_XoLl-71", + "source": { + "@timestamp": "2018-11-27T01:12:33.037Z", + "auditd": { + "sequence": 186342, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32161", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "g9S5UmcBTFzn_XoLl-71", + "source": { + "@timestamp": "2018-11-27T01:12:33.179Z", + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32161", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "46.148.18.163", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "46.148.18.163", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 186343, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LdW7UmcBTFzn_XoLDA9a", + "source": { + "@timestamp": "2018-11-27T01:14:08.367Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "438" + }, + "source": { + "ip": "193.70.38.229" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "193.70.38.229" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192491 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LtW7UmcBTFzn_XoLDA9a", + "source": { + "@timestamp": "2018-11-27T01:14:08.368Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "438" + }, + "source": { + "ip": "193.70.38.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192492, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "193.70.38.229", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "L9W7UmcBTFzn_XoLDA9a", + "source": { + "@timestamp": "2018-11-27T01:14:08.480Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "193.70.38.229", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "193.70.38.229" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192493 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "438", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.38.229" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9S5UmcBTFzn_XoLcevO", + "source": { + "@timestamp": "2018-11-27T01:12:23.261Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186340 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32158", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdW9UmcBTFzn_XoLHz_j", + "source": { + "@timestamp": "2018-11-27T01:16:24.437Z", + "auditd": { + "sequence": 44170, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "37.187.113.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "29260", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.113.229" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StW9UmcBTFzn_XoLHz_j", + "source": { + "@timestamp": "2018-11-27T01:16:24.437Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "29260", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.113.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44171, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.187.113.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9W9UmcBTFzn_XoLHz_j", + "source": { + "@timestamp": "2018-11-27T01:16:24.541Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29260", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.113.229" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44172, + "result": "fail", + "session": "unset", + "data": { + "hostname": "37.187.113.229", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "37.187.113.229" + } + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9W9UmcBTFzn_XoLJj-I", + "source": { + "@timestamp": "2018-11-27T01:16:26.142Z", + "process": { + "pid": "25331", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.249.205.78" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "103.249.205.78" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184334, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNW9UmcBTFzn_XoLJj-I", + "source": { + "@timestamp": "2018-11-27T01:16:26.143Z", + "process": { + "pid": "25331", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.249.205.78" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184335, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "103.249.205.78", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdW9UmcBTFzn_XoLJj-I", + "source": { + "@timestamp": "2018-11-27T01:16:26.372Z", + "source": { + "ip": "103.249.205.78" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "103.249.205.78", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "103.249.205.78", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184336, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25331" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "b9W8UmcBTFzn_XoLiTGg", + "source": { + "@timestamp": "2018-11-27T01:15:45.974Z", + "auditd": { + "sequence": 186365, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNW8UmcBTFzn_XoLiTGg", + "source": { + "@timestamp": "2018-11-27T01:15:45.975Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186366, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.18.163", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32190", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "46.148.18.163" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cdW8UmcBTFzn_XoLiTGg", + "source": { + "@timestamp": "2018-11-27T01:15:46.119Z", + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.18.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "46.148.18.163" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "46.148.18.163" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186367, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtW8UmcBTFzn_XoLkzMm", + "source": { + "@timestamp": "2018-11-27T01:15:48.412Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32192" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186368, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9W8UmcBTFzn_XoLkzMm", + "source": { + "@timestamp": "2018-11-27T01:15:48.413Z", + "process": { + "pid": "32192", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186369, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNW8UmcBTFzn_XoLkzMm", + "source": { + "@timestamp": "2018-11-27T01:15:48.444Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186370, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32192", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "g9W7UmcBTFzn_XoL5iPr", + "source": { + "@timestamp": "2018-11-27T01:15:04.321Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32185" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186359, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hNW7UmcBTFzn_XoL5iPr", + "source": { + "@timestamp": "2018-11-27T01:15:04.322Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186360, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32185", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hdW7UmcBTFzn_XoL5iPr", + "source": { + "@timestamp": "2018-11-27T01:15:04.353Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32185", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186361, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddW7UmcBTFzn_XoLfxpa", + "source": { + "@timestamp": "2018-11-27T01:14:37.808Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "128.199.91.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186356, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32178", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.91.82" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dtW7UmcBTFzn_XoLfxpa", + "source": { + "@timestamp": "2018-11-27T01:14:37.809Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32178" + }, + "source": { + "ip": "128.199.91.82" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "128.199.91.82" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186357, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "d9W7UmcBTFzn_XoLfxpa", + "source": { + "@timestamp": "2018-11-27T01:14:38.002Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "128.199.91.82", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "128.199.91.82", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186358, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32178" + }, + "source": { + "ip": "128.199.91.82" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9W8UmcBTFzn_XoLdzAT", + "source": { + "@timestamp": "2018-11-27T01:15:41.225Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186362, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "89.36.221.229", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32188", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.36.221.229" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNW8UmcBTFzn_XoLdzAT", + "source": { + "@timestamp": "2018-11-27T01:15:41.226Z", + "source": { + "ip": "89.36.221.229" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186363, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "89.36.221.229" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32188", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdW8UmcBTFzn_XoLdzAT", + "source": { + "@timestamp": "2018-11-27T01:15:41.329Z", + "source": { + "ip": "89.36.221.229" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "89.36.221.229", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "89.36.221.229", + "type": "user-session" + } + }, + "sequence": 186364, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32188", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5dW7UmcBTFzn_XoLcBda", + "source": { + "@timestamp": "2018-11-27T01:14:33.960Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "131.100.219.3", + "type": "user-session" + } + }, + "sequence": 44161, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29218", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "131.100.219.3" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5tW7UmcBTFzn_XoLcBda", + "source": { + "@timestamp": "2018-11-27T01:14:33.964Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29218", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "131.100.219.3" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "131.100.219.3" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44162, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "59W7UmcBTFzn_XoLcBda", + "source": { + "@timestamp": "2018-11-27T01:14:34.176Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "29218", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "131.100.219.3" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "131.100.219.3" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "131.100.219.3", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44163, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9W8UmcBTFzn_XoL6Do7", + "source": { + "@timestamp": "2018-11-27T01:16:10.192Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32194", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.66.86.4" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "81.66.86.4" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186371, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ENW8UmcBTFzn_XoL6Do7", + "source": { + "@timestamp": "2018-11-27T01:16:10.194Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "81.66.86.4" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186372, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32194" + }, + "source": { + "ip": "81.66.86.4" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdW8UmcBTFzn_XoL6Do7", + "source": { + "@timestamp": "2018-11-27T01:16:10.308Z", + "source": { + "ip": "81.66.86.4" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "81.66.86.4", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186373, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "81.66.86.4" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32194", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cNW8UmcBTFzn_XoLvDaC", + "source": { + "@timestamp": "2018-11-27T01:15:58.995Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "204.145.5.2", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44164, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29245", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "204.145.5.2" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cdW8UmcBTFzn_XoLvDaC", + "source": { + "@timestamp": "2018-11-27T01:15:58.999Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "204.145.5.2", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44165, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "29245", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "204.145.5.2" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctW8UmcBTFzn_XoLvDaC", + "source": { + "@timestamp": "2018-11-27T01:15:59.199Z", + "process": { + "pid": "29245", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "204.145.5.2" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "204.145.5.2", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "204.145.5.2", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44166, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "f9W8UmcBTFzn_XoL_Dt-", + "source": { + "@timestamp": "2018-11-27T01:16:15.376Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.15.40.125", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44167 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29255" + }, + "source": { + "ip": "51.15.40.125" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gNW8UmcBTFzn_XoL_Dt-", + "source": { + "@timestamp": "2018-11-27T01:16:15.376Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.15.40.125", + "type": "user-session" + } + }, + "sequence": 44168 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29255" + }, + "source": { + "ip": "51.15.40.125" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdW8UmcBTFzn_XoL_Dt-", + "source": { + "@timestamp": "2018-11-27T01:16:15.488Z", + "auditd": { + "sequence": 44169, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.15.40.125" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.15.40.125", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29255" + }, + "source": { + "ip": "51.15.40.125" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INXAUmcBTFzn_XoLvI6Q", + "source": { + "@timestamp": "2018-11-27T01:20:21.158Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "138.68.50.250", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 142333, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19612", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "138.68.50.250" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "IdXAUmcBTFzn_XoLvI6Q", + "source": { + "@timestamp": "2018-11-27T01:20:21.159Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19612", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "138.68.50.250" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "138.68.50.250", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142334, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItXAUmcBTFzn_XoLvI6Q", + "source": { + "@timestamp": "2018-11-27T01:20:21.200Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19612" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "138.68.50.250" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142335, + "result": "fail", + "session": "unset", + "data": { + "hostname": "138.68.50.250", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "138.68.50.250", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BdXAUmcBTFzn_XoLyZBk", + "source": { + "@timestamp": "2018-11-27T01:20:24.441Z", + "event": { + "category": "system-services", + "type": "service_start", + "action": "started-service", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "name": "systemd", + "exe": "/lib/systemd/systemd", + "pid": "1" + }, + "auditd": { + "session": "unset", + "data": { + "unit": "apt-daily" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "apt-daily", + "type": "service" + }, + "how": "/lib/systemd/systemd" + }, + "sequence": 184343, + "result": "success" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtXAUmcBTFzn_XoLyZBk", + "source": { + "@timestamp": "2018-11-27T01:20:24.441Z", + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184344, + "result": "success", + "session": "unset", + "data": { + "unit": "apt-daily" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "apt-daily", + "type": "service" + }, + "how": "/lib/systemd/systemd" + } + }, + "event": { + "type": "service_stop", + "action": "stopped-service", + "module": "auditd", + "category": "system-services" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1", + "name": "systemd", + "exe": "/lib/systemd/systemd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yNW_UmcBTFzn_XoL_n0W", + "source": { + "@timestamp": "2018-11-27T01:19:32.396Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186392, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32225", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ydW_UmcBTFzn_XoL_n0W", + "source": { + "@timestamp": "2018-11-27T01:19:32.398Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186393, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32225", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytW_UmcBTFzn_XoL_n0W", + "source": { + "@timestamp": "2018-11-27T01:19:32.428Z", + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32225" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186394 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PNXAUmcBTFzn_XoLAX59", + "source": { + "@timestamp": "2018-11-27T01:19:33.267Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "83.222.240.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 192500 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "473", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "83.222.240.60" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PdXAUmcBTFzn_XoLAX59", + "source": { + "@timestamp": "2018-11-27T01:19:33.268Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "473", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "83.222.240.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "83.222.240.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192501, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PtXAUmcBTFzn_XoLAX59", + "source": { + "@timestamp": "2018-11-27T01:19:33.371Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "473" + }, + "source": { + "ip": "83.222.240.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "83.222.240.60", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "83.222.240.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192502, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "L9XBUmcBTFzn_XoLuKRN", + "source": { + "@timestamp": "2018-11-27T01:21:25.603Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186398, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "153.254.115.57", + "type": "user-session" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32236", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "153.254.115.57" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MNXBUmcBTFzn_XoLuKRN", + "source": { + "@timestamp": "2018-11-27T01:21:25.604Z", + "auditd": { + "sequence": 186399, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "153.254.115.57", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32236", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "153.254.115.57" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MdXBUmcBTFzn_XoLuKRN", + "source": { + "@timestamp": "2018-11-27T01:21:25.817Z", + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32236" + }, + "source": { + "ip": "153.254.115.57" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "153.254.115.57", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "153.254.115.57", + "type": "user-session" + } + }, + "sequence": 186400, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtXCUmcBTFzn_XoLq7my", + "source": { + "@timestamp": "2018-11-27T01:22:27.912Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "118.163.107.56", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186404, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32246", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "118.163.107.56" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "x9XCUmcBTFzn_XoLq7my", + "source": { + "@timestamp": "2018-11-27T01:22:27.914Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "process": { + "pid": "32246", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "118.163.107.56" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "118.163.107.56", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186405, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "yNXCUmcBTFzn_XoLq7my", + "source": { + "@timestamp": "2018-11-27T01:22:28.078Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32246" + }, + "source": { + "ip": "118.163.107.56" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "118.163.107.56", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "118.163.107.56", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186406 + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8dXBUmcBTFzn_XoL0KVY", + "source": { + "@timestamp": "2018-11-27T01:21:31.757Z", + "process": { + "pid": "32238", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186401, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8tXBUmcBTFzn_XoL0KVY", + "source": { + "@timestamp": "2018-11-27T01:21:31.758Z", + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186402, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32238" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "89XBUmcBTFzn_XoL0KVY", + "source": { + "@timestamp": "2018-11-27T01:21:31.789Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186403, + "result": "fail" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32238", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_dXAUmcBTFzn_XoL55GP", + "source": { + "@timestamp": "2018-11-27T01:20:32.165Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32229", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186395, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_tXAUmcBTFzn_XoL55GP", + "source": { + "@timestamp": "2018-11-27T01:20:32.166Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32229", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186396, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_9XAUmcBTFzn_XoL55GP", + "source": { + "@timestamp": "2018-11-27T01:20:32.197Z", + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32229", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186397, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xNXCUmcBTFzn_XoLQq83", + "source": { + "@timestamp": "2018-11-27T01:22:00.907Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12675", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "145.239.237.80" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "145.239.237.80" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43161 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xdXCUmcBTFzn_XoLQq83", + "source": { + "@timestamp": "2018-11-27T01:22:00.907Z", + "source": { + "ip": "145.239.237.80" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "145.239.237.80", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43162, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "12675", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "xtXCUmcBTFzn_XoLQq83", + "source": { + "@timestamp": "2018-11-27T01:22:01.039Z", + "source": { + "ip": "145.239.237.80" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "145.239.237.80", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "145.239.237.80", + "type": "user-session" + } + }, + "sequence": 43163, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12675", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "o9XAUmcBTFzn_XoLKIGO", + "source": { + "@timestamp": "2018-11-27T01:19:43.268Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "141.89.111.68", + "type": "user-session" + } + }, + "sequence": 192503, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "141.89.111.68" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pNXAUmcBTFzn_XoLKIGO", + "source": { + "@timestamp": "2018-11-27T01:19:43.269Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "141.89.111.68" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "141.89.111.68", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192504 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pdXAUmcBTFzn_XoLKIGO", + "source": { + "@timestamp": "2018-11-27T01:19:43.395Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "141.89.111.68" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "141.89.111.68", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192505 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "141.89.111.68" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "O9XAUmcBTFzn_XoLzZAP", + "source": { + "@timestamp": "2018-11-27T01:20:25.380Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "195.84.49.20", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44179, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "29341", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "195.84.49.20" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PNXAUmcBTFzn_XoLzZAP", + "source": { + "@timestamp": "2018-11-27T01:20:25.380Z", + "source": { + "ip": "195.84.49.20" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "195.84.49.20", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44180, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "29341", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PdXAUmcBTFzn_XoLzZAP", + "source": { + "@timestamp": "2018-11-27T01:20:25.516Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "195.84.49.20" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44181, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "195.84.49.20" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "195.84.49.20", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29341" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNXCUmcBTFzn_XoLvLq2", + "source": { + "@timestamp": "2018-11-27T01:22:32.268Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32248" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186407, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdXCUmcBTFzn_XoLvLq2", + "source": { + "@timestamp": "2018-11-27T01:22:32.269Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186408, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32248", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StXCUmcBTFzn_XoLvLq2", + "source": { + "@timestamp": "2018-11-27T01:22:32.300Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186409, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32248", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9XCUmcBTFzn_XoL-sCa", + "source": { + "@timestamp": "2018-11-27T01:22:48.071Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "490", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "68.183.62.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "68.183.62.109", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 192506, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNXCUmcBTFzn_XoL-sCa", + "source": { + "@timestamp": "2018-11-27T01:22:48.073Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "68.183.62.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 192507, + "result": "fail" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "490", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "68.183.62.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddXCUmcBTFzn_XoL-sCa", + "source": { + "@timestamp": "2018-11-27T01:22:48.104Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "490" + }, + "source": { + "ip": "68.183.62.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "68.183.62.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "68.183.62.109" + } + }, + "sequence": 192508, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stXDUmcBTFzn_XoLwdCO", + "source": { + "@timestamp": "2018-11-27T01:23:39.044Z", + "process": { + "pid": "502", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "80.127.254.119" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "sequence": 192511, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "80.127.254.119" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "s9XDUmcBTFzn_XoLwdCO", + "source": { + "@timestamp": "2018-11-27T01:23:39.045Z", + "process": { + "pid": "502", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "80.127.254.119" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "sequence": 192512, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "80.127.254.119", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tNXDUmcBTFzn_XoLwdCO", + "source": { + "@timestamp": "2018-11-27T01:23:39.260Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "502", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "80.127.254.119" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "80.127.254.119" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "80.127.254.119", + "type": "user-session" + } + }, + "sequence": 192513, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TtXDUmcBTFzn_XoLkcxS", + "source": { + "@timestamp": "2018-11-27T01:23:26.696Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32251", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "93.104.213.19" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186410, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "93.104.213.19", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "T9XDUmcBTFzn_XoLkcxS", + "source": { + "@timestamp": "2018-11-27T01:23:26.697Z", + "source": { + "ip": "93.104.213.19" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "93.104.213.19", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186411, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32251", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UNXDUmcBTFzn_XoLkcxS", + "source": { + "@timestamp": "2018-11-27T01:23:26.812Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32251", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "93.104.213.19" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186412, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "93.104.213.19", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "93.104.213.19", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctXCUmcBTFzn_XoL3b2F", + "source": { + "@timestamp": "2018-11-27T01:22:40.662Z", + "source": { + "ip": "185.238.72.255" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "sequence": 43164, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "185.238.72.255", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12678", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9XCUmcBTFzn_XoL3b2F", + "source": { + "@timestamp": "2018-11-27T01:22:40.662Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12678", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.238.72.255" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "185.238.72.255", + "type": "user-session" + } + }, + "sequence": 43165, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNXCUmcBTFzn_XoL3b2F", + "source": { + "@timestamp": "2018-11-27T01:22:40.794Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12678" + }, + "source": { + "ip": "185.238.72.255" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "185.238.72.255", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "185.238.72.255", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43166, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNXDUmcBTFzn_XoLtc-O", + "source": { + "@timestamp": "2018-11-27T01:23:35.972Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32253", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186413, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdXDUmcBTFzn_XoLtc-O", + "source": { + "@timestamp": "2018-11-27T01:23:35.973Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32253", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186414, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StXDUmcBTFzn_XoLtc-O", + "source": { + "@timestamp": "2018-11-27T01:23:36.003Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32253", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186415, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNXDUmcBTFzn_XoLps53", + "source": { + "@timestamp": "2018-11-27T01:23:32.109Z", + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "125.227.77.88" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "125.227.77.88" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "125.227.77.88", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184346 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25735", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNXDUmcBTFzn_XoLp84D", + "source": { + "@timestamp": "2018-11-27T01:23:32.249Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "500", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.109.33" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "142.93.109.33", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "142.93.109.33", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192510, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdXDUmcBTFzn_XoLZcgh", + "source": { + "@timestamp": "2018-11-27T01:23:15.383Z", + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25733", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "125.227.77.88" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "125.227.77.88", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "125.227.77.88", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184345, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "v9XDUmcBTFzn_XoLIMO9", + "source": { + "@timestamp": "2018-11-27T01:22:57.875Z", + "process": { + "pid": "497", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "94.16.115.155" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "94.16.115.155" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "94.16.115.155", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192509, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ndXDUmcBTFzn_XoL69Tr", + "source": { + "@timestamp": "2018-11-27T01:23:49.884Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "147.229.176.122" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "147.229.176.122", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43167, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12686" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntXDUmcBTFzn_XoL69Tr", + "source": { + "@timestamp": "2018-11-27T01:23:49.884Z", + "source": { + "ip": "147.229.176.122" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "147.229.176.122", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43168 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12686" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9XDUmcBTFzn_XoL69Tr", + "source": { + "@timestamp": "2018-11-27T01:23:50.008Z", + "process": { + "pid": "12686", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "147.229.176.122" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "147.229.176.122", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43169, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "147.229.176.122", + "terminal": "ssh" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNXDUmcBTFzn_XoL99V8", + "source": { + "@timestamp": "2018-11-27T01:23:52.849Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25737" + }, + "source": { + "ip": "125.227.77.88" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "125.227.77.88" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184347, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CdXDUmcBTFzn_XoL99V8", + "source": { + "@timestamp": "2018-11-27T01:23:52.850Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25737" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "125.227.77.88" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "125.227.77.88", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184348 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtXDUmcBTFzn_XoL99V8", + "source": { + "@timestamp": "2018-11-27T01:23:53.128Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "125.227.77.88", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "secondary": "125.227.77.88", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184349 + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25737", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "125.227.77.88" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9dXFUmcBTFzn_XoLyvxi", + "source": { + "@timestamp": "2018-11-27T01:25:52.376Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32272" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186422, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9tXFUmcBTFzn_XoLyvxi", + "source": { + "@timestamp": "2018-11-27T01:25:52.377Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 186423, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32272", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99XFUmcBTFzn_XoLyvxi", + "source": { + "@timestamp": "2018-11-27T01:25:52.407Z", + "process": { + "pid": "32272", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186424, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNXFUmcBTFzn_XoLzv1N", + "source": { + "@timestamp": "2018-11-27T01:25:53.380Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "524", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.236.181.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192520, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adXFUmcBTFzn_XoLzv1N", + "source": { + "@timestamp": "2018-11-27T01:25:53.381Z", + "process": { + "pid": "524", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192521, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "104.236.181.158", + "type": "user-session", + "primary": "sshd" + } + } + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atXFUmcBTFzn_XoLzv1N", + "source": { + "@timestamp": "2018-11-27T01:25:53.425Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "104.236.181.158" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "104.236.181.158" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192522, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "524", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.236.181.158" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9XDUmcBTFzn_XoL2tJr", + "source": { + "@timestamp": "2018-11-27T01:23:45.409Z", + "process": { + "pid": "19632", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "46.101.192.45" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "46.101.192.45", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 142336, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNXDUmcBTFzn_XoL2tJr", + "source": { + "@timestamp": "2018-11-27T01:23:45.410Z", + "source": { + "ip": "46.101.192.45" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "46.101.192.45" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142337, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19632", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdXDUmcBTFzn_XoL2tJr", + "source": { + "@timestamp": "2018-11-27T01:23:45.519Z", + "auditd": { + "sequence": 142338, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "46.101.192.45", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "46.101.192.45", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19632" + }, + "source": { + "ip": "46.101.192.45" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kNbGUmcBTFzn_XoLcgv7", + "source": { + "@timestamp": "2018-11-27T01:26:35.537Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "25757", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "167.114.153.36" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184350, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "167.114.153.36", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdbGUmcBTFzn_XoLcgv7", + "source": { + "@timestamp": "2018-11-27T01:26:35.538Z", + "source": { + "ip": "167.114.153.36" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "167.114.153.36", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184351, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25757" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktbGUmcBTFzn_XoLcgv7", + "source": { + "@timestamp": "2018-11-27T01:26:35.581Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "167.114.153.36" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "167.114.153.36", + "type": "user-session" + } + }, + "sequence": 184352 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25757" + }, + "source": { + "ip": "167.114.153.36" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNXEUmcBTFzn_XoLu-bL", + "source": { + "@timestamp": "2018-11-27T01:24:43.105Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32262", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186416, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdXEUmcBTFzn_XoLu-bL", + "source": { + "@timestamp": "2018-11-27T01:24:43.106Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186417, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32262" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YtXEUmcBTFzn_XoLu-bL", + "source": { + "@timestamp": "2018-11-27T01:24:43.136Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32262" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186418, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dXFUmcBTFzn_XoLNvCh", + "source": { + "@timestamp": "2018-11-27T01:25:14.551Z", + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "34.197.73.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186419, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32269", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "34.197.73.243" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tXFUmcBTFzn_XoLNvCh", + "source": { + "@timestamp": "2018-11-27T01:25:14.552Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32269", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "34.197.73.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "34.197.73.243" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186420, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69XFUmcBTFzn_XoLNvCh", + "source": { + "@timestamp": "2018-11-27T01:25:14.587Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32269", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "34.197.73.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "34.197.73.243", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "34.197.73.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186421, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "WtXEUmcBTFzn_XoLA9aC", + "source": { + "@timestamp": "2018-11-27T01:23:55.928Z", + "auditd": { + "sequence": 192514, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "211.21.65.57", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "504", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.21.65.57" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "W9XEUmcBTFzn_XoLA9aC", + "source": { + "@timestamp": "2018-11-27T01:23:55.929Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "504" + }, + "source": { + "ip": "211.21.65.57" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192515, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "211.21.65.57", + "type": "user-session" + } + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "XNXEUmcBTFzn_XoLA9aC", + "source": { + "@timestamp": "2018-11-27T01:23:56.099Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "211.21.65.57" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192516, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "211.21.65.57" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "504", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "211.21.65.57" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNXEUmcBTFzn_XoLbd__", + "source": { + "@timestamp": "2018-11-27T01:24:23.144Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "515", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.254.52.72" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "54.254.52.72", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192517, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdXEUmcBTFzn_XoLbd__", + "source": { + "@timestamp": "2018-11-27T01:24:23.145Z", + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "54.254.52.72", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192518, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "515", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.254.52.72" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stXEUmcBTFzn_XoLbd__", + "source": { + "@timestamp": "2018-11-27T01:24:23.339Z", + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "54.254.52.72" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "54.254.52.72" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192519, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "515", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.254.52.72" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "PtXFUmcBTFzn_XoLg_d5", + "source": { + "@timestamp": "2018-11-27T01:25:34.159Z", + "source": { + "ip": "192.240.119.252" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "192.240.119.252", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "192.240.119.252" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44182, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "29443", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NbIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.309Z", + "file": { + "size": 0, + "group": "root", + "path": "/etc/sed8B6Ati", + "ctime": "2018-11-27T01:28:36.306Z", + "uid": 0, + "gid": 0, + "inode": "332", + "mode": "0000", + "owner": "root", + "mtime": "2018-11-27T01:28:36.306Z", + "type": "file" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "hash": { + "sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709" + }, + "event": { + "module": "file_integrity", + "action": [ + "created" + ] + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dbIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.311Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": [ + "updated" + ], + "module": "file_integrity" + }, + "file": { + "ctime": "2018-11-27T01:28:36.306Z", + "mtime": "2018-11-27T01:28:36.306Z", + "owner": "root", + "path": "/etc/sed8B6Ati", + "size": 21, + "type": "file", + "uid": 0, + "gid": 0, + "inode": "332", + "mode": "0000", + "group": "root" + }, + "hash": { + "sha1": "302493715263b503309437954b46d73fee714260" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tbIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.312Z", + "event": { + "module": "file_integrity", + "action": [ + "updated" + ] + }, + "file": { + "path": "/etc/sed8B6Ati" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "29bIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.314Z", + "event": { + "module": "file_integrity", + "action": [ + "moved" + ] + }, + "file": { + "path": "/etc/sed8B6Ati" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3NbIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.315Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "action": [ + "created" + ], + "module": "file_integrity" + }, + "file": { + "size": 420, + "type": "file", + "uid": 0, + "inode": "332", + "ctime": "2018-11-27T01:28:36.306Z", + "mode": "0644", + "path": "/etc/hosts", + "mtime": "2018-11-27T01:28:36.306Z", + "owner": "root", + "gid": 0, + "group": "root" + }, + "hash": { + "sha1": "3ecab8f840eff15248fdb68f4cc7c3d0d9971476" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3dbIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.410Z", + "event": { + "category": "system-services", + "type": "service_stop", + "action": "stopped-service", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1", + "name": "systemd", + "exe": "/lib/systemd/systemd" + }, + "auditd": { + "session": "unset", + "data": { + "unit": "rsyslog" + }, + "summary": { + "object": { + "type": "service", + "primary": "rsyslog" + }, + "how": "/lib/systemd/systemd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44186, + "result": "success" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3tbIUmcBTFzn_XoLSjPA", + "source": { + "@timestamp": "2018-11-27T01:28:36.470Z", + "process": { + "exe": "/lib/systemd/systemd", + "pid": "1", + "name": "systemd" + }, + "auditd": { + "data": { + "unit": "rsyslog" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "service", + "primary": "rsyslog" + }, + "how": "/lib/systemd/systemd" + }, + "sequence": 44187, + "result": "success", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "service_start", + "action": "started-service", + "module": "auditd", + "category": "system-services" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MNbHUmcBTFzn_XoLFxpi", + "source": { + "@timestamp": "2018-11-27T01:27:17.624Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25765", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "59.124.152.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "59.124.152.146", + "type": "user-session" + } + }, + "sequence": 184353, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MdbHUmcBTFzn_XoLFxpi", + "source": { + "@timestamp": "2018-11-27T01:27:17.625Z", + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25765", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "59.124.152.146" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184354, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "59.124.152.146" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MtbHUmcBTFzn_XoLFxpi", + "source": { + "@timestamp": "2018-11-27T01:27:17.794Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184355, + "result": "fail", + "session": "unset", + "data": { + "hostname": "59.124.152.146", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "59.124.152.146", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25765" + }, + "source": { + "ip": "59.124.152.146" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9bHUmcBTFzn_XoLFxqn", + "source": { + "@timestamp": "2018-11-27T01:27:17.693Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "167.99.171.14", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192523 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "532", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "167.99.171.14" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNbHUmcBTFzn_XoLFxqn", + "source": { + "@timestamp": "2018-11-27T01:27:17.695Z", + "source": { + "ip": "167.99.171.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "167.99.171.14", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 192524, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "532" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdbHUmcBTFzn_XoLFxqn", + "source": { + "@timestamp": "2018-11-27T01:27:17.735Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "532" + }, + "source": { + "ip": "167.99.171.14" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192525, + "result": "fail", + "session": "unset", + "data": { + "hostname": "167.99.171.14", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "167.99.171.14", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3dbHUmcBTFzn_XoLPR0X", + "source": { + "@timestamp": "2018-11-27T01:27:27.266Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19657", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.130.2" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "139.59.130.2", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142339 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3tbHUmcBTFzn_XoLPR0X", + "source": { + "@timestamp": "2018-11-27T01:27:27.267Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19657", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "139.59.130.2" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "139.59.130.2", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142340, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "39bHUmcBTFzn_XoLPR0X", + "source": { + "@timestamp": "2018-11-27T01:27:27.376Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "139.59.130.2", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "139.59.130.2", + "type": "user-session" + } + }, + "sequence": 142341 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19657", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "139.59.130.2" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mNbIUmcBTFzn_XoLFi9i", + "source": { + "@timestamp": "2018-11-27T01:28:22.881Z", + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25773", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.139.20.56" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "37.139.20.56" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 184356, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mdbIUmcBTFzn_XoLFi9i", + "source": { + "@timestamp": "2018-11-27T01:28:22.883Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.139.20.56", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184357 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25773", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "37.139.20.56" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mtbIUmcBTFzn_XoLFi9i", + "source": { + "@timestamp": "2018-11-27T01:28:22.989Z", + "source": { + "ip": "37.139.20.56" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "37.139.20.56", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "37.139.20.56" + } + }, + "sequence": 184358, + "result": "fail" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25773", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NbHUmcBTFzn_XoL7Stw", + "source": { + "@timestamp": "2018-11-27T01:28:12.420Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32287", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186428, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dbHUmcBTFzn_XoL7Stw", + "source": { + "@timestamp": "2018-11-27T01:28:12.422Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32287", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186429, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0tbHUmcBTFzn_XoL7Stw", + "source": { + "@timestamp": "2018-11-27T01:28:12.453Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186430, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32287" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItbIUmcBTFzn_XoLqjzc", + "source": { + "@timestamp": "2018-11-27T01:29:00.914Z", + "process": { + "pid": "545", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.97.173.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "209.97.173.192", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 192526 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9bIUmcBTFzn_XoLqjzc", + "source": { + "@timestamp": "2018-11-27T01:29:00.915Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "545" + }, + "source": { + "ip": "209.97.173.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "209.97.173.192" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 192527, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNbIUmcBTFzn_XoLqjzc", + "source": { + "@timestamp": "2018-11-27T01:29:01.108Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "545", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.97.173.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192528, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "209.97.173.192" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "209.97.173.192", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONbGUmcBTFzn_XoL2xQn", + "source": { + "@timestamp": "2018-11-27T01:27:02.205Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32279", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186425, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdbGUmcBTFzn_XoL2xQn", + "source": { + "@timestamp": "2018-11-27T01:27:02.206Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186426, + "result": "fail" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32279", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OtbGUmcBTFzn_XoL2xQn", + "source": { + "@timestamp": "2018-11-27T01:27:02.238Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32279", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186427 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltbHUmcBTFzn_XoLWR9W", + "source": { + "@timestamp": "2018-11-27T01:27:34.501Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29478" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "46.105.89.195" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "46.105.89.195" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44183, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l9bHUmcBTFzn_XoLWR9W", + "source": { + "@timestamp": "2018-11-27T01:27:34.501Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "46.105.89.195", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44184 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "29478", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.105.89.195" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mNbHUmcBTFzn_XoLWR9W", + "source": { + "@timestamp": "2018-11-27T01:27:34.613Z", + "auditd": { + "session": "unset", + "data": { + "hostname": "46.105.89.195", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "46.105.89.195", + "type": "user-session" + } + }, + "sequence": 44185, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "29478" + }, + "source": { + "ip": "46.105.89.195" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtbIUmcBTFzn_XoLVjVA", + "source": { + "@timestamp": "2018-11-27T01:28:39.253Z", + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "sequence": 43170, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.255.34.233", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12716" + }, + "source": { + "ip": "51.255.34.233" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Q9bIUmcBTFzn_XoLVjVA", + "source": { + "@timestamp": "2018-11-27T01:28:39.253Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12716" + }, + "source": { + "ip": "51.255.34.233" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.255.34.233", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43171 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "RNbIUmcBTFzn_XoLVjVA", + "source": { + "@timestamp": "2018-11-27T01:28:39.361Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12716", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.255.34.233" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.255.34.233", + "type": "user-session" + } + }, + "sequence": 43172, + "result": "fail", + "session": "unset", + "data": { + "hostname": "51.255.34.233", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8tfRUmcBTFzn_XoL1ASG", + "source": { + "@timestamp": "2018-11-27T01:39:01.401Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12782" + }, + "source": { + "ip": "138.68.150.115" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "138.68.150.115", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "138.68.150.115", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43186, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9fRUmcBTFzn_XoL1gUs", + "source": { + "@timestamp": "2018-11-27T01:39:01.825Z", + "process": { + "pid": "25839", + "exe": "/usr/sbin/cron" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184368, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNfRUmcBTFzn_XoL1gUs", + "source": { + "@timestamp": "2018-11-27T01:39:01.826Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184369, + "result": "success" + }, + "event": { + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "25839" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdfRUmcBTFzn_XoL1gUs", + "source": { + "@timestamp": "2018-11-27T01:39:01.828Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_start", + "action": "started-session" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25839", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184371, + "result": "success", + "session": "9859", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TtfRUmcBTFzn_XoL1gUs", + "source": { + "@timestamp": "2018-11-27T01:39:01.923Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "25839" + }, + "auditd": { + "sequence": 184372, + "result": "success", + "session": "9859", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "T9fRUmcBTFzn_XoL1gUs", + "source": { + "@timestamp": "2018-11-27T01:39:01.924Z", + "process": { + "pid": "25839", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184373, + "result": "success", + "session": "9859", + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UdfRUmcBTFzn_XoL1gXc", + "source": { + "@timestamp": "2018-11-27T01:39:02.001Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "608" + }, + "auditd": { + "sequence": 192547, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:accounting", + "terminal": "cron" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UtfRUmcBTFzn_XoL1gXc", + "source": { + "@timestamp": "2018-11-27T01:39:02.001Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "608" + }, + "auditd": { + "sequence": 192548, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "U9fRUmcBTFzn_XoL1gXc", + "source": { + "@timestamp": "2018-11-27T01:39:02.003Z", + "auditd": { + "result": "success", + "session": "9863", + "data": { + "terminal": "cron", + "op": "PAM:session_open", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 192550 + }, + "event": { + "action": "started-session", + "module": "auditd", + "category": "user-login", + "type": "user_start" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "608" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNfRUmcBTFzn_XoL1gXc", + "source": { + "@timestamp": "2018-11-27T01:39:02.100Z", + "process": { + "pid": "608", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "9863", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192551 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VdfRUmcBTFzn_XoL1gXc", + "source": { + "@timestamp": "2018-11-27T01:39:02.101Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "608", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192552, + "result": "success", + "session": "9863", + "data": { + "op": "PAM:session_close", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdbRUmcBTFzn_XoLPPiy", + "source": { + "@timestamp": "2018-11-27T01:38:22.535Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19718" + }, + "source": { + "ip": "207.154.201.218" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142346, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "207.154.201.218" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtbRUmcBTFzn_XoLPPiy", + "source": { + "@timestamp": "2018-11-27T01:38:22.537Z", + "process": { + "pid": "19718", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "207.154.201.218" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142347, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "207.154.201.218", + "type": "user-session" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9bRUmcBTFzn_XoLPPiy", + "source": { + "@timestamp": "2018-11-27T01:38:22.645Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19718" + }, + "source": { + "ip": "207.154.201.218" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142348, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "207.154.201.218" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "207.154.201.218", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GdfTUmcBTFzn_XoLdSoA", + "source": { + "@timestamp": "2018-11-27T01:40:48.022Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19732", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.226.187.115" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "188.226.187.115", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142349, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GtfTUmcBTFzn_XoLdSoA", + "source": { + "@timestamp": "2018-11-27T01:40:48.024Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142350, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "188.226.187.115", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19732", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "188.226.187.115" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9fTUmcBTFzn_XoLdSoA", + "source": { + "@timestamp": "2018-11-27T01:40:48.126Z", + "source": { + "ip": "188.226.187.115" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "188.226.187.115" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "188.226.187.115", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142351, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19732", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jdfTUmcBTFzn_XoLsi5i", + "source": { + "@timestamp": "2018-11-27T01:41:03.736Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32370" + }, + "source": { + "ip": "82.200.205.71" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "82.200.205.71", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 186473, + "result": "fail" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jtfTUmcBTFzn_XoLsi5i", + "source": { + "@timestamp": "2018-11-27T01:41:03.737Z", + "source": { + "ip": "82.200.205.71" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "82.200.205.71" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186474, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32370", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "j9fTUmcBTFzn_XoLsi5i", + "source": { + "@timestamp": "2018-11-27T01:41:03.993Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "82.200.205.71" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "82.200.205.71" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186475, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32370", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.200.205.71" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9bRUmcBTFzn_XoLcPxx", + "source": { + "@timestamp": "2018-11-27T01:38:35.782Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186464 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32356", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNbRUmcBTFzn_XoLcPxx", + "source": { + "@timestamp": "2018-11-27T01:38:35.783Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32356" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186465 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bdbRUmcBTFzn_XoLcPxx", + "source": { + "@timestamp": "2018-11-27T01:38:35.814Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32356", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186466, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dfSUmcBTFzn_XoLXhCA", + "source": { + "@timestamp": "2018-11-27T01:39:36.720Z", + "auditd": { + "sequence": 43187, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "89.221.217.8", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12790", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.221.217.8" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tfSUmcBTFzn_XoLXhCA", + "source": { + "@timestamp": "2018-11-27T01:39:36.724Z", + "source": { + "ip": "89.221.217.8" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43188, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "89.221.217.8", + "type": "user-session", + "primary": "sshd" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12790", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "29fSUmcBTFzn_XoLXhCA", + "source": { + "@timestamp": "2018-11-27T01:39:36.852Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "89.221.217.8", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "89.221.217.8", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43189, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12790", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "89.221.217.8" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adfSUmcBTFzn_XoLgRS2", + "source": { + "@timestamp": "2018-11-27T01:39:45.740Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32360", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "sequence": 186467, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atfSUmcBTFzn_XoLgRS2", + "source": { + "@timestamp": "2018-11-27T01:39:45.741Z", + "process": { + "pid": "32360", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186468, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9fSUmcBTFzn_XoLgRS2", + "source": { + "@timestamp": "2018-11-27T01:39:45.771Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186469, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32360", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdfTUmcBTFzn_XoLmy0i", + "source": { + "@timestamp": "2018-11-27T01:40:57.784Z", + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32368", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186470, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtfTUmcBTFzn_XoLmy0i", + "source": { + "@timestamp": "2018-11-27T01:40:57.785Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186471 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32368", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9fTUmcBTFzn_XoLmy0i", + "source": { + "@timestamp": "2018-11-27T01:40:57.815Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186472, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32368" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNfUUmcBTFzn_XoLBTW-", + "source": { + "@timestamp": "2018-11-27T01:41:25.073Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12798", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.37.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43190, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.131.37.34", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdfUUmcBTFzn_XoLBTW-", + "source": { + "@timestamp": "2018-11-27T01:41:25.073Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12798", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.37.34" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "sequence": 43191, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "104.131.37.34", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtfUUmcBTFzn_XoLBTW-", + "source": { + "@timestamp": "2018-11-27T01:41:25.105Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12798" + }, + "source": { + "ip": "104.131.37.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43192, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "104.131.37.34" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "104.131.37.34", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNfWUmcBTFzn_XoLkW2H", + "source": { + "@timestamp": "2018-11-27T01:44:11.932Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "128.199.106.169" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.106.169", + "type": "user-session" + } + }, + "sequence": 186485, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32391", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdfWUmcBTFzn_XoLkW2H", + "source": { + "@timestamp": "2018-11-27T01:44:11.934Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32391", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.106.169" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.106.169", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186486 + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TtfWUmcBTFzn_XoLkW2H", + "source": { + "@timestamp": "2018-11-27T01:44:12.126Z", + "process": { + "pid": "32391", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.106.169" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "128.199.106.169", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "128.199.106.169", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186487, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CtfWUmcBTFzn_XoLl27w", + "source": { + "@timestamp": "2018-11-27T01:44:13.574Z", + "source": { + "ip": "45.122.222.253" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "45.122.222.253", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 142361 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19759", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "C9fWUmcBTFzn_XoLl27w", + "source": { + "@timestamp": "2018-11-27T01:44:13.575Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19759", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.122.222.253" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142362, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "45.122.222.253" + } + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DNfWUmcBTFzn_XoLl27w", + "source": { + "@timestamp": "2018-11-27T01:44:13.839Z", + "source": { + "ip": "45.122.222.253" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "45.122.222.253", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "45.122.222.253" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 142363, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19759", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "utfYUmcBTFzn_XoLQpK3", + "source": { + "@timestamp": "2018-11-27T01:46:02.828Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19772" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "151.203.70.218" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "151.203.70.218", + "type": "user-session" + } + }, + "sequence": 142364, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "u9fYUmcBTFzn_XoLQpK3", + "source": { + "@timestamp": "2018-11-27T01:46:02.829Z", + "source": { + "ip": "151.203.70.218" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142365, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "151.203.70.218" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19772" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vNfYUmcBTFzn_XoLQpK3", + "source": { + "@timestamp": "2018-11-27T01:46:02.868Z", + "source": { + "ip": "151.203.70.218" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "151.203.70.218" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142366, + "result": "fail", + "session": "unset", + "data": { + "hostname": "151.203.70.218", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19772", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdfYUmcBTFzn_XoLRpPT", + "source": { + "@timestamp": "2018-11-27T01:46:03.873Z", + "process": { + "pid": "12823", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.115.61.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43193, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "152.115.61.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "StfYUmcBTFzn_XoLRpPT", + "source": { + "@timestamp": "2018-11-27T01:46:03.873Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "152.115.61.52", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43194, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12823", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "152.115.61.52" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9fYUmcBTFzn_XoLRpPT", + "source": { + "@timestamp": "2018-11-27T01:46:04.009Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12823", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "152.115.61.52" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "152.115.61.52", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 43195, + "result": "fail", + "session": "unset", + "data": { + "hostname": "152.115.61.52", + "op": "PAM:bad_ident", + "terminal": "ssh" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adfYUmcBTFzn_XoLXJVb", + "source": { + "@timestamp": "2018-11-27T01:46:09.392Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32410" + }, + "source": { + "ip": "106.51.66.214" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186494, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "106.51.66.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atfYUmcBTFzn_XoLXJVb", + "source": { + "@timestamp": "2018-11-27T01:46:09.394Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "106.51.66.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186495, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32410", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "106.51.66.214" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9fYUmcBTFzn_XoLXJVb", + "source": { + "@timestamp": "2018-11-27T01:46:09.624Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32410" + }, + "source": { + "ip": "106.51.66.214" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186496, + "result": "fail", + "session": "unset", + "data": { + "hostname": "106.51.66.214", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "106.51.66.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9fYUmcBTFzn_XoLZZX6", + "source": { + "@timestamp": "2018-11-27T01:46:11.847Z", + "source": { + "ip": "92.86.47.26" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "92.86.47.26" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192553, + "result": "fail" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "700", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNfYUmcBTFzn_XoLZZX6", + "source": { + "@timestamp": "2018-11-27T01:46:11.848Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "92.86.47.26", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192554 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "700", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "92.86.47.26" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zdfYUmcBTFzn_XoLZZX6", + "source": { + "@timestamp": "2018-11-27T01:46:11.996Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "700", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "92.86.47.26" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192555, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "92.86.47.26", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "92.86.47.26", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNfWUmcBTFzn_XoLc2tJ", + "source": { + "@timestamp": "2018-11-27T01:44:04.191Z", + "process": { + "pid": "19756", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "177.137.205.150" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "177.137.205.150", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142358 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JdfWUmcBTFzn_XoLc2tJ", + "source": { + "@timestamp": "2018-11-27T01:44:04.192Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "177.137.205.150", + "type": "user-session" + } + }, + "sequence": 142359, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19756" + }, + "source": { + "ip": "177.137.205.150" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JtfWUmcBTFzn_XoLc2tJ", + "source": { + "@timestamp": "2018-11-27T01:44:04.375Z", + "process": { + "pid": "19756", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "177.137.205.150" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "177.137.205.150", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "177.137.205.150" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142360, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "atfYUmcBTFzn_XoLgpgd", + "source": { + "@timestamp": "2018-11-27T01:46:19.059Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19774", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "140.143.190.243" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142367, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "140.143.190.243", + "type": "user-session", + "primary": "sshd" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "a9fYUmcBTFzn_XoLgpgd", + "source": { + "@timestamp": "2018-11-27T01:46:19.060Z", + "process": { + "pid": "19774", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "140.143.190.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142368, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "140.143.190.243", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "bNfYUmcBTFzn_XoLgpgd", + "source": { + "@timestamp": "2018-11-27T01:46:19.278Z", + "auditd": { + "sequence": 142369, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "140.143.190.243" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "140.143.190.243", + "type": "user-session" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19774", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "140.143.190.243" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtfXUmcBTFzn_XoLaoE9", + "source": { + "@timestamp": "2018-11-27T01:45:07.411Z", + "auditd": { + "sequence": 184386, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "217.19.148.142", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "25932", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.19.148.142" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A9fXUmcBTFzn_XoLaoE9", + "source": { + "@timestamp": "2018-11-27T01:45:07.412Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "25932", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.19.148.142" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "217.19.148.142", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184387 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BNfXUmcBTFzn_XoLaoE9", + "source": { + "@timestamp": "2018-11-27T01:45:07.545Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "25932", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.19.148.142" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "217.19.148.142" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "217.19.148.142", + "type": "user-session" + } + }, + "sequence": 184388, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "49fWUmcBTFzn_XoL_XYj", + "source": { + "@timestamp": "2018-11-27T01:44:39.480Z", + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186488 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32399", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5NfWUmcBTFzn_XoL_XYj", + "source": { + "@timestamp": "2018-11-27T01:44:39.481Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32399", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186489, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5dfWUmcBTFzn_XoL_XYj", + "source": { + "@timestamp": "2018-11-27T01:44:39.512Z", + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 186490, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32399", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GtfVUmcBTFzn_XoL2l5j", + "source": { + "@timestamp": "2018-11-27T01:43:25.049Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32389", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186482 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9fVUmcBTFzn_XoL2l5j", + "source": { + "@timestamp": "2018-11-27T01:43:25.050Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32389" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186483, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNfVUmcBTFzn_XoL2l5j", + "source": { + "@timestamp": "2018-11-27T01:43:25.081Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32389", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186484, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANfYUmcBTFzn_XoLIJDK", + "source": { + "@timestamp": "2018-11-27T01:45:54.144Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32408" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186491, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdfYUmcBTFzn_XoLIJDK", + "source": { + "@timestamp": "2018-11-27T01:45:54.146Z", + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32408", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + } + }, + "sequence": 186492, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtfYUmcBTFzn_XoLIJDK", + "source": { + "@timestamp": "2018-11-27T01:45:54.176Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186493, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32408" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kNjeUmcBTFzn_XoLchqO", + "source": { + "@timestamp": "2018-11-27T01:52:48.274Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "92.222.218.139", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184392, + "result": "fail" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "25980", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "92.222.218.139" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdjeUmcBTFzn_XoLchqO", + "source": { + "@timestamp": "2018-11-27T01:52:48.275Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "25980" + }, + "source": { + "ip": "92.222.218.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "92.222.218.139" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184393, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktjeUmcBTFzn_XoLchqO", + "source": { + "@timestamp": "2018-11-27T01:52:48.381Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25980", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "92.222.218.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "92.222.218.139" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "92.222.218.139" + } + }, + "sequence": 184394, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ANjeUmcBTFzn_XoLgBst", + "source": { + "@timestamp": "2018-11-27T01:52:51.775Z", + "source": { + "ip": "174.138.17.18" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "174.138.17.18", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43202, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12866" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdjeUmcBTFzn_XoLgBst", + "source": { + "@timestamp": "2018-11-27T01:52:51.775Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12866" + }, + "source": { + "ip": "174.138.17.18" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "174.138.17.18", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43203, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtjeUmcBTFzn_XoLgBst", + "source": { + "@timestamp": "2018-11-27T01:52:51.851Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12868" + }, + "source": { + "ip": "54.38.47.28" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43204, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "54.38.47.28", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A9jeUmcBTFzn_XoLgBst", + "source": { + "@timestamp": "2018-11-27T01:52:51.851Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12868", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.38.47.28" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43205, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "54.38.47.28", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BNjeUmcBTFzn_XoLgBst", + "source": { + "@timestamp": "2018-11-27T01:52:51.963Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12868", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.38.47.28" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "54.38.47.28" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "54.38.47.28", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43206, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BdjeUmcBTFzn_XoLgBst", + "source": { + "@timestamp": "2018-11-27T01:52:51.967Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12866", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "174.138.17.18" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "174.138.17.18", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "174.138.17.18", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43207 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "vtjdUmcBTFzn_XoLhQbg", + "source": { + "@timestamp": "2018-11-27T01:51:47.702Z", + "process": { + "pid": "25972", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.151.178.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184389, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "201.151.178.139", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "v9jdUmcBTFzn_XoLhQbg", + "source": { + "@timestamp": "2018-11-27T01:51:47.704Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "25972", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.151.178.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "201.151.178.139", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 184390 + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wNjdUmcBTFzn_XoLhQbg", + "source": { + "@timestamp": "2018-11-27T01:51:47.788Z", + "process": { + "pid": "25972", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "201.151.178.139" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "201.151.178.139", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184391, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "201.151.178.139", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9jdUmcBTFzn_XoLlgd5", + "source": { + "@timestamp": "2018-11-27T01:51:51.949Z", + "process": { + "pid": "19818", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "121.124.124.73" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 142389, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONjdUmcBTFzn_XoLlgd5", + "source": { + "@timestamp": "2018-11-27T01:51:51.951Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19818", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "121.124.124.73", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 142390, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdjdUmcBTFzn_XoLlgd5", + "source": { + "@timestamp": "2018-11-27T01:51:52.141Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19818", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "121.124.124.73" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "121.124.124.73" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142391 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdjfUmcBTFzn_XoLJSnD", + "source": { + "@timestamp": "2018-11-27T01:53:34.169Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19831", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "79.137.64.132" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "79.137.64.132", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142392, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EtjfUmcBTFzn_XoLJSnD", + "source": { + "@timestamp": "2018-11-27T01:53:34.170Z", + "source": { + "ip": "79.137.64.132" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "79.137.64.132" + } + }, + "sequence": 142393, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19831", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E9jfUmcBTFzn_XoLJSnD", + "source": { + "@timestamp": "2018-11-27T01:53:34.276Z", + "source": { + "ip": "79.137.64.132" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "79.137.64.132", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "79.137.64.132", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142394, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "19831", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtjfUmcBTFzn_XoLJila", + "source": { + "@timestamp": "2018-11-27T01:53:34.315Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "161.132.195.76", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43211 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12877", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "161.132.195.76" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9jfUmcBTFzn_XoLJila", + "source": { + "@timestamp": "2018-11-27T01:53:34.315Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12877", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "161.132.195.76" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "161.132.195.76", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43212, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNjfUmcBTFzn_XoLJila", + "source": { + "@timestamp": "2018-11-27T01:53:34.427Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12877", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "161.132.195.76" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "161.132.195.76", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "161.132.195.76", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43213, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Y9jdUmcBTFzn_XoLdARP", + "source": { + "@timestamp": "2018-11-27T01:51:43.201Z", + "auditd": { + "sequence": 43196, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "83.222.240.60" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12856", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "83.222.240.60" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZNjdUmcBTFzn_XoLdARP", + "source": { + "@timestamp": "2018-11-27T01:51:43.205Z", + "source": { + "ip": "83.222.240.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43197, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "83.222.240.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12856" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZdjdUmcBTFzn_XoLdARP", + "source": { + "@timestamp": "2018-11-27T01:51:43.309Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43198, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "83.222.240.60" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "83.222.240.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12856", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "83.222.240.60" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INjdUmcBTFzn_XoLggVd", + "source": { + "@timestamp": "2018-11-27T01:51:46.789Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "142.93.210.90", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 44207, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30014", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "142.93.210.90" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "IdjdUmcBTFzn_XoLggVd", + "source": { + "@timestamp": "2018-11-27T01:51:46.789Z", + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30014", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.210.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "142.93.210.90" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44208, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItjdUmcBTFzn_XoLggVd", + "source": { + "@timestamp": "2018-11-27T01:51:47.021Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "142.93.210.90" + } + }, + "sequence": 44209, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "142.93.210.90" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30014", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "142.93.210.90" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtjdUmcBTFzn_XoLYAMi", + "source": { + "@timestamp": "2018-11-27T01:51:38.040Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19814", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "121.124.124.73", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "121.124.124.73", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142385, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtjdUmcBTFzn_XoLaAOj", + "source": { + "@timestamp": "2018-11-27T01:51:40.216Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "19816", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "121.124.124.73", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142386, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9jdUmcBTFzn_XoLaAOj", + "source": { + "@timestamp": "2018-11-27T01:51:40.217Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "121.124.124.73", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142387, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19816", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNjdUmcBTFzn_XoLaAOj", + "source": { + "@timestamp": "2018-11-27T01:51:40.395Z", + "auditd": { + "sequence": 142388, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "121.124.124.73" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "121.124.124.73", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19816", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "121.124.124.73" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtjdUmcBTFzn_XoL0w1m", + "source": { + "@timestamp": "2018-11-27T01:52:07.547Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32446", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186509, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "F9jdUmcBTFzn_XoL0w1m", + "source": { + "@timestamp": "2018-11-27T01:52:07.548Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186510, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32446", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "GNjdUmcBTFzn_XoL0w1m", + "source": { + "@timestamp": "2018-11-27T01:52:07.578Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32446" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186511, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hdjeUmcBTFzn_XoLyiGI", + "source": { + "@timestamp": "2018-11-27T01:53:10.809Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "128.199.128.215" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43208, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12875", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.128.215" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "htjeUmcBTFzn_XoLyiGI", + "source": { + "@timestamp": "2018-11-27T01:53:10.813Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12875", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.128.215" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "128.199.128.215", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43209, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9jeUmcBTFzn_XoLyiGI", + "source": { + "@timestamp": "2018-11-27T01:53:11.005Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12875", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.128.215" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "128.199.128.215", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 43210, + "result": "fail", + "session": "unset", + "data": { + "hostname": "128.199.128.215", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hdjeUmcBTFzn_XoL5SQF", + "source": { + "@timestamp": "2018-11-27T01:53:17.595Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32449", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186512 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "htjeUmcBTFzn_XoL5SQF", + "source": { + "@timestamp": "2018-11-27T01:53:17.596Z", + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186513, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32449" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9jeUmcBTFzn_XoL5SQF", + "source": { + "@timestamp": "2018-11-27T01:53:17.627Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32449", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186514, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + } + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ytjdUmcBTFzn_XoL0gs9", + "source": { + "@timestamp": "2018-11-27T01:52:07.159Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "153.19.40.20" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43199, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12863", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "153.19.40.20" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "y9jdUmcBTFzn_XoL0gs9", + "source": { + "@timestamp": "2018-11-27T01:52:07.159Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12863" + }, + "source": { + "ip": "153.19.40.20" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43200, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "153.19.40.20" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zNjdUmcBTFzn_XoL0gs9", + "source": { + "@timestamp": "2018-11-27T01:52:07.287Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "153.19.40.20" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "153.19.40.20" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43201, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12863", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "153.19.40.20" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNjkUmcBTFzn_XoLfZ-j", + "source": { + "@timestamp": "2018-11-27T01:59:24.344Z", + "process": { + "pid": "783", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "91.134.241.32" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "91.134.241.32" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192562 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdjkUmcBTFzn_XoLfZ-j", + "source": { + "@timestamp": "2018-11-27T01:59:24.345Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "91.134.241.32", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192563, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "783" + }, + "source": { + "ip": "91.134.241.32" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtjkUmcBTFzn_XoLfZ-j", + "source": { + "@timestamp": "2018-11-27T01:59:24.452Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "91.134.241.32" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "91.134.241.32", + "terminal": "ssh" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "91.134.241.32", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192564, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "783", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdjkUmcBTFzn_XoLgZ_0", + "source": { + "@timestamp": "2018-11-27T01:59:25.449Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32500" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186542, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtjkUmcBTFzn_XoLgZ_0", + "source": { + "@timestamp": "2018-11-27T01:59:25.450Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32500", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186543, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Q9jkUmcBTFzn_XoLgZ_0", + "source": { + "@timestamp": "2018-11-27T01:59:25.481Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186544, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32500", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jdjjUmcBTFzn_XoLToQx", + "source": { + "@timestamp": "2018-11-27T01:58:06.663Z", + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186539, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32492", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "jtjjUmcBTFzn_XoLToQx", + "source": { + "@timestamp": "2018-11-27T01:58:06.664Z", + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32492", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186540, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "j9jjUmcBTFzn_XoLToQx", + "source": { + "@timestamp": "2018-11-27T01:58:06.694Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32492" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186541 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZdjiUmcBTFzn_XoLImvA", + "source": { + "@timestamp": "2018-11-27T01:56:50.005Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186530 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32480", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtjiUmcBTFzn_XoLImvA", + "source": { + "@timestamp": "2018-11-27T01:56:50.006Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186531, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32480", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9jiUmcBTFzn_XoLImvA", + "source": { + "@timestamp": "2018-11-27T01:56:50.037Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32480", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186532, + "result": "fail", + "session": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "etjlUmcBTFzn_XoLHawN", + "source": { + "@timestamp": "2018-11-27T02:00:05.155Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "785" + }, + "source": { + "ip": "212.159.18.107" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192565, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "212.159.18.107", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "e9jlUmcBTFzn_XoLHawN", + "source": { + "@timestamp": "2018-11-27T02:00:05.156Z", + "process": { + "pid": "785", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "212.159.18.107" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "212.159.18.107", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192566, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "fNjlUmcBTFzn_XoLHawN", + "source": { + "@timestamp": "2018-11-27T02:00:05.265Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "212.159.18.107" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "212.159.18.107", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "212.159.18.107", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192567, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "785", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtjjUmcBTFzn_XoLIYEi", + "source": { + "@timestamp": "2018-11-27T01:57:55.128Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32490", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.153.219.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186536, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "190.153.219.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9jjUmcBTFzn_XoLIYEi", + "source": { + "@timestamp": "2018-11-27T01:57:55.129Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32490", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.153.219.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "190.153.219.50", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186537, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNjjUmcBTFzn_XoLIYEi", + "source": { + "@timestamp": "2018-11-27T01:57:55.284Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "sequence": 186538, + "result": "fail", + "session": "unset", + "data": { + "hostname": "190.153.219.50", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "190.153.219.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32490", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "190.153.219.50" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItjiUmcBTFzn_XoLZXBu", + "source": { + "@timestamp": "2018-11-27T01:57:07.073Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12897", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "151.80.144.39" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "151.80.144.39" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43214, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9jiUmcBTFzn_XoLZXBu", + "source": { + "@timestamp": "2018-11-27T01:57:07.073Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12897", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "151.80.144.39" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "151.80.144.39", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43215 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNjiUmcBTFzn_XoLZXBu", + "source": { + "@timestamp": "2018-11-27T01:57:07.181Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "151.80.144.39", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43216, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "151.80.144.39", + "terminal": "ssh" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12897" + }, + "source": { + "ip": "151.80.144.39" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1djjUmcBTFzn_XoLD39T", + "source": { + "@timestamp": "2018-11-27T01:57:50.568Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "61.73.98.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186533, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32487", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "61.73.98.60" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1tjjUmcBTFzn_XoLD39T", + "source": { + "@timestamp": "2018-11-27T01:57:50.570Z", + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32487", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "61.73.98.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "61.73.98.60" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186534, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19jjUmcBTFzn_XoLD39T", + "source": { + "@timestamp": "2018-11-27T01:57:50.730Z", + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32487", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "61.73.98.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186535, + "result": "fail", + "session": "unset", + "data": { + "hostname": "61.73.98.60", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "61.73.98.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9jiUmcBTFzn_XoL9X2Y", + "source": { + "@timestamp": "2018-11-27T01:57:43.982Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192559, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "193.70.39.84" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "769", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.39.84" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNjiUmcBTFzn_XoL9X2Y", + "source": { + "@timestamp": "2018-11-27T01:57:43.983Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "769" + }, + "source": { + "ip": "193.70.39.84" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "193.70.39.84", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192560, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddjiUmcBTFzn_XoL9X2Y", + "source": { + "@timestamp": "2018-11-27T01:57:44.094Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "769", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "193.70.39.84" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "193.70.39.84", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "193.70.39.84", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192561, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "lNjkUmcBTFzn_XoLRpqM", + "source": { + "@timestamp": "2018-11-27T01:59:10.239Z", + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "104.208.143.92", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44219, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30166", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.208.143.92" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ldjkUmcBTFzn_XoLRpqM", + "source": { + "@timestamp": "2018-11-27T01:59:10.239Z", + "source": { + "ip": "104.208.143.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "104.208.143.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 44220, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30166", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltjkUmcBTFzn_XoLRpqM", + "source": { + "@timestamp": "2018-11-27T01:59:10.283Z", + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30166" + }, + "source": { + "ip": "104.208.143.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44221, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "104.208.143.92" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "104.208.143.92", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdnsUmcBTFzn_XoLslKD", + "source": { + "@timestamp": "2018-11-27T02:08:22.166Z", + "process": { + "pid": "30352", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "110.36.221.182" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "110.36.221.182", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44231, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NtnsUmcBTFzn_XoLslKD", + "source": { + "@timestamp": "2018-11-27T02:08:22.166Z", + "auditd": { + "sequence": 44232, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "110.36.221.182", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30352", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "110.36.221.182" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9nsUmcBTFzn_XoLslKD", + "source": { + "@timestamp": "2018-11-27T02:08:22.414Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30352", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "110.36.221.182" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "110.36.221.182", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "110.36.221.182" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44233 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9tnsUmcBTFzn_XoLt1Lw", + "source": { + "@timestamp": "2018-11-27T02:08:23.554Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30354" + }, + "source": { + "ip": "61.73.98.60" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44234, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "61.73.98.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "99nsUmcBTFzn_XoLt1Lw", + "source": { + "@timestamp": "2018-11-27T02:08:23.554Z", + "source": { + "ip": "61.73.98.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "61.73.98.60" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44235 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30354", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-NnsUmcBTFzn_XoLt1Lw", + "source": { + "@timestamp": "2018-11-27T02:08:23.714Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "61.73.98.60" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "61.73.98.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44236 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30354" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "61.73.98.60" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1dnpUmcBTFzn_XoLNAWm", + "source": { + "@timestamp": "2018-11-27T02:04:33.307Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26060", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "151.80.136.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "151.80.136.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184405, + "result": "fail" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1tnpUmcBTFzn_XoLNAWm", + "source": { + "@timestamp": "2018-11-27T02:04:33.309Z", + "source": { + "ip": "151.80.136.92" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184406, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "151.80.136.92", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26060", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19npUmcBTFzn_XoLNAWm", + "source": { + "@timestamp": "2018-11-27T02:04:33.423Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "151.80.136.92", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "151.80.136.92" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184407, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26060", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "151.80.136.92" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3tnpUmcBTFzn_XoLOwYm", + "source": { + "@timestamp": "2018-11-27T02:04:35.004Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "177.124.89.14", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "177.124.89.14", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 184408 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26062", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "177.124.89.14" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tnpUmcBTFzn_XoLZAmP", + "source": { + "@timestamp": "2018-11-27T02:04:45.605Z", + "process": { + "pid": "32532", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + } + }, + "sequence": 186557 + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69npUmcBTFzn_XoLZAmP", + "source": { + "@timestamp": "2018-11-27T02:04:45.606Z", + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186558 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32532" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7NnpUmcBTFzn_XoLZAmP", + "source": { + "@timestamp": "2018-11-27T02:04:45.638Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32532", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + } + }, + "sequence": 186559, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNnsUmcBTFzn_XoLVUul", + "source": { + "@timestamp": "2018-11-27T02:07:58.394Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "19916" + }, + "source": { + "ip": "74.208.43.208" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142410, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "74.208.43.208", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdnsUmcBTFzn_XoLVUul", + "source": { + "@timestamp": "2018-11-27T02:07:58.395Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19916", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "74.208.43.208" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "74.208.43.208" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142411, + "result": "fail" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtnsUmcBTFzn_XoLVUul", + "source": { + "@timestamp": "2018-11-27T02:07:58.422Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "pid": "19916", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "74.208.43.208" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142412, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "74.208.43.208" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "74.208.43.208", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rtnqUmcBTFzn_XoLniSL", + "source": { + "@timestamp": "2018-11-27T02:06:05.967Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186560, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32540" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9nqUmcBTFzn_XoLniSL", + "source": { + "@timestamp": "2018-11-27T02:06:05.968Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186561, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32540", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNnqUmcBTFzn_XoLniSL", + "source": { + "@timestamp": "2018-11-27T02:06:05.999Z", + "process": { + "pid": "32540", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + } + }, + "sequence": 186562, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtjoUmcBTFzn_XoLSvJx", + "source": { + "@timestamp": "2018-11-27T02:03:33.383Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26052", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184402, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.236.181.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "K9joUmcBTFzn_XoLSvJx", + "source": { + "@timestamp": "2018-11-27T02:03:33.384Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26052", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "104.236.181.158", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184403 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNjoUmcBTFzn_XoLSvJx", + "source": { + "@timestamp": "2018-11-27T02:03:33.426Z", + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "104.236.181.158" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "104.236.181.158" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184404, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26052" + }, + "source": { + "ip": "104.236.181.158" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "kdnrUmcBTFzn_XoL2j_v", + "source": { + "@timestamp": "2018-11-27T02:07:26.981Z", + "process": { + "pid": "32548", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186563, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ktnrUmcBTFzn_XoL2j_v", + "source": { + "@timestamp": "2018-11-27T02:07:26.982Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186564 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32548", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "k9nrUmcBTFzn_XoL2j_v", + "source": { + "@timestamp": "2018-11-27T02:07:27.012Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186565, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32548", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ntnpUmcBTFzn_XoLkg3n", + "source": { + "@timestamp": "2018-11-27T02:04:57.466Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30281", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.156.152.134" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44225, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "89.156.152.134", + "type": "user-session", + "primary": "sshd" + } + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "n9npUmcBTFzn_XoLkg3n", + "source": { + "@timestamp": "2018-11-27T02:04:57.466Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30281" + }, + "source": { + "ip": "89.156.152.134" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "89.156.152.134", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44226, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "oNnpUmcBTFzn_XoLkg3n", + "source": { + "@timestamp": "2018-11-27T02:04:57.574Z", + "process": { + "pid": "30281", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.156.152.134" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44227, + "result": "fail", + "session": "unset", + "data": { + "hostname": "89.156.152.134", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "89.156.152.134" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VdnrUmcBTFzn_XoLLzF2", + "source": { + "@timestamp": "2018-11-27T02:06:43.078Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30322", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "210.71.197.80" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "210.71.197.80", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44228, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VtnrUmcBTFzn_XoLLzF2", + "source": { + "@timestamp": "2018-11-27T02:06:43.078Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30322", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "210.71.197.80" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44229, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "210.71.197.80", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "V9nrUmcBTFzn_XoLLzF2", + "source": { + "@timestamp": "2018-11-27T02:06:43.254Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "30322", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "210.71.197.80" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44230, + "result": "fail", + "session": "unset", + "data": { + "hostname": "210.71.197.80", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "210.71.197.80" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8tnwUmcBTFzn_XoLk6fE", + "source": { + "@timestamp": "2018-11-27T02:12:36.443Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "secondary": "37.187.195.209", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 192577 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "916", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.195.209" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "89nwUmcBTFzn_XoLk6fE", + "source": { + "@timestamp": "2018-11-27T02:12:36.443Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "37.187.195.209" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192578, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.187.195.209", + "type": "user-session" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "916", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9NnwUmcBTFzn_XoLk6fE", + "source": { + "@timestamp": "2018-11-27T02:12:36.550Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "37.187.195.209" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "37.187.195.209", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 192579 + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "916", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.187.195.209" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9nwUmcBTFzn_XoLlqgH", + "source": { + "@timestamp": "2018-11-27T02:12:37.021Z", + "source": { + "ip": "51.38.176.147" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184424, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.38.176.147", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26164" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ENnwUmcBTFzn_XoLlqgH", + "source": { + "@timestamp": "2018-11-27T02:12:37.022Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.38.176.147", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184425, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26164", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.176.147" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdnwUmcBTFzn_XoLlqgH", + "source": { + "@timestamp": "2018-11-27T02:12:37.127Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26164", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.38.176.147" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "51.38.176.147", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184426, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.38.176.147" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNnwUmcBTFzn_XoLl6g8", + "source": { + "@timestamp": "2018-11-27T02:12:37.327Z", + "process": { + "pid": "12992", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.227.27" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "81.174.227.27", + "type": "user-session" + } + }, + "sequence": 43232, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HdnwUmcBTFzn_XoLl6g8", + "source": { + "@timestamp": "2018-11-27T02:12:37.327Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "81.174.227.27", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43233, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "12992", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.227.27" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HtnwUmcBTFzn_XoLl6g8", + "source": { + "@timestamp": "2018-11-27T02:12:37.435Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43234, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "81.174.227.27", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "81.174.227.27" + } + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "12992", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.174.227.27" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DdnwUmcBTFzn_XoLRqHL", + "source": { + "@timestamp": "2018-11-27T02:12:16.736Z", + "source": { + "ip": "159.65.225.184" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.65.225.184", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44250 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30449" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DtnwUmcBTFzn_XoLRqHL", + "source": { + "@timestamp": "2018-11-27T02:12:16.736Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30449" + }, + "source": { + "ip": "159.65.225.184" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44249, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "159.65.225.184", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9nwUmcBTFzn_XoLRqHL", + "source": { + "@timestamp": "2018-11-27T02:12:16.764Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30449", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.65.225.184" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44251, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "159.65.225.184", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "159.65.225.184", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtnwUmcBTFzn_XoLUqId", + "source": { + "@timestamp": "2018-11-27T02:12:19.633Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43226, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "185.91.116.197", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12988", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.91.116.197" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9nwUmcBTFzn_XoLUqId", + "source": { + "@timestamp": "2018-11-27T02:12:19.633Z", + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "185.91.116.197" + } + }, + "sequence": 43227, + "result": "fail" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "12988", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "185.91.116.197" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNnwUmcBTFzn_XoLUqId", + "source": { + "@timestamp": "2018-11-27T02:12:19.753Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "185.91.116.197", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "185.91.116.197" + } + }, + "sequence": 43228, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12988" + }, + "source": { + "ip": "185.91.116.197" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6NnwUmcBTFzn_XoLjqfh", + "source": { + "@timestamp": "2018-11-27T02:12:35.140Z", + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26162", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.252.209.190" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "192.252.209.190", + "type": "user-session" + } + }, + "sequence": 184421 + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dnwUmcBTFzn_XoLjqfh", + "source": { + "@timestamp": "2018-11-27T02:12:35.141Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26162", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "192.252.209.190" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "secondary": "192.252.209.190", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184422, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tnwUmcBTFzn_XoLjqfh", + "source": { + "@timestamp": "2018-11-27T02:12:35.173Z", + "process": { + "pid": "26162", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "192.252.209.190" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184423, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "192.252.209.190", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "192.252.209.190" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctnvUmcBTFzn_XoLp5MU", + "source": { + "@timestamp": "2018-11-27T02:11:35.850Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "912", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "105.16.153.210" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "sequence": 192574, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "105.16.153.210", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9nvUmcBTFzn_XoLp5MU", + "source": { + "@timestamp": "2018-11-27T02:11:35.851Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "105.16.153.210", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 192575, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "912" + }, + "source": { + "ip": "105.16.153.210" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNnvUmcBTFzn_XoLp5MU", + "source": { + "@timestamp": "2018-11-27T02:11:36.114Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "105.16.153.210", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192576, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "105.16.153.210", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "912" + }, + "source": { + "ip": "105.16.153.210" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2dnvUmcBTFzn_XoLwpV9", + "source": { + "@timestamp": "2018-11-27T02:11:42.866Z", + "process": { + "pid": "19940", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "167.99.212.179" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "167.99.212.179" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142419, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2tnvUmcBTFzn_XoLwpV9", + "source": { + "@timestamp": "2018-11-27T02:11:42.867Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19940", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "167.99.212.179" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "167.99.212.179" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142420 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "29nvUmcBTFzn_XoLwpV9", + "source": { + "@timestamp": "2018-11-27T02:11:42.971Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19940", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "167.99.212.179" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142421, + "result": "fail", + "session": "unset", + "data": { + "hostname": "167.99.212.179", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "167.99.212.179", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8tnvUmcBTFzn_XoLn5Ih", + "source": { + "@timestamp": "2018-11-27T02:11:33.815Z", + "process": { + "pid": "32575", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186575, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "89nvUmcBTFzn_XoLn5Ih", + "source": { + "@timestamp": "2018-11-27T02:11:33.816Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32575" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186576, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9NnvUmcBTFzn_XoLn5Ih", + "source": { + "@timestamp": "2018-11-27T02:11:33.846Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32575", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186577, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + } + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "L9nvUmcBTFzn_XoLVo3n", + "source": { + "@timestamp": "2018-11-27T02:11:15.325Z", + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "67.166.24.55", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186572, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32573", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "67.166.24.55" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MNnvUmcBTFzn_XoLVo3n", + "source": { + "@timestamp": "2018-11-27T02:11:15.326Z", + "source": { + "ip": "67.166.24.55" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186573, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "67.166.24.55", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32573", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MdnvUmcBTFzn_XoLVo3n", + "source": { + "@timestamp": "2018-11-27T02:11:15.490Z", + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "67.166.24.55" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186574, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "67.166.24.55", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "67.166.24.55", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32573", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "N9nvUmcBTFzn_XoL2Zh8", + "source": { + "@timestamp": "2018-11-27T02:11:48.750Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30433" + }, + "source": { + "ip": "217.182.55.191" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "217.182.55.191", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 44246, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ONnvUmcBTFzn_XoL2Zh8", + "source": { + "@timestamp": "2018-11-27T02:11:48.750Z", + "source": { + "ip": "217.182.55.191" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "217.182.55.191", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44247 + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "30433", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "OdnvUmcBTFzn_XoL2Zh8", + "source": { + "@timestamp": "2018-11-27T02:11:48.858Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30433", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.182.55.191" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44248, + "result": "fail", + "session": "unset", + "data": { + "hostname": "217.182.55.191", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "217.182.55.191" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QNnwUmcBTFzn_XoLaKRf", + "source": { + "@timestamp": "2018-11-27T02:12:25.330Z", + "source": { + "ip": "94.16.115.155" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "94.16.115.155", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43229, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "12990", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QdnwUmcBTFzn_XoLaKRf", + "source": { + "@timestamp": "2018-11-27T02:12:25.330Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "12990", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "94.16.115.155" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "94.16.115.155", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43230 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "QtnwUmcBTFzn_XoLaKRf", + "source": { + "@timestamp": "2018-11-27T02:12:25.442Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "12990" + }, + "source": { + "ip": "94.16.115.155" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "94.16.115.155" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "94.16.115.155", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43231 + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6dr0UmcBTFzn_XoLnQBb", + "source": { + "@timestamp": "2018-11-27T02:17:01.040Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26196", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184433, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6tr0UmcBTFzn_XoLnQBb", + "source": { + "@timestamp": "2018-11-27T02:17:01.040Z", + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26196", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184434, + "result": "success", + "session": "unset", + "data": { + "terminal": "cron", + "op": "PAM:setcred", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "69r0UmcBTFzn_XoLnQBb", + "source": { + "@timestamp": "2018-11-27T02:17:01.042Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "26196", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 184436, + "result": "success", + "session": "9861", + "data": { + "op": "PAM:session_open", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7Nr0UmcBTFzn_XoLnQBb", + "source": { + "@timestamp": "2018-11-27T02:17:01.045Z", + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "26196" + }, + "auditd": { + "sequence": 184437, + "result": "success", + "session": "9861", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + } + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "7dr0UmcBTFzn_XoLnQBb", + "source": { + "@timestamp": "2018-11-27T02:17:01.045Z", + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "26196" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "acct": "root", + "op": "PAM:session_close", + "terminal": "cron" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 184438, + "result": "success", + "session": "9861" + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8dr0UmcBTFzn_XoLnQD4", + "source": { + "@timestamp": "2018-11-27T02:17:01.194Z", + "process": { + "pid": "30546", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 44259 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8tr0UmcBTFzn_XoLnQD4", + "source": { + "@timestamp": "2018-11-27T02:17:01.194Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "30546", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 44258 + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_acct", + "action": "was-authorized" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "89r0UmcBTFzn_XoLnQD4", + "source": { + "@timestamp": "2018-11-27T02:17:01.194Z", + "event": { + "type": "user_start", + "action": "started-session", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "30546" + }, + "auditd": { + "result": "success", + "session": "1445", + "data": { + "acct": "root", + "op": "PAM:session_open", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 44261 + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9Nr0UmcBTFzn_XoLnQD4", + "source": { + "@timestamp": "2018-11-27T02:17:01.198Z", + "event": { + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30546", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "1445", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 44262 + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "9dr0UmcBTFzn_XoLnQD4", + "source": { + "@timestamp": "2018-11-27T02:17:01.198Z", + "process": { + "pid": "30546", + "exe": "/usr/sbin/cron" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "sequence": 44263, + "result": "success", + "session": "1445", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "CNr0UmcBTFzn_XoLngEH", + "source": { + "@timestamp": "2018-11-27T02:17:01.212Z", + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "19971" + }, + "auditd": { + "sequence": 142422, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:accounting", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "type": "user_acct", + "action": "was-authorized", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Cdr0UmcBTFzn_XoLngEH", + "source": { + "@timestamp": "2018-11-27T02:17:01.213Z", + "process": { + "pid": "19971", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 142423, + "result": "success", + "session": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "action": "acquired-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_acq" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ctr0UmcBTFzn_XoLngEH", + "source": { + "@timestamp": "2018-11-27T02:17:01.214Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_start", + "action": "started-session" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "19971", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "3504", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 142425 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "C9r0UmcBTFzn_XoLngEH", + "source": { + "@timestamp": "2018-11-27T02:17:01.217Z", + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0", + "uid": "0" + }, + "process": { + "pid": "19971", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "result": "success", + "session": "3504", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 142426 + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DNr0UmcBTFzn_XoLngEH", + "source": { + "@timestamp": "2018-11-27T02:17:01.218Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "19971", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 142427, + "result": "success", + "session": "3504", + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:session_close" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ddr0UmcBTFzn_XoLngEO", + "source": { + "@timestamp": "2018-11-27T02:17:01.220Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "data": { + "acct": "root", + "op": "PAM:accounting", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192589, + "result": "success", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "947", + "exe": "/usr/sbin/cron" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Dtr0UmcBTFzn_XoLngEO", + "source": { + "@timestamp": "2018-11-27T02:17:01.220Z", + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "947", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:setcred" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192590, + "result": "success" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9r0UmcBTFzn_XoLngEO", + "source": { + "@timestamp": "2018-11-27T02:17:01.222Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "947", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "9865", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192592, + "result": "success" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ENr0UmcBTFzn_XoLngEO", + "source": { + "@timestamp": "2018-11-27T02:17:01.225Z", + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "result": "success", + "session": "9865", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 192593 + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "process": { + "pid": "947", + "exe": "/usr/sbin/cron" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Edr0UmcBTFzn_XoLngEO", + "source": { + "@timestamp": "2018-11-27T02:17:01.226Z", + "user": { + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0", + "auid": "0" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "947", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 192594, + "result": "success", + "session": "9865", + "data": { + "op": "PAM:session_close", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "cron" + } + } + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Etr0UmcBTFzn_XoLngEt", + "source": { + "@timestamp": "2018-11-27T02:17:01.245Z", + "process": { + "exe": "/usr/sbin/cron", + "pid": "13026" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:accounting" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43247 + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E9r0UmcBTFzn_XoLngEt", + "source": { + "@timestamp": "2018-11-27T02:17:01.249Z", + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13026", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 43248, + "result": "success", + "session": "unset", + "data": { + "op": "PAM:setcred", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNr0UmcBTFzn_XoLngEt", + "source": { + "@timestamp": "2018-11-27T02:17:01.249Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "13026" + }, + "auditd": { + "sequence": 43250, + "result": "success", + "session": "1253", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:session_open" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Fdr0UmcBTFzn_XoLngEt", + "source": { + "@timestamp": "2018-11-27T02:17:01.257Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "disposed-credentials", + "module": "auditd", + "category": "user-login", + "type": "cred_disp" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13026", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "1253", + "data": { + "op": "PAM:setcred", + "acct": "root", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 43251, + "result": "success" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ftr0UmcBTFzn_XoLngEt", + "source": { + "@timestamp": "2018-11-27T02:17:01.257Z", + "auditd": { + "sequence": 43252, + "result": "success", + "session": "1253", + "data": { + "terminal": "cron", + "op": "PAM:session_close", + "acct": "root" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + } + }, + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "exe": "/usr/sbin/cron", + "pid": "13026" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INr0UmcBTFzn_XoLoAHh", + "source": { + "@timestamp": "2018-11-27T02:17:01.906Z", + "event": { + "category": "user-login", + "type": "user_acct", + "action": "was-authorized", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32605", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "sequence": 186590, + "result": "success", + "session": "unset", + "data": { + "acct": "root", + "terminal": "cron", + "op": "PAM:accounting" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Idr0UmcBTFzn_XoLoAHh", + "source": { + "@timestamp": "2018-11-27T02:17:01.907Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "cred_acq", + "action": "acquired-credentials", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32605", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "root", + "op": "PAM:setcred", + "terminal": "cron" + }, + "summary": { + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "cron", + "type": "user-session" + } + }, + "sequence": 186591, + "result": "success" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Itr0UmcBTFzn_XoLoAHh", + "source": { + "@timestamp": "2018-11-27T02:17:01.908Z", + "process": { + "pid": "32605", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "session": "3512", + "data": { + "op": "PAM:session_open", + "terminal": "cron", + "acct": "root" + }, + "summary": { + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron", + "actor": { + "secondary": "root", + "primary": "root" + } + }, + "sequence": 186593, + "result": "success" + }, + "event": { + "category": "user-login", + "type": "user_start", + "action": "started-session", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "I9r0UmcBTFzn_XoLoAHh", + "source": { + "@timestamp": "2018-11-27T02:17:01.911Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "process": { + "pid": "32605", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "data": { + "terminal": "cron", + "acct": "root", + "op": "PAM:setcred" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "cron" + }, + "how": "/usr/sbin/cron", + "actor": { + "primary": "root", + "secondary": "root" + } + }, + "sequence": 186594, + "result": "success", + "session": "3512" + }, + "event": { + "category": "user-login", + "type": "cred_disp", + "action": "disposed-credentials", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "auid": "root", + "uid": "root" + }, + "auid": "0" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "JNr0UmcBTFzn_XoLoAHh", + "source": { + "@timestamp": "2018-11-27T02:17:01.912Z", + "event": { + "category": "user-login", + "type": "user_end", + "action": "ended-session", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "0", + "name_map": { + "auid": "root", + "uid": "root" + } + }, + "process": { + "pid": "32605", + "exe": "/usr/sbin/cron" + }, + "auditd": { + "summary": { + "actor": { + "primary": "root", + "secondary": "root" + }, + "object": { + "primary": "cron", + "type": "user-session" + }, + "how": "/usr/sbin/cron" + }, + "sequence": 186595, + "result": "success", + "session": "3512", + "data": { + "op": "PAM:session_close", + "terminal": "cron", + "acct": "root" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9r1UmcBTFzn_XoLvBrE", + "source": { + "@timestamp": "2018-11-27T02:18:14.617Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "122.160.137.37", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142428 + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "19981", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "122.160.137.37" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNr1UmcBTFzn_XoLvBrE", + "source": { + "@timestamp": "2018-11-27T02:18:14.619Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "122.160.137.37", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142429, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19981", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "122.160.137.37" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Hdr1UmcBTFzn_XoLvBrE", + "source": { + "@timestamp": "2018-11-27T02:18:14.905Z", + "source": { + "ip": "122.160.137.37" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142430, + "result": "fail", + "session": "unset", + "data": { + "hostname": "122.160.137.37", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "122.160.137.37", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "19981", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Htr1UmcBTFzn_XoLvRof", + "source": { + "@timestamp": "2018-11-27T02:18:14.709Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "process": { + "pid": "960", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.207.220.128" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192598, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "200.207.220.128", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "H9r1UmcBTFzn_XoLvRof", + "source": { + "@timestamp": "2018-11-27T02:18:14.710Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "960", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "200.207.220.128" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "200.207.220.128" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192599, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "INr1UmcBTFzn_XoLvRof", + "source": { + "@timestamp": "2018-11-27T02:18:14.895Z", + "auditd": { + "data": { + "hostname": "200.207.220.128", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "200.207.220.128" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192600, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "960", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "200.207.220.128" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MtnzUmcBTFzn_XoLcefM", + "source": { + "@timestamp": "2018-11-27T02:15:44.351Z", + "source": { + "ip": "147.135.208.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "147.135.208.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43241 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13016" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9nzUmcBTFzn_XoLcefM", + "source": { + "@timestamp": "2018-11-27T02:15:44.351Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13016", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "147.135.208.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "147.135.208.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43242, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNnzUmcBTFzn_XoLcefM", + "source": { + "@timestamp": "2018-11-27T02:15:44.487Z", + "source": { + "ip": "147.135.208.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "147.135.208.7" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "147.135.208.7", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43243, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "13016", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9nzUmcBTFzn_XoLdeex", + "source": { + "@timestamp": "2018-11-27T02:15:45.351Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "32602", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186587, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNnzUmcBTFzn_XoLdeex", + "source": { + "@timestamp": "2018-11-27T02:15:45.352Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186588, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32602", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdnzUmcBTFzn_XoLdeex", + "source": { + "@timestamp": "2018-11-27T02:15:45.383Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186589 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32602", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "J9r1UmcBTFzn_XoLwBpB", + "source": { + "@timestamp": "2018-11-27T02:18:15.507Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "13035", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "109.75.216.201" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "109.75.216.201", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43253, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNr1UmcBTFzn_XoLwBpB", + "source": { + "@timestamp": "2018-11-27T02:18:15.507Z", + "process": { + "pid": "13035", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "109.75.216.201" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "109.75.216.201", + "type": "user-session" + } + }, + "sequence": 43254, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Kdr1UmcBTFzn_XoLwBpB", + "source": { + "@timestamp": "2018-11-27T02:18:15.647Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13035", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "109.75.216.201" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "109.75.216.201", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43255, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "109.75.216.201" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "htr1UmcBTFzn_XoLxhrF", + "source": { + "@timestamp": "2018-11-27T02:18:17.176Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "165.227.5.206" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43256, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13037" + }, + "source": { + "ip": "165.227.5.206" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "h9r1UmcBTFzn_XoLxhrF", + "source": { + "@timestamp": "2018-11-27T02:18:17.176Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "165.227.5.206", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43257, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13037" + }, + "source": { + "ip": "165.227.5.206" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "iNr1UmcBTFzn_XoLxhrF", + "source": { + "@timestamp": "2018-11-27T02:18:17.220Z", + "auditd": { + "sequence": 43258, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "165.227.5.206", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "165.227.5.206", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13037", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "165.227.5.206" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4tr2UmcBTFzn_XoLCyDa", + "source": { + "@timestamp": "2018-11-27T02:18:34.864Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186599, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32621", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "49r2UmcBTFzn_XoLCyDa", + "source": { + "@timestamp": "2018-11-27T02:18:34.866Z", + "process": { + "pid": "32621", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186600, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5Nr2UmcBTFzn_XoLCyDa", + "source": { + "@timestamp": "2018-11-27T02:18:34.896Z", + "process": { + "pid": "32621", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186601, + "result": "fail", + "session": "unset", + "data": { + "hostname": "107.170.65.109", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A9r0UmcBTFzn_XoLvwRX", + "source": { + "@timestamp": "2018-11-27T02:17:09.740Z", + "process": { + "pid": "32613", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186596, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BNr0UmcBTFzn_XoLvwRX", + "source": { + "@timestamp": "2018-11-27T02:17:09.742Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186597 + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32613", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Bdr0UmcBTFzn_XoLvwRX", + "source": { + "@timestamp": "2018-11-27T02:17:09.772Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "hostname": "107.170.65.109", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186598, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32613", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9n0UmcBTFzn_XoLLvfV", + "source": { + "@timestamp": "2018-11-27T02:16:32.747Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26188", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.79.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184430, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.131.79.34" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNn0UmcBTFzn_XoLLvfV", + "source": { + "@timestamp": "2018-11-27T02:16:32.748Z", + "process": { + "pid": "26188", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.79.34" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184431, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "104.131.79.34" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adn0UmcBTFzn_XoLLvfV", + "source": { + "@timestamp": "2018-11-27T02:16:32.779Z", + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "104.131.79.34" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "104.131.79.34", + "type": "user-session" + } + }, + "sequence": 184432, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "26188", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.131.79.34" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wdr1UmcBTFzn_XoLdBNI", + "source": { + "@timestamp": "2018-11-27T02:17:56.062Z", + "source": { + "ip": "89.156.152.134" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "89.156.152.134", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192595, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "957", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wtr1UmcBTFzn_XoLdBNI", + "source": { + "@timestamp": "2018-11-27T02:17:56.063Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192596, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "89.156.152.134", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "957", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.156.152.134" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "w9r1UmcBTFzn_XoLdBNI", + "source": { + "@timestamp": "2018-11-27T02:17:56.190Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "89.156.152.134" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "89.156.152.134", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192597, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "957", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "89.156.152.134" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UNnzUmcBTFzn_XoLwu4u", + "source": { + "@timestamp": "2018-11-27T02:16:04.928Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13018", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.168.254" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.168.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43244, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UdnzUmcBTFzn_XoLwu4u", + "source": { + "@timestamp": "2018-11-27T02:16:04.928Z", + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "178.33.168.254", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 43245, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13018" + }, + "source": { + "ip": "178.33.168.254" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UtnzUmcBTFzn_XoLwu4u", + "source": { + "@timestamp": "2018-11-27T02:16:05.048Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13018", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.168.254" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "178.33.168.254", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "178.33.168.254", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43246, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DdsBU2cBTFzn_XoL2SOm", + "source": { + "@timestamp": "2018-11-27T02:31:28.442Z", + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "147.135.208.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43274, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13130", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "147.135.208.7" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DtsBU2cBTFzn_XoL2SOm", + "source": { + "@timestamp": "2018-11-27T02:31:28.442Z", + "process": { + "pid": "13130", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "147.135.208.7" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43275, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "147.135.208.7" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9sBU2cBTFzn_XoL2SOm", + "source": { + "@timestamp": "2018-11-27T02:31:28.574Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "147.135.208.7" + }, + "summary": { + "object": { + "secondary": "147.135.208.7", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 43276, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13130", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "147.135.208.7" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ENsBU2cBTFzn_XoL2SOm", + "source": { + "@timestamp": "2018-11-27T02:31:28.994Z", + "user": { + "suid": "0", + "name_map": { + "fsuid": "root", + "gid": "root", + "sgid": "root", + "suid": "root", + "uid": "root", + "egid": "root", + "euid": "root", + "fsgid": "root" + }, + "gid": "0", + "auid": "unset", + "fsgid": "0", + "fsuid": "0", + "uid": "0", + "egid": "0", + "sgid": "0", + "euid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "ppid": "1379", + "title": "/sbin/iptables -w -I sshguard -s 147.135.208.7 -j DROP", + "name": "iptables", + "exe": "/sbin/xtables-multi", + "pid": "13132" + }, + "auditd": { + "result": "success", + "session": "unset", + "data": { + "syscall": "setsockopt", + "a0": "5", + "tty": "(none)", + "table": "filter", + "a2": "40", + "a3": "8ae870", + "a1": "0", + "family": "2", + "entries": "154", + "arch": "x86_64", + "exit": "0" + }, + "summary": { + "object": { + "primary": "filter", + "type": "firewall" + }, + "how": "/sbin/xtables-multi", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 43277 + }, + "event": { + "category": "configuration", + "type": "netfilter_cfg", + "action": "loaded-firewall-rule-to", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Ztr_UmcBTFzn_XoLP-rA", + "source": { + "@timestamp": "2018-11-27T02:28:37.974Z", + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 186620 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32675", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9r_UmcBTFzn_XoLP-rA", + "source": { + "@timestamp": "2018-11-27T02:28:37.975Z", + "auditd": { + "sequence": 186621, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32675", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "aNr_UmcBTFzn_XoLP-rA", + "source": { + "@timestamp": "2018-11-27T02:28:38.007Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "107.170.65.109" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186622, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32675" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-dsAU2cBTFzn_XoLlQYl", + "source": { + "@timestamp": "2018-11-27T02:30:05.371Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32684" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186623, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "107.170.65.109", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-tsAU2cBTFzn_XoLlQYl", + "source": { + "@timestamp": "2018-11-27T02:30:05.372Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32684" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 186624, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "-9sAU2cBTFzn_XoLlQYl", + "source": { + "@timestamp": "2018-11-27T02:30:05.403Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32684" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186625, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "M9sBU2cBTFzn_XoLwCBF", + "source": { + "@timestamp": "2018-11-27T02:31:21.946Z", + "auditd": { + "sequence": 186626, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "118.25.133.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "32692" + }, + "source": { + "ip": "118.25.133.243" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NNsBU2cBTFzn_XoLwCBF", + "source": { + "@timestamp": "2018-11-27T02:31:21.947Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32692", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "118.25.133.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186627, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "118.25.133.243", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "NdsBU2cBTFzn_XoLwCBF", + "source": { + "@timestamp": "2018-11-27T02:31:22.162Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32692", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "118.25.133.243" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "118.25.133.243", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "118.25.133.243" + } + }, + "sequence": 186628, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "D9oAU2cBTFzn_XoLOP8t", + "source": { + "@timestamp": "2018-11-27T02:29:41.565Z", + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.121.176" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "128.0.121.176", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43271, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ENoAU2cBTFzn_XoLOP8t", + "source": { + "@timestamp": "2018-11-27T02:29:41.569Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "128.0.121.176", + "type": "user-session" + } + }, + "sequence": 43272, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "13117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.121.176" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdoAU2cBTFzn_XoLOP8t", + "source": { + "@timestamp": "2018-11-27T02:29:41.677Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13117", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.121.176" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "128.0.121.176" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "128.0.121.176", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43273 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dNsBU2cBTFzn_XoL7CTn", + "source": { + "@timestamp": "2018-11-27T02:31:33.373Z", + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32694", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186629, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ddsBU2cBTFzn_XoL7CTn", + "source": { + "@timestamp": "2018-11-27T02:31:33.375Z", + "process": { + "pid": "32694", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186630, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "107.170.65.109" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "dtsBU2cBTFzn_XoL7CTn", + "source": { + "@timestamp": "2018-11-27T02:31:33.406Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32694", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "107.170.65.109" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186631, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "107.170.65.109", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "107.170.65.109", + "type": "user-session", + "primary": "ssh" + } + } + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "G9sCU2cBTFzn_XoLvzai", + "source": { + "@timestamp": "2018-11-27T02:32:27.319Z", + "auditd": { + "sequence": 192613, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "198.27.80.211", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "1045" + }, + "source": { + "ip": "198.27.80.211" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HNsCU2cBTFzn_XoLvzai", + "source": { + "@timestamp": "2018-11-27T02:32:27.320Z", + "source": { + "ip": "198.27.80.211" + }, + "network": { + "direction": "incoming" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "198.27.80.211", + "type": "user-session" + } + }, + "sequence": 192614, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1045", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "HdsCU2cBTFzn_XoLvzai", + "source": { + "@timestamp": "2018-11-27T02:32:27.362Z", + "auditd": { + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "198.27.80.211" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "198.27.80.211", + "type": "user-session" + } + }, + "sequence": 192615, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1045", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "198.27.80.211" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Sdr-UmcBTFzn_XoLMtPX", + "source": { + "@timestamp": "2018-11-27T02:27:29.130Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13103", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.67.193" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "54.37.67.193" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43268 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Str-UmcBTFzn_XoLMtPX", + "source": { + "@timestamp": "2018-11-27T02:27:29.130Z", + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13103" + }, + "source": { + "ip": "54.37.67.193" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "54.37.67.193" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 43269, + "result": "fail" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9r-UmcBTFzn_XoLMtPX", + "source": { + "@timestamp": "2018-11-27T02:27:29.242Z", + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13103", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "54.37.67.193" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "54.37.67.193", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "secondary": "54.37.67.193", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 43270, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9sAU2cBTFzn_XoLYwI6", + "source": { + "@timestamp": "2018-11-27T02:29:52.590Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "30802", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.118.65" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44276, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "secondary": "128.0.118.65", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNsAU2cBTFzn_XoLYwI6", + "source": { + "@timestamp": "2018-11-27T02:29:52.590Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "128.0.118.65", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44277, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "30802" + }, + "source": { + "ip": "128.0.118.65" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rdsAU2cBTFzn_XoLYwI6", + "source": { + "@timestamp": "2018-11-27T02:29:52.694Z", + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "30802", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.118.65" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "128.0.118.65" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "128.0.118.65", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44278, + "result": "fail" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0twMU2cBTFzn_XoL7xUF", + "source": { + "@timestamp": "2018-11-27T02:43:34.811Z", + "source": { + "ip": "167.99.54.4" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184466, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "167.99.54.4" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26446" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "09wMU2cBTFzn_XoL7xUF", + "source": { + "@timestamp": "2018-11-27T02:43:34.812Z", + "source": { + "ip": "167.99.54.4" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "167.99.54.4" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184467, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26446" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1NwMU2cBTFzn_XoL7xUF", + "source": { + "@timestamp": "2018-11-27T02:43:34.843Z", + "process": { + "pid": "26446", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "167.99.54.4" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "167.99.54.4", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "167.99.54.4", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184468, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3dwMU2cBTFzn_XoL9RW0", + "source": { + "@timestamp": "2018-11-27T02:43:36.522Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26448", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.120.174.127" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184469, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "37.120.174.127", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "3twMU2cBTFzn_XoL9RW0", + "source": { + "@timestamp": "2018-11-27T02:43:36.524Z", + "source": { + "ip": "37.120.174.127" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "37.120.174.127", + "type": "user-session" + } + }, + "sequence": 184470 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "26448", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "39wMU2cBTFzn_XoL9RW0", + "source": { + "@timestamp": "2018-11-27T02:43:36.635Z", + "auditd": { + "sequence": 184471, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "37.120.174.127", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "37.120.174.127", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26448", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "37.120.174.127" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1twNU2cBTFzn_XoL_CyZ", + "source": { + "@timestamp": "2018-11-27T02:44:43.822Z", + "source": { + "ip": "104.248.123.206" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "104.248.123.206", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + }, + "sequence": 142450, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "20137", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19wNU2cBTFzn_XoL_CyZ", + "source": { + "@timestamp": "2018-11-27T02:44:43.823Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20137" + }, + "source": { + "ip": "104.248.123.206" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "104.248.123.206", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142451, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "2NwNU2cBTFzn_XoL_CyZ", + "source": { + "@timestamp": "2018-11-27T02:44:43.854Z", + "process": { + "pid": "20137", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "104.248.123.206" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142452, + "result": "fail", + "session": "unset", + "data": { + "hostname": "104.248.123.206", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.248.123.206", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdwMU2cBTFzn_XoLxRBj", + "source": { + "@timestamp": "2018-11-27T02:43:22.108Z", + "source": { + "ip": "35.189.59.154" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "35.189.59.154", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184463, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26443", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stwMU2cBTFzn_XoLxRBj", + "source": { + "@timestamp": "2018-11-27T02:43:22.109Z", + "host": { + "name": "demo-stack-apache-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "26443", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "35.189.59.154" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "35.189.59.154", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184464, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "s9wMU2cBTFzn_XoLxRBj", + "source": { + "@timestamp": "2018-11-27T02:43:22.284Z", + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "35.189.59.154", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "35.189.59.154" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184465, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26443", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "35.189.59.154" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "S9wNU2cBTFzn_XoLwCiw", + "source": { + "@timestamp": "2018-11-27T02:44:28.486Z", + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "209.240.59.106" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186642, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "209.240.59.106" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32760", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TNwNU2cBTFzn_XoLwCiw", + "source": { + "@timestamp": "2018-11-27T02:44:28.487Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32760", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.240.59.106" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "209.240.59.106", + "type": "user-session" + } + }, + "sequence": 186643, + "result": "fail", + "session": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "TdwNU2cBTFzn_XoLwCiw", + "source": { + "@timestamp": "2018-11-27T02:44:28.539Z", + "process": { + "pid": "32760", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "209.240.59.106" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "209.240.59.106", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186644, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "209.240.59.106", + "terminal": "ssh" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FNwNU2cBTFzn_XoL4yrB", + "source": { + "@timestamp": "2018-11-27T02:44:37.463Z", + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "32763", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.254.123.131" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "51.254.123.131", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186645, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FdwNU2cBTFzn_XoL4yrB", + "source": { + "@timestamp": "2018-11-27T02:44:37.464Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "secondary": "51.254.123.131", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186646 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "32763", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.254.123.131" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FtwNU2cBTFzn_XoL4yrB", + "source": { + "@timestamp": "2018-11-27T02:44:37.575Z", + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "pid": "32763", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.254.123.131" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "51.254.123.131" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.254.123.131", + "type": "user-session" + } + }, + "sequence": 186647 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ldwMU2cBTFzn_XoLmw6z", + "source": { + "@timestamp": "2018-11-27T02:43:13.482Z", + "process": { + "pid": "1168", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "158.69.59.90" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "158.69.59.90" + } + }, + "sequence": 192646, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ltwMU2cBTFzn_XoLmw6z", + "source": { + "@timestamp": "2018-11-27T02:43:13.483Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "158.69.59.90" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "158.69.59.90" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192647 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1168", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "l9wMU2cBTFzn_XoLmw6z", + "source": { + "@timestamp": "2018-11-27T02:43:13.525Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "158.69.59.90", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "158.69.59.90", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192648 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1168", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "158.69.59.90" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZdwOU2cBTFzn_XoLGy-N", + "source": { + "@timestamp": "2018-11-27T02:44:51.746Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "71.174.75.11", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 186648, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + }, + "process": { + "pid": "32765", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "71.174.75.11" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ZtwOU2cBTFzn_XoLGy-N", + "source": { + "@timestamp": "2018-11-27T02:44:51.747Z", + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "71.174.75.11", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 186649, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "32765", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "71.174.75.11" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Z9wOU2cBTFzn_XoLGy-N", + "source": { + "@timestamp": "2018-11-27T02:44:51.787Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "32765", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "71.174.75.11" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "71.174.75.11", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "71.174.75.11", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186650, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "C9wPU2cBTFzn_XoLYUv1", + "source": { + "@timestamp": "2018-11-27T02:46:15.305Z", + "process": { + "pid": "13218", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.89.180.93" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "auditd": { + "sequence": 43288, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.89.180.93", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DNwPU2cBTFzn_XoLYUv1", + "source": { + "@timestamp": "2018-11-27T02:46:15.305Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13218" + }, + "source": { + "ip": "159.89.180.93" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43289, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.89.180.93", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "DdwPU2cBTFzn_XoLYUv1", + "source": { + "@timestamp": "2018-11-27T02:46:15.337Z", + "source": { + "ip": "159.89.180.93" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "159.89.180.93", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "159.89.180.93", + "type": "user-session" + } + }, + "sequence": 43290, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13218", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_twNU2cBTFzn_XoLjiIW", + "source": { + "@timestamp": "2018-11-27T02:44:15.532Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "217.141.88.34" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "217.141.88.34" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142449 + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "20129", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.141.88.34" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5NwRU2cBTFzn_XoLtH2C", + "source": { + "@timestamp": "2018-11-27T02:48:47.512Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142454, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "51.15.251.165" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "20159", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.15.251.165" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5dwRU2cBTFzn_XoLtH2C", + "source": { + "@timestamp": "2018-11-27T02:48:47.513Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20159" + }, + "source": { + "ip": "51.15.251.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "51.15.251.165", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 142455, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5twRU2cBTFzn_XoLtH2C", + "source": { + "@timestamp": "2018-11-27T02:48:47.619Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "20159", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "51.15.251.165" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "51.15.251.165", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.15.251.165", + "type": "user-session" + } + }, + "sequence": 142456, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdwQU2cBTFzn_XoLA1gL", + "source": { + "@timestamp": "2018-11-27T02:46:56.545Z", + "process": { + "pid": "26473", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "35.243.183.165" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "35.243.183.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184472, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "stwQU2cBTFzn_XoLA1gL", + "source": { + "@timestamp": "2018-11-27T02:46:56.546Z", + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "26473", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "35.243.183.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "35.243.183.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184473, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "s9wQU2cBTFzn_XoLA1gL", + "source": { + "@timestamp": "2018-11-27T02:46:56.586Z", + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26473" + }, + "source": { + "ip": "35.243.183.165" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "ssh", + "secondary": "35.243.183.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 184474, + "result": "fail", + "session": "unset", + "data": { + "hostname": "35.243.183.165", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mdwQU2cBTFzn_XoLL132", + "source": { + "@timestamp": "2018-11-27T02:47:08.044Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "219.65.51.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "219.65.51.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 192649, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "mtwQU2cBTFzn_XoLL132", + "source": { + "@timestamp": "2018-11-27T02:47:08.045Z", + "process": { + "pid": "1190", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "source": { + "ip": "219.65.51.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "219.65.51.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192650 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "m9wQU2cBTFzn_XoLL132", + "source": { + "@timestamp": "2018-11-27T02:47:08.272Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1190", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "219.65.51.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "219.65.51.21", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192651, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "219.65.51.21" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EdwQU2cBTFzn_XoLXmE8", + "source": { + "@timestamp": "2018-11-27T02:47:19.890Z", + "auditd": { + "sequence": 184475, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "178.128.119.59", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26475" + }, + "source": { + "ip": "178.128.119.59" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "EtwQU2cBTFzn_XoLXmE8", + "source": { + "@timestamp": "2018-11-27T02:47:19.892Z", + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "178.128.119.59", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + }, + "sequence": 184476, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.119.59" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E9wQU2cBTFzn_XoLXmE8", + "source": { + "@timestamp": "2018-11-27T02:47:20.084Z", + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26475", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.128.119.59" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184477, + "result": "fail", + "session": "unset", + "data": { + "hostname": "178.128.119.59", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "178.128.119.59", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LNwRU2cBTFzn_XoLM3Pb", + "source": { + "@timestamp": "2018-11-27T02:48:14.577Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "319" + }, + "source": { + "ip": "120.197.130.118" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "120.197.130.118", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186654, + "result": "fail" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LdwRU2cBTFzn_XoLM3Pb", + "source": { + "@timestamp": "2018-11-27T02:48:14.578Z", + "auditd": { + "sequence": 186655, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "120.197.130.118", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "319" + }, + "source": { + "ip": "120.197.130.118" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "LtwRU2cBTFzn_XoLM3Pb", + "source": { + "@timestamp": "2018-11-27T02:48:14.782Z", + "process": { + "pid": "319", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "120.197.130.118" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "120.197.130.118", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 186656, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "120.197.130.118" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gtwRU2cBTFzn_XoLA25t", + "source": { + "@timestamp": "2018-11-27T02:48:02.179Z", + "process": { + "pid": "26483", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.118.65" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "128.0.118.65" + } + }, + "sequence": 184478, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "g9wRU2cBTFzn_XoLA25t", + "source": { + "@timestamp": "2018-11-27T02:48:02.180Z", + "process": { + "pid": "26483", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "128.0.118.65" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 184479, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "128.0.118.65", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "hNwRU2cBTFzn_XoLA25t", + "source": { + "@timestamp": "2018-11-27T02:48:02.288Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "128.0.118.65" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "128.0.118.65", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 184480, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26483", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.0.118.65" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1dwQU2cBTFzn_XoLnGVv", + "source": { + "@timestamp": "2018-11-27T02:47:35.813Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "312", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "169.61.96.71" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "169.61.96.71", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186651 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "1twQU2cBTFzn_XoLnGVv", + "source": { + "@timestamp": "2018-11-27T02:47:35.815Z", + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "auditd": { + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "169.61.96.71", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 186652, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "312", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "169.61.96.71" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "19wQU2cBTFzn_XoLnGVv", + "source": { + "@timestamp": "2018-11-27T02:47:35.854Z", + "auditd": { + "data": { + "hostname": "169.61.96.71", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "169.61.96.71", + "type": "user-session" + } + }, + "sequence": 186653, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "312", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "169.61.96.71" + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ItwQU2cBTFzn_XoL2Gtu", + "source": { + "@timestamp": "2018-11-27T02:47:51.172Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20151" + }, + "source": { + "ip": "104.248.157.6" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "104.248.157.6", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "104.248.157.6", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142453, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "adwPU2cBTFzn_XoLb0w5", + "source": { + "@timestamp": "2018-11-27T02:46:18.698Z", + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "5.196.69.191" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "5.196.69.191", + "type": "user-session" + } + }, + "sequence": 44301, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "5.196.69.191" + } + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31309", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNwTU2cBTFzn_XoL0qyL", + "source": { + "@timestamp": "2018-11-27T02:51:06.273Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "217.182.170.81", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184484 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26505", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-apache-01" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "source": { + "ip": "217.182.170.81" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VdwTU2cBTFzn_XoL0qyL", + "source": { + "@timestamp": "2018-11-27T02:51:06.274Z", + "source": { + "ip": "217.182.170.81" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "217.182.170.81", + "type": "user-session" + } + }, + "sequence": 184485, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "26505" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VtwTU2cBTFzn_XoL0qyL", + "source": { + "@timestamp": "2018-11-27T02:51:06.381Z", + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "26505", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.182.170.81" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "ssh", + "hostname": "217.182.170.81", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "217.182.170.81", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184486, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "R9wSU2cBTFzn_XoLfY-L", + "source": { + "@timestamp": "2018-11-27T02:49:38.977Z", + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "188.123.122.128" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 186657, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "188.123.122.128", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "322" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SNwSU2cBTFzn_XoLfY-L", + "source": { + "@timestamp": "2018-11-27T02:49:38.978Z", + "auditd": { + "sequence": 186658, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "188.123.122.128", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-redis-01" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "322" + }, + "source": { + "ip": "188.123.122.128" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "SdwSU2cBTFzn_XoLfY-L", + "source": { + "@timestamp": "2018-11-27T02:49:39.106Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "322" + }, + "source": { + "ip": "188.123.122.128" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "188.123.122.128" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 186659, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "188.123.122.128", + "terminal": "ssh" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MNwUU2cBTFzn_XoL4MOf", + "source": { + "@timestamp": "2018-11-27T02:52:15.413Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "source": { + "ip": "37.187.0.20" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "37.187.0.20", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142457, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "20179", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MdwUU2cBTFzn_XoL4MOf", + "source": { + "@timestamp": "2018-11-27T02:52:15.414Z", + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "37.187.0.20" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142458, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(invalid user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "37.187.0.20" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "20179", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-haproxy-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "MtwUU2cBTFzn_XoL4MOf", + "source": { + "@timestamp": "2018-11-27T02:52:15.522Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "20179" + }, + "source": { + "ip": "37.187.0.20" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142459, + "result": "fail", + "session": "unset", + "data": { + "hostname": "37.187.0.20", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "37.187.0.20", + "type": "user-session" + } + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AdwTU2cBTFzn_XoLjKds", + "source": { + "@timestamp": "2018-11-27T02:50:48.323Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "26498", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "162.243.253.67" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184481, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "162.243.253.67", + "type": "user-session" + } + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AtwTU2cBTFzn_XoLjKds", + "source": { + "@timestamp": "2018-11-27T02:50:48.324Z", + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "sequence": 184482, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "162.243.253.67", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "26498", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "162.243.253.67" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "A9wTU2cBTFzn_XoLjKds", + "source": { + "@timestamp": "2018-11-27T02:50:48.355Z", + "source": { + "ip": "162.243.253.67" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "162.243.253.67", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "162.243.253.67", + "type": "user-session" + } + }, + "sequence": 184483, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "process": { + "pid": "26498", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KNwSU2cBTFzn_XoL6pgK", + "source": { + "@timestamp": "2018-11-27T02:50:06.744Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43291, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "52.189.217.7" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "13243", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "52.189.217.7" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KdwSU2cBTFzn_XoL6pgK", + "source": { + "@timestamp": "2018-11-27T02:50:06.748Z", + "process": { + "pid": "13243", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "52.189.217.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43292, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "52.189.217.7", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "KtwSU2cBTFzn_XoL6pgK", + "source": { + "@timestamp": "2018-11-27T02:50:06.964Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13243", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "52.189.217.7" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "52.189.217.7" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "52.189.217.7" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43293 + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "pdwUU2cBTFzn_XoLmrwL", + "source": { + "@timestamp": "2018-11-27T02:51:57.342Z", + "process": { + "pid": "13252", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.122.222.185" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "45.122.222.185" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43294, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ptwUU2cBTFzn_XoLmrwL", + "source": { + "@timestamp": "2018-11-27T02:51:57.342Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "45.122.222.185" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "45.122.222.185", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43295, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13252" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "p9wUU2cBTFzn_XoLmrwL", + "source": { + "@timestamp": "2018-11-27T02:51:57.590Z", + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13252", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "45.122.222.185" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43296, + "result": "fail", + "session": "unset", + "data": { + "hostname": "45.122.222.185", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "45.122.222.185", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + } + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0dwSU2cBTFzn_XoLxpVy", + "source": { + "@timestamp": "2018-11-27T02:49:57.640Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "331" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "source": { + "ip": "62.93.166.91" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "62.93.166.91", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186660, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0twSU2cBTFzn_XoLxpVy", + "source": { + "@timestamp": "2018-11-27T02:49:57.641Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "331", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "62.93.166.91" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + }, + "object": { + "primary": "sshd", + "secondary": "62.93.166.91", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186661, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "09wSU2cBTFzn_XoLxpVy", + "source": { + "@timestamp": "2018-11-27T02:49:57.762Z", + "process": { + "pid": "331", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "62.93.166.91" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "hostname": "62.93.166.91", + "op": "PAM:bad_ident", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "62.93.166.91" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 186662, + "result": "fail", + "session": "unset" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-redis-01", + "hostname": "demo-stack-redis-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-redis-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "UtwVU2cBTFzn_XoLNcpH", + "source": { + "@timestamp": "2018-11-27T02:52:37.083Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "86.104.220.26", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44305 + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31435" + }, + "source": { + "ip": "86.104.220.26" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "U9wVU2cBTFzn_XoLNcpH", + "source": { + "@timestamp": "2018-11-27T02:52:37.083Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44306, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "86.104.220.26", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "process": { + "pid": "31435", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.104.220.26" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "VNwVU2cBTFzn_XoLNcpH", + "source": { + "@timestamp": "2018-11-27T02:52:37.223Z", + "auditd": { + "session": "unset", + "data": { + "hostname": "86.104.220.26", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "86.104.220.26", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44307, + "result": "fail" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31435", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "86.104.220.26" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "qtwTU2cBTFzn_XoLRqAf", + "source": { + "@timestamp": "2018-11-27T02:50:30.321Z", + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31389", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.62.61.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.62.61.192", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44302, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "q9wTU2cBTFzn_XoLRqAf", + "source": { + "@timestamp": "2018-11-27T02:50:30.321Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "178.62.61.192" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44303, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "31389", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.62.61.192" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "rNwTU2cBTFzn_XoLRqAf", + "source": { + "@timestamp": "2018-11-27T02:50:30.421Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "31389" + }, + "source": { + "ip": "178.62.61.192" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "secondary": "178.62.61.192", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44304, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "178.62.61.192" + } + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cdwXU2cBTFzn_XoLm_-X", + "source": { + "@timestamp": "2018-11-27T02:55:14.346Z", + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "144.217.42.212", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43300, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13273", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.42.212" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ctwXU2cBTFzn_XoLm_-X", + "source": { + "@timestamp": "2018-11-27T02:55:14.346Z", + "process": { + "pid": "13273", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.42.212" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "144.217.42.212", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43301 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "c9wXU2cBTFzn_XoLm_-X", + "source": { + "@timestamp": "2018-11-27T02:55:14.386Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13273", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "144.217.42.212" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "144.217.42.212" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "144.217.42.212", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43302, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "ztwXU2cBTFzn_XoLn_8Q", + "source": { + "@timestamp": "2018-11-27T02:55:15.179Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "1238", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "78.193.8.166" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192661, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "78.193.8.166", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z9wXU2cBTFzn_XoLn_8Q", + "source": { + "@timestamp": "2018-11-27T02:55:15.185Z", + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1238", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "78.193.8.166" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192662, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "78.193.8.166", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "0NwXU2cBTFzn_XoLn_8Q", + "source": { + "@timestamp": "2018-11-27T02:55:15.302Z", + "source": { + "ip": "78.193.8.166" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "secondary": "78.193.8.166", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192663, + "result": "fail", + "session": "unset", + "data": { + "hostname": "78.193.8.166", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1238", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8dwWU2cBTFzn_XoLK980", + "source": { + "@timestamp": "2018-11-27T02:53:40.043Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1225", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "165.227.184.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192652, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "165.227.184.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "8twWU2cBTFzn_XoLK980", + "source": { + "@timestamp": "2018-11-27T02:53:40.044Z", + "process": { + "pid": "1225", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "165.227.184.21" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "165.227.184.21" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 192653 + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "89wWU2cBTFzn_XoLK980", + "source": { + "@timestamp": "2018-11-27T02:53:40.074Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "165.227.184.21" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "165.227.184.21", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192654, + "result": "fail" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1225", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "165.227.184.21" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BdwWU2cBTFzn_XoLL-A3", + "source": { + "@timestamp": "2018-11-27T02:53:41.070Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1227", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "206.81.24.64" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192655, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "206.81.24.64" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "BtwWU2cBTFzn_XoLL-A3", + "source": { + "@timestamp": "2018-11-27T02:53:41.071Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192656, + "result": "fail", + "session": "unset", + "data": { + "acct": "(invalid user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "206.81.24.64" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "1227", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "206.81.24.64" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "B9wWU2cBTFzn_XoLL-A3", + "source": { + "@timestamp": "2018-11-27T02:53:41.179Z", + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "206.81.24.64", + "terminal": "ssh" + }, + "summary": { + "object": { + "secondary": "206.81.24.64", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + } + }, + "sequence": 192657 + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "1227", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "206.81.24.64" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "s9wWU2cBTFzn_XoLnOnq", + "source": { + "@timestamp": "2018-11-27T02:54:09.152Z", + "auditd": { + "sequence": 142460, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "103.100.209.44", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "20193", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.100.209.44" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tNwWU2cBTFzn_XoLnOnq", + "source": { + "@timestamp": "2018-11-27T02:54:09.153Z", + "process": { + "pid": "20193", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.100.209.44" + }, + "host": { + "name": "demo-stack-haproxy-01" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "103.100.209.44", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 142461, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "tdwWU2cBTFzn_XoLnOnq", + "source": { + "@timestamp": "2018-11-27T02:54:09.326Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "auditd": { + "sequence": 142462, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "103.100.209.44" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "103.100.209.44" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "20193", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "103.100.209.44" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wNwWU2cBTFzn_XoLUOIL", + "source": { + "@timestamp": "2018-11-27T02:53:49.472Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "81.66.86.4", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 192658, + "result": "fail" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1229", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.66.86.4" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wdwWU2cBTFzn_XoLUOIL", + "source": { + "@timestamp": "2018-11-27T02:53:49.473Z", + "auditd": { + "sequence": 192659, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "type": "user-session", + "primary": "sshd", + "secondary": "81.66.86.4" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1229", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.66.86.4" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "wtwWU2cBTFzn_XoLUOIL", + "source": { + "@timestamp": "2018-11-27T02:53:49.586Z", + "process": { + "pid": "1229", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "81.66.86.4" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192660, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "81.66.86.4" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "81.66.86.4", + "type": "user-session" + } + } + }, + "beat": { + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "r9wWU2cBTFzn_XoLJ98E", + "source": { + "@timestamp": "2018-11-27T02:53:38.966Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "terminal": "sshd", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "122.15.119.41", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43297 + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "13265", + "exe": "/usr/sbin/sshd" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "source": { + "ip": "122.15.119.41" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sNwWU2cBTFzn_XoLJ98E", + "source": { + "@timestamp": "2018-11-27T02:53:38.966Z", + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "122.15.119.41", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43298, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "auid": "unset", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13265" + }, + "source": { + "ip": "122.15.119.41" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdwWU2cBTFzn_XoLJ98E", + "source": { + "@timestamp": "2018-11-27T02:53:39.222Z", + "process": { + "pid": "13265", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "122.15.119.41" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "122.15.119.41", + "type": "user-session", + "primary": "ssh" + } + }, + "sequence": 43299, + "result": "fail", + "session": "unset", + "data": { + "hostname": "122.15.119.41", + "terminal": "ssh", + "op": "PAM:bad_ident" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4dwVU2cBTFzn_XoLtdX6", + "source": { + "@timestamp": "2018-11-27T02:53:10.025Z", + "process": { + "pid": "31449", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.168.217" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "159.203.168.217", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44308, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4twVU2cBTFzn_XoLtdX6", + "source": { + "@timestamp": "2018-11-27T02:53:10.029Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "159.203.168.217", + "type": "user-session", + "primary": "sshd" + } + }, + "sequence": 44309, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + } + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31449", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "source": { + "ip": "159.203.168.217" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "49wVU2cBTFzn_XoLtdX6", + "source": { + "@timestamp": "2018-11-27T02:53:10.057Z", + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31449", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "159.203.168.217" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44310, + "result": "fail", + "session": "unset", + "data": { + "terminal": "ssh", + "op": "PAM:bad_ident", + "hostname": "159.203.168.217" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "159.203.168.217", + "type": "user-session" + } + } + }, + "beat": { + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1", + "name": "demo-stack-es-01" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_err", + "action": "error" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YNwVU2cBTFzn_XoLyNec", + "source": { + "@timestamp": "2018-11-27T02:53:14.798Z", + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31453", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.45.156" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.45.156", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44311, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YdwVU2cBTFzn_XoLyNec", + "source": { + "@timestamp": "2018-11-27T02:53:14.798Z", + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "178.33.45.156", + "type": "user-session" + } + }, + "sequence": 44312 + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "pid": "31453", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.45.156" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "YtwVU2cBTFzn_XoLyNec", + "source": { + "@timestamp": "2018-11-27T02:53:14.906Z", + "process": { + "pid": "31453", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "178.33.45.156" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 44313, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "178.33.45.156", + "terminal": "ssh" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "secondary": "178.33.45.156", + "type": "user-session", + "primary": "ssh" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zd0YU2cBTFzn_XoLHgkA", + "source": { + "@timestamp": "2018-11-27T02:55:47.730Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "46.148.192.41", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44315, + "result": "fail" + }, + "host": { + "name": "demo-stack-es-01" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "pid": "31503", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.192.41" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "zt0YU2cBTFzn_XoLHgkA", + "source": { + "@timestamp": "2018-11-27T02:55:47.730Z", + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31503", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.192.41" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "46.148.192.41", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44316, + "result": "fail" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "z90YU2cBTFzn_XoLHgkA", + "source": { + "@timestamp": "2018-11-27T02:55:47.874Z", + "auditd": { + "sequence": 44317, + "result": "fail", + "session": "unset", + "data": { + "hostname": "46.148.192.41", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "46.148.192.41", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "31503", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "46.148.192.41" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "gdwVU2cBTFzn_XoL5dmB", + "source": { + "@timestamp": "2018-11-27T02:53:22.174Z", + "source": { + "ip": "149.202.54.124" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "149.202.54.124", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "149.202.54.124", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 44314, + "result": "fail" + }, + "beat": { + "name": "demo-stack-es-01", + "hostname": "demo-stack-es-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-es-01" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "31457", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "E90aU2cBTFzn_XoLNjl5", + "source": { + "@timestamp": "2018-11-27T02:58:05.071Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + }, + "object": { + "secondary": "217.8.49.195", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 192673, + "result": "fail", + "session": "unset" + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1272", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.8.49.195" + }, + "beat": { + "version": "7.0.0-alpha1", + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "FN0aU2cBTFzn_XoLNjl5", + "source": { + "@timestamp": "2018-11-27T02:58:05.072Z", + "process": { + "pid": "1272", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.8.49.195" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192674, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "secondary": "217.8.49.195", + "type": "user-session", + "primary": "sshd" + } + } + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Fd0aU2cBTFzn_XoLNjl5", + "source": { + "@timestamp": "2018-11-27T02:58:05.216Z", + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "217.8.49.195", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "type": "user-session", + "primary": "ssh", + "secondary": "217.8.49.195" + } + }, + "sequence": 192675, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1272", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "217.8.49.195" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5d0aU2cBTFzn_XoLw0Ro", + "source": { + "@timestamp": "2018-11-27T02:58:41.148Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13636" + }, + "source": { + "ip": "197.53.106.203" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(unknown user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "secondary": "197.53.106.203", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43308, + "result": "fail", + "session": "unset" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5t0aU2cBTFzn_XoLw0Ro", + "source": { + "@timestamp": "2018-11-27T02:58:41.148Z", + "process": { + "pid": "13636", + "exe": "/usr/sbin/sshd" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "source": { + "ip": "197.53.106.203" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43309, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "197.53.106.203", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "590aU2cBTFzn_XoLw0Ro", + "source": { + "@timestamp": "2018-11-27T02:58:41.768Z", + "source": { + "ip": "197.53.106.203" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "hostname": "197.53.106.203", + "terminal": "ssh" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "197.53.106.203", + "type": "user-session" + } + }, + "sequence": 43310 + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "process": { + "pid": "13636", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "cN0bU2cBTFzn_XoLDkvX", + "source": { + "@timestamp": "2018-11-27T02:59:00.461Z", + "host": { + "name": "demo-stack-nginx-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "1275", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "71.112.175.120" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 192676, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "71.112.175.120" + }, + "summary": { + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "71.112.175.120", + "type": "user-session" + } + } + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "4t0bU2cBTFzn_XoLaVLG", + "source": { + "@timestamp": "2018-11-27T02:59:23.735Z", + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "198.100.156.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43311, + "result": "fail", + "session": "unset" + }, + "event": { + "module": "auditd", + "category": "user-login", + "type": "user_login", + "action": "logged-in" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13643", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "198.100.156.214" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "490bU2cBTFzn_XoLaVLG", + "source": { + "@timestamp": "2018-11-27T02:59:23.735Z", + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "terminal": "sshd", + "acct": "(invalid user)" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + }, + "object": { + "primary": "sshd", + "secondary": "198.100.156.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43312, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13643" + }, + "source": { + "ip": "198.100.156.214" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "5N0bU2cBTFzn_XoLaVLG", + "source": { + "@timestamp": "2018-11-27T02:59:23.779Z", + "auditd": { + "session": "unset", + "data": { + "terminal": "ssh", + "hostname": "198.100.156.214", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "secondary": "root", + "primary": "unset" + }, + "object": { + "primary": "ssh", + "secondary": "198.100.156.214", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43313, + "result": "fail" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13643", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "198.100.156.214" + }, + "network": { + "direction": "incoming" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xd0bU2cBTFzn_XoLclNQ", + "source": { + "@timestamp": "2018-11-27T02:59:25.924Z", + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "auid": "unset", + "name_map": { + "uid": "root" + }, + "uid": "0" + }, + "process": { + "pid": "13645", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.110.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "data": { + "terminal": "sshd", + "acct": "(unknown user)", + "op": "login" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "91.121.110.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + } + }, + "sequence": 43314, + "result": "fail", + "session": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xt0bU2cBTFzn_XoLclNQ", + "source": { + "@timestamp": "2018-11-27T02:59:25.924Z", + "source": { + "ip": "91.121.110.50" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43315, + "result": "fail", + "session": "unset", + "data": { + "terminal": "sshd", + "op": "login", + "acct": "(invalid user)" + }, + "summary": { + "object": { + "secondary": "91.121.110.50", + "type": "user-session", + "primary": "sshd" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "(invalid user)" + } + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13645" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "X90bU2cBTFzn_XoLclNQ", + "source": { + "@timestamp": "2018-11-27T02:59:26.032Z", + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "action": "error", + "module": "auditd", + "category": "user-login", + "type": "user_err" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "13645", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "91.121.110.50" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43316, + "result": "fail", + "session": "unset", + "data": { + "op": "PAM:bad_ident", + "terminal": "ssh", + "hostname": "91.121.110.50" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "91.121.110.50", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_t0bU2cBTFzn_XoLelQ5", + "source": { + "@timestamp": "2018-11-27T02:59:27.948Z", + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 43317, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.38.82.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(unknown user)", + "primary": "unset" + } + } + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "process": { + "pid": "13647", + "exe": "/usr/sbin/sshd" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "_90bU2cBTFzn_XoLelQ5", + "source": { + "@timestamp": "2018-11-27T02:59:27.948Z", + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13647" + }, + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "summary": { + "object": { + "primary": "sshd", + "secondary": "51.38.82.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "secondary": "(invalid user)", + "primary": "unset" + } + }, + "sequence": 43318, + "result": "fail", + "session": "unset", + "data": { + "op": "login", + "acct": "(invalid user)", + "terminal": "sshd" + } + }, + "event": { + "action": "logged-in", + "module": "auditd", + "category": "user-login", + "type": "user_login" + }, + "user": { + "uid": "0", + "name_map": { + "uid": "root" + }, + "auid": "unset" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "AN0bU2cBTFzn_XoLelU5", + "source": { + "@timestamp": "2018-11-27T02:59:28.060Z", + "auditd": { + "data": { + "hostname": "51.38.82.60", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.38.82.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43319, + "result": "fail", + "session": "unset" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13647" + }, + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Xa2ipWkBCQofM5eXEgsv", + "source": { + "@timestamp": "2018-11-27T02:59:28.060Z", + "auditd": { + "data": { + "hostname": "51.38.82.60", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "root" + }, + "object": { + "primary": "ssh", + "secondary": "51.38.82.60", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 43319, + "result": "fail", + "session": "unset" + }, + "destination" : { + "ip" : "0.0.0.0", + "port" : "22" + }, + "event": { + "type": "user_err", + "action": "error", + "module": "auditd", + "category": "user-login" + }, + "user" : { + "group" : { + "name" : "root", + "id" : "0" + }, + "id" : "0", + "name" : "root" + }, + "process": { + "exe": "/usr/sbin/sshd", + "pid": "13647" + }, + "source": { + "ip": "51.38.82.60" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-mysql-01", + "hostname": "demo-stack-mysql-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-mysql-01" + } + } + } +} diff --git a/x-pack/test/functional/es_archives/auditbeat/kpi_hosts/data.json b/x-pack/test/functional/es_archives/auditbeat/kpi_hosts/data.json new file mode 100644 index 0000000000000..470e38e62ba51 --- /dev/null +++ b/x-pack/test/functional/es_archives/auditbeat/kpi_hosts/data.json @@ -0,0 +1,194 @@ +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "Rs93UmcBTFzn_XoLWT6M", + "source": { + "@timestamp": "2018-11-27T00:00:11.544Z", + "process": { + "pid": "31964", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "128.199.87.213" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-nginx-01", + "hostname": "demo-stack-nginx-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-nginx-01" + }, + "auditd": { + "session": "unset", + "data": { + "hostname": "128.199.87.213", + "terminal": "ssh", + "op": "PAM:bad_ident" + }, + "summary": { + "object": { + "primary": "ssh", + "secondary": "128.199.87.213", + "type": "user-session" + }, + "how": "/usr/sbin/sshd", + "actor": { + "primary": "unset", + "secondary": "root" + } + }, + "sequence": 192383, + "result": "fail" + }, + "event": { + "category": "user-login", + "type": "user_err", + "action": "error", + "module": "auditd" + }, + "user": { + "name_map": { + "uid": "root" + }, + "auid": "unset", + "uid": "0" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "6Nr4UmcBTFzn_XoL4l6d", + "source": { + "@timestamp": "2018-11-27T02:21:40.914Z", + "host": { + "name": "demo-stack-haproxy-01" + }, + "user": { + "auid": "unset", + "uid": "0", + "name_map": { + "uid": "root" + } + }, + "process": { + "pid": "20001", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "82.62.233.163" + }, + "network": { + "direction": "incoming" + }, + "auditd": { + "sequence": 142431, + "result": "fail", + "session": "unset", + "data": { + "acct": "(unknown user)", + "op": "login", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "82.62.233.163", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + } + }, + "event": { + "category": "user-login", + "type": "user_login", + "action": "logged-in", + "module": "auditd" + }, + "beat": { + "name": "demo-stack-haproxy-01", + "hostname": "demo-stack-haproxy-01", + "version": "7.0.0-alpha1" + } + } + } +} + +{ + "type": "doc", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "type": "doc", + "id": "sdwQU2cBTFzn_XoLA1gL", + "source": { + "@timestamp": "2018-11-27T02:46:56.545Z", + "process": { + "pid": "26473", + "exe": "/usr/sbin/sshd" + }, + "source": { + "ip": "35.243.183.165" + }, + "network": { + "direction": "incoming" + }, + "beat": { + "name": "demo-stack-apache-01", + "hostname": "demo-stack-apache-01", + "version": "7.0.0-alpha1" + }, + "host": { + "name": "demo-stack-apache-01" + }, + "auditd": { + "session": "unset", + "data": { + "op": "login", + "acct": "(unknown user)", + "terminal": "sshd" + }, + "summary": { + "actor": { + "primary": "unset", + "secondary": "(unknown user)" + }, + "object": { + "primary": "sshd", + "secondary": "35.243.183.165", + "type": "user-session" + }, + "how": "/usr/sbin/sshd" + }, + "sequence": 184472, + "result": "fail" + }, + "event": { + "type": "user_login", + "action": "logged-in", + "module": "auditd", + "category": "user-login" + }, + "user": { + "name_map": { + "uid": "root" + }, + "uid": "0", + "auid": "unset" + } + } + } +} diff --git a/x-pack/test/functional/es_archives/auditbeat/kpi_hosts/mappings.json b/x-pack/test/functional/es_archives/auditbeat/kpi_hosts/mappings.json new file mode 100644 index 0000000000000..96aec998fcdcd --- /dev/null +++ b/x-pack/test/functional/es_archives/auditbeat/kpi_hosts/mappings.json @@ -0,0 +1,1903 @@ +{ + "type": "index", + "value": { + "index": "auditbeat-7.0.0-alpha1-2018.11.27", + "settings": { + "index": { + "codec": "best_compression", + "mapping": { + "total_fields": { + "limit": "10000" + } + }, + "refresh_interval": "5s", + "number_of_shards": "1", + "query": { + "default_field": [ + "beat.name", + "beat.hostname", + "beat.timezone", + "beat.version", + "tags", + "error.message", + "error.type", + "meta.cloud.provider", + "meta.cloud.instance_id", + "meta.cloud.instance_name", + "meta.cloud.machine_type", + "meta.cloud.availability_zone", + "meta.cloud.project_id", + "meta.cloud.region", + "docker.container.id", + "docker.container.image", + "docker.container.name", + "host.name", + "host.id", + "host.architecture", + "host.os.platform", + "host.os.version", + "host.os.family", + "host.mac", + "kubernetes.pod.name", + "kubernetes.pod.uid", + "kubernetes.namespace", + "kubernetes.node.name", + "kubernetes.container.name", + "kubernetes.container.image", + "event.module", + "event.action", + "file.path", + "raw", + "file.target_path", + "file.type", + "file.device", + "file.inode", + "file.uid", + "file.owner", + "file.gid", + "file.group", + "file.mode", + "file.origin", + "raw", + "file.selinux.user", + "file.selinux.role", + "file.selinux.domain", + "file.selinux.level", + "event.category", + "event.type", + "user.auid", + "user.uid", + "user.euid", + "user.fsuid", + "user.suid", + "user.gid", + "user.egid", + "user.sgid", + "user.fsgid", + "user.name_map.auid", + "user.name_map.uid", + "user.name_map.euid", + "user.name_map.fsuid", + "user.name_map.suid", + "user.name_map.gid", + "user.name_map.egid", + "user.name_map.sgid", + "user.name_map.fsgid", + "user.selinux.user", + "user.selinux.role", + "user.selinux.domain", + "user.selinux.level", + "user.selinux.category", + "process.pid", + "process.ppid", + "process.name", + "process.title", + "process.exe", + "process.cwd", + "process.args", + "source.port", + "source.hostname", + "source.path", + "destination.port", + "destination.hostname", + "destination.path", + "network.direction", + "auditd.session", + "auditd.result", + "auditd.summary.actor.primary", + "auditd.summary.actor.secondary", + "auditd.summary.object.type", + "auditd.summary.object.primary", + "auditd.summary.object.secondary", + "auditd.summary.how", + "auditd.paths.inode", + "auditd.paths.dev", + "auditd.paths.obj_user", + "auditd.paths.obj_role", + "auditd.paths.obj_domain", + "auditd.paths.obj_level", + "auditd.paths.objtype", + "auditd.paths.ouid", + "auditd.paths.rdev", + "auditd.paths.nametype", + "auditd.paths.ogid", + "auditd.paths.item", + "auditd.paths.mode", + "auditd.paths.name", + "auditd.data.action", + "auditd.data.minor", + "auditd.data.acct", + "auditd.data.addr", + "auditd.data.cipher", + "auditd.data.id", + "auditd.data.entries", + "auditd.data.kind", + "auditd.data.ksize", + "auditd.data.spid", + "auditd.data.arch", + "auditd.data.argc", + "auditd.data.major", + "auditd.data.unit", + "auditd.data.table", + "auditd.data.terminal", + "auditd.data.grantors", + "auditd.data.direction", + "auditd.data.op", + "auditd.data.tty", + "auditd.data.syscall", + "auditd.data.data", + "auditd.data.family", + "auditd.data.mac", + "auditd.data.pfs", + "auditd.data.items", + "auditd.data.a0", + "auditd.data.a1", + "auditd.data.a2", + "auditd.data.a3", + "auditd.data.hostname", + "auditd.data.lport", + "auditd.data.rport", + "auditd.data.exit", + "auditd.data.fp", + "auditd.data.laddr", + "auditd.data.sport", + "auditd.data.capability", + "auditd.data.nargs", + "auditd.data.new-enabled", + "auditd.data.audit_backlog_limit", + "auditd.data.dir", + "auditd.data.cap_pe", + "auditd.data.model", + "auditd.data.new_pp", + "auditd.data.old-enabled", + "auditd.data.oauid", + "auditd.data.old", + "auditd.data.banners", + "auditd.data.feature", + "auditd.data.vm-ctx", + "auditd.data.opid", + "auditd.data.seperms", + "auditd.data.seresult", + "auditd.data.new-rng", + "auditd.data.old-net", + "auditd.data.sigev_signo", + "auditd.data.ino", + "auditd.data.old_enforcing", + "auditd.data.old-vcpu", + "auditd.data.range", + "auditd.data.res", + "auditd.data.added", + "auditd.data.fam", + "auditd.data.nlnk-pid", + "auditd.data.subj", + "auditd.data.a[0-3]", + "auditd.data.cgroup", + "auditd.data.kernel", + "auditd.data.ocomm", + "auditd.data.new-net", + "auditd.data.permissive", + "auditd.data.class", + "auditd.data.compat", + "auditd.data.fi", + "auditd.data.changed", + "auditd.data.msg", + "auditd.data.dport", + "auditd.data.new-seuser", + "auditd.data.invalid_context", + "auditd.data.dmac", + "auditd.data.ipx-net", + "auditd.data.iuid", + "auditd.data.macproto", + "auditd.data.obj", + "auditd.data.ipid", + "auditd.data.new-fs", + "auditd.data.vm-pid", + "auditd.data.cap_pi", + "auditd.data.old-auid", + "auditd.data.oses", + "auditd.data.fd", + "auditd.data.igid", + "auditd.data.new-disk", + "auditd.data.parent", + "auditd.data.len", + "auditd.data.oflag", + "auditd.data.uuid", + "auditd.data.code", + "auditd.data.nlnk-grp", + "auditd.data.cap_fp", + "auditd.data.new-mem", + "auditd.data.seperm", + "auditd.data.enforcing", + "auditd.data.new-chardev", + "auditd.data.old-rng", + "auditd.data.outif", + "auditd.data.cmd", + "auditd.data.hook", + "auditd.data.new-level", + "auditd.data.sauid", + "auditd.data.sig", + "auditd.data.audit_backlog_wait_time", + "auditd.data.printer", + "auditd.data.old-mem", + "auditd.data.perm", + "auditd.data.old_pi", + "auditd.data.state", + "auditd.data.format", + "auditd.data.new_gid", + "auditd.data.tcontext", + "auditd.data.maj", + "auditd.data.watch", + "auditd.data.device", + "auditd.data.grp", + "auditd.data.bool", + "auditd.data.icmp_type", + "auditd.data.new_lock", + "auditd.data.old_prom", + "auditd.data.acl", + "auditd.data.ip", + "auditd.data.new_pi", + "auditd.data.default-context", + "auditd.data.inode_gid", + "auditd.data.new-log_passwd", + "auditd.data.new_pe", + "auditd.data.selected-context", + "auditd.data.cap_fver", + "auditd.data.file", + "auditd.data.net", + "auditd.data.virt", + "auditd.data.cap_pp", + "auditd.data.old-range", + "auditd.data.resrc", + "auditd.data.new-range", + "auditd.data.obj_gid", + "auditd.data.proto", + "auditd.data.old-disk", + "auditd.data.audit_failure", + "auditd.data.inif", + "auditd.data.vm", + "auditd.data.flags", + "auditd.data.nlnk-fam", + "auditd.data.old-fs", + "auditd.data.old-ses", + "auditd.data.seqno", + "auditd.data.fver", + "auditd.data.qbytes", + "auditd.data.seuser", + "auditd.data.cap_fe", + "auditd.data.new-vcpu", + "auditd.data.old-level", + "auditd.data.old_pp", + "auditd.data.daddr", + "auditd.data.old-role", + "auditd.data.ioctlcmd", + "auditd.data.smac", + "auditd.data.apparmor", + "auditd.data.fe", + "auditd.data.perm_mask", + "auditd.data.ses", + "auditd.data.cap_fi", + "auditd.data.obj_uid", + "auditd.data.reason", + "auditd.data.list", + "auditd.data.old_lock", + "auditd.data.bus", + "auditd.data.old_pe", + "auditd.data.new-role", + "auditd.data.prom", + "auditd.data.uri", + "auditd.data.audit_enabled", + "auditd.data.old-log_passwd", + "auditd.data.old-seuser", + "auditd.data.per", + "auditd.data.scontext", + "auditd.data.tclass", + "auditd.data.ver", + "auditd.data.new", + "auditd.data.val", + "auditd.data.img-ctx", + "auditd.data.old-chardev", + "auditd.data.old_val", + "auditd.data.success", + "auditd.data.inode_uid", + "auditd.data.removed", + "auditd.data.socket.port", + "auditd.data.socket.saddr", + "auditd.data.socket.addr", + "auditd.data.socket.family", + "auditd.data.socket.path", + "auditd.messages", + "auditd.warnings", + "geoip.continent_name", + "geoip.city_name", + "geoip.region_name", + "geoip.country_iso_code", + "hash.blake2b_256", + "hash.blake2b_384", + "hash.blake2b_512", + "hash.md5", + "hash.sha1", + "hash.sha224", + "hash.sha256", + "hash.sha384", + "hash.sha3_224", + "hash.sha3_256", + "hash.sha3_384", + "hash.sha3_512", + "hash.sha512", + "hash.sha512_224", + "hash.sha512_256", + "hash.xxh64", + "fields.*" + ] + }, + "number_of_replicas": "0" + } + }, + "mappings": { + "_meta": { + "version": "7.0.0-alpha1" + }, + "dynamic_templates": [ + { + "fields": { + "path_match": "fields.*", + "match_mapping_type": "string", + "mapping": { + "type": "keyword" + } + } + }, + { + "docker.container.labels": { + "path_match": "docker.container.labels.*", + "match_mapping_type": "string", + "mapping": { + "type": "keyword" + } + } + }, + { + "strings_as_keyword": { + "match_mapping_type": "string", + "mapping": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + ], + "date_detection": false, + "properties": { + "@timestamp": { + "type": "date" + }, + "auditd": { + "properties": { + "data": { + "properties": { + "a0": { + "type": "keyword", + "ignore_above": 1024 + }, + "a1": { + "type": "keyword", + "ignore_above": 1024 + }, + "a2": { + "type": "keyword", + "ignore_above": 1024 + }, + "a3": { + "type": "keyword", + "ignore_above": 1024 + }, + "a[0-3]": { + "type": "keyword", + "ignore_above": 1024 + }, + "acct": { + "type": "keyword", + "ignore_above": 1024 + }, + "acl": { + "type": "keyword", + "ignore_above": 1024 + }, + "action": { + "type": "keyword", + "ignore_above": 1024 + }, + "added": { + "type": "keyword", + "ignore_above": 1024 + }, + "addr": { + "type": "keyword", + "ignore_above": 1024 + }, + "apparmor": { + "type": "keyword", + "ignore_above": 1024 + }, + "arch": { + "type": "keyword", + "ignore_above": 1024 + }, + "argc": { + "type": "keyword", + "ignore_above": 1024 + }, + "audit_backlog_limit": { + "type": "keyword", + "ignore_above": 1024 + }, + "audit_backlog_wait_time": { + "type": "keyword", + "ignore_above": 1024 + }, + "audit_enabled": { + "type": "keyword", + "ignore_above": 1024 + }, + "audit_failure": { + "type": "keyword", + "ignore_above": 1024 + }, + "banners": { + "type": "keyword", + "ignore_above": 1024 + }, + "bool": { + "type": "keyword", + "ignore_above": 1024 + }, + "bus": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_fe": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_fi": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_fp": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_fver": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_pe": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_pi": { + "type": "keyword", + "ignore_above": 1024 + }, + "cap_pp": { + "type": "keyword", + "ignore_above": 1024 + }, + "capability": { + "type": "keyword", + "ignore_above": 1024 + }, + "cgroup": { + "type": "keyword", + "ignore_above": 1024 + }, + "changed": { + "type": "keyword", + "ignore_above": 1024 + }, + "cipher": { + "type": "keyword", + "ignore_above": 1024 + }, + "class": { + "type": "keyword", + "ignore_above": 1024 + }, + "cmd": { + "type": "keyword", + "ignore_above": 1024 + }, + "code": { + "type": "keyword", + "ignore_above": 1024 + }, + "compat": { + "type": "keyword", + "ignore_above": 1024 + }, + "daddr": { + "type": "keyword", + "ignore_above": 1024 + }, + "data": { + "type": "keyword", + "ignore_above": 1024 + }, + "default-context": { + "type": "keyword", + "ignore_above": 1024 + }, + "device": { + "type": "keyword", + "ignore_above": 1024 + }, + "dir": { + "type": "keyword", + "ignore_above": 1024 + }, + "direction": { + "type": "keyword", + "ignore_above": 1024 + }, + "dmac": { + "type": "keyword", + "ignore_above": 1024 + }, + "dport": { + "type": "keyword", + "ignore_above": 1024 + }, + "enforcing": { + "type": "keyword", + "ignore_above": 1024 + }, + "entries": { + "type": "keyword", + "ignore_above": 1024 + }, + "exit": { + "type": "keyword", + "ignore_above": 1024 + }, + "fam": { + "type": "keyword", + "ignore_above": 1024 + }, + "family": { + "type": "keyword", + "ignore_above": 1024 + }, + "fd": { + "type": "keyword", + "ignore_above": 1024 + }, + "fe": { + "type": "keyword", + "ignore_above": 1024 + }, + "feature": { + "type": "keyword", + "ignore_above": 1024 + }, + "fi": { + "type": "keyword", + "ignore_above": 1024 + }, + "file": { + "type": "keyword", + "ignore_above": 1024 + }, + "flags": { + "type": "keyword", + "ignore_above": 1024 + }, + "format": { + "type": "keyword", + "ignore_above": 1024 + }, + "fp": { + "type": "keyword", + "ignore_above": 1024 + }, + "fver": { + "type": "keyword", + "ignore_above": 1024 + }, + "grantors": { + "type": "keyword", + "ignore_above": 1024 + }, + "grp": { + "type": "keyword", + "ignore_above": 1024 + }, + "hook": { + "type": "keyword", + "ignore_above": 1024 + }, + "hostname": { + "type": "keyword", + "ignore_above": 1024 + }, + "icmp_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "igid": { + "type": "keyword", + "ignore_above": 1024 + }, + "img-ctx": { + "type": "keyword", + "ignore_above": 1024 + }, + "inif": { + "type": "keyword", + "ignore_above": 1024 + }, + "ino": { + "type": "keyword", + "ignore_above": 1024 + }, + "inode_gid": { + "type": "keyword", + "ignore_above": 1024 + }, + "inode_uid": { + "type": "keyword", + "ignore_above": 1024 + }, + "invalid_context": { + "type": "keyword", + "ignore_above": 1024 + }, + "ioctlcmd": { + "type": "keyword", + "ignore_above": 1024 + }, + "ip": { + "type": "keyword", + "ignore_above": 1024 + }, + "ipid": { + "type": "keyword", + "ignore_above": 1024 + }, + "ipx-net": { + "type": "keyword", + "ignore_above": 1024 + }, + "items": { + "type": "keyword", + "ignore_above": 1024 + }, + "iuid": { + "type": "keyword", + "ignore_above": 1024 + }, + "kernel": { + "type": "keyword", + "ignore_above": 1024 + }, + "kind": { + "type": "keyword", + "ignore_above": 1024 + }, + "ksize": { + "type": "keyword", + "ignore_above": 1024 + }, + "laddr": { + "type": "keyword", + "ignore_above": 1024 + }, + "len": { + "type": "keyword", + "ignore_above": 1024 + }, + "list": { + "type": "keyword", + "ignore_above": 1024 + }, + "lport": { + "type": "keyword", + "ignore_above": 1024 + }, + "mac": { + "type": "keyword", + "ignore_above": 1024 + }, + "macproto": { + "type": "keyword", + "ignore_above": 1024 + }, + "maj": { + "type": "keyword", + "ignore_above": 1024 + }, + "major": { + "type": "keyword", + "ignore_above": 1024 + }, + "minor": { + "type": "keyword", + "ignore_above": 1024 + }, + "model": { + "type": "keyword", + "ignore_above": 1024 + }, + "msg": { + "type": "keyword", + "ignore_above": 1024 + }, + "nargs": { + "type": "keyword", + "ignore_above": 1024 + }, + "net": { + "type": "keyword", + "ignore_above": 1024 + }, + "new": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-chardev": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-disk": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-enabled": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-fs": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-level": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-log_passwd": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-mem": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-net": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-range": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-rng": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-role": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-seuser": { + "type": "keyword", + "ignore_above": 1024 + }, + "new-vcpu": { + "type": "keyword", + "ignore_above": 1024 + }, + "new_gid": { + "type": "keyword", + "ignore_above": 1024 + }, + "new_lock": { + "type": "keyword", + "ignore_above": 1024 + }, + "new_pe": { + "type": "keyword", + "ignore_above": 1024 + }, + "new_pi": { + "type": "keyword", + "ignore_above": 1024 + }, + "new_pp": { + "type": "keyword", + "ignore_above": 1024 + }, + "nlnk-fam": { + "type": "keyword", + "ignore_above": 1024 + }, + "nlnk-grp": { + "type": "keyword", + "ignore_above": 1024 + }, + "nlnk-pid": { + "type": "keyword", + "ignore_above": 1024 + }, + "oauid": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj_gid": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj_uid": { + "type": "keyword", + "ignore_above": 1024 + }, + "ocomm": { + "type": "keyword", + "ignore_above": 1024 + }, + "oflag": { + "type": "keyword", + "ignore_above": 1024 + }, + "old": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-auid": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-chardev": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-disk": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-enabled": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-fs": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-level": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-log_passwd": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-mem": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-net": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-range": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-rng": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-role": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-ses": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-seuser": { + "type": "keyword", + "ignore_above": 1024 + }, + "old-vcpu": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_enforcing": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_lock": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_pe": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_pi": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_pp": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_prom": { + "type": "keyword", + "ignore_above": 1024 + }, + "old_val": { + "type": "keyword", + "ignore_above": 1024 + }, + "op": { + "type": "keyword", + "ignore_above": 1024 + }, + "opid": { + "type": "keyword", + "ignore_above": 1024 + }, + "oses": { + "type": "keyword", + "ignore_above": 1024 + }, + "outif": { + "type": "keyword", + "ignore_above": 1024 + }, + "parent": { + "type": "keyword", + "ignore_above": 1024 + }, + "per": { + "type": "keyword", + "ignore_above": 1024 + }, + "perm": { + "type": "keyword", + "ignore_above": 1024 + }, + "perm_mask": { + "type": "keyword", + "ignore_above": 1024 + }, + "permissive": { + "type": "keyword", + "ignore_above": 1024 + }, + "pfs": { + "type": "keyword", + "ignore_above": 1024 + }, + "printer": { + "type": "keyword", + "ignore_above": 1024 + }, + "prom": { + "type": "keyword", + "ignore_above": 1024 + }, + "proto": { + "type": "keyword", + "ignore_above": 1024 + }, + "qbytes": { + "type": "keyword", + "ignore_above": 1024 + }, + "range": { + "type": "keyword", + "ignore_above": 1024 + }, + "reason": { + "type": "keyword", + "ignore_above": 1024 + }, + "removed": { + "type": "keyword", + "ignore_above": 1024 + }, + "res": { + "type": "keyword", + "ignore_above": 1024 + }, + "resrc": { + "type": "keyword", + "ignore_above": 1024 + }, + "rport": { + "type": "keyword", + "ignore_above": 1024 + }, + "sauid": { + "type": "keyword", + "ignore_above": 1024 + }, + "scontext": { + "type": "keyword", + "ignore_above": 1024 + }, + "selected-context": { + "type": "keyword", + "ignore_above": 1024 + }, + "seperm": { + "type": "keyword", + "ignore_above": 1024 + }, + "seperms": { + "type": "keyword", + "ignore_above": 1024 + }, + "seqno": { + "type": "keyword", + "ignore_above": 1024 + }, + "seresult": { + "type": "keyword", + "ignore_above": 1024 + }, + "ses": { + "type": "keyword", + "ignore_above": 1024 + }, + "seuser": { + "type": "keyword", + "ignore_above": 1024 + }, + "sig": { + "type": "keyword", + "ignore_above": 1024 + }, + "sigev_signo": { + "type": "keyword", + "ignore_above": 1024 + }, + "smac": { + "type": "keyword", + "ignore_above": 1024 + }, + "socket": { + "properties": { + "addr": { + "type": "keyword", + "ignore_above": 1024 + }, + "family": { + "type": "keyword", + "ignore_above": 1024 + }, + "path": { + "type": "keyword", + "ignore_above": 1024 + }, + "port": { + "type": "keyword", + "ignore_above": 1024 + }, + "saddr": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "spid": { + "type": "keyword", + "ignore_above": 1024 + }, + "sport": { + "type": "keyword", + "ignore_above": 1024 + }, + "state": { + "type": "keyword", + "ignore_above": 1024 + }, + "subj": { + "type": "keyword", + "ignore_above": 1024 + }, + "success": { + "type": "keyword", + "ignore_above": 1024 + }, + "syscall": { + "type": "keyword", + "ignore_above": 1024 + }, + "table": { + "type": "keyword", + "ignore_above": 1024 + }, + "tclass": { + "type": "keyword", + "ignore_above": 1024 + }, + "tcontext": { + "type": "keyword", + "ignore_above": 1024 + }, + "terminal": { + "type": "keyword", + "ignore_above": 1024 + }, + "tty": { + "type": "keyword", + "ignore_above": 1024 + }, + "unit": { + "type": "keyword", + "ignore_above": 1024 + }, + "uri": { + "type": "keyword", + "ignore_above": 1024 + }, + "uuid": { + "type": "keyword", + "ignore_above": 1024 + }, + "val": { + "type": "keyword", + "ignore_above": 1024 + }, + "ver": { + "type": "keyword", + "ignore_above": 1024 + }, + "virt": { + "type": "keyword", + "ignore_above": 1024 + }, + "vm": { + "type": "keyword", + "ignore_above": 1024 + }, + "vm-ctx": { + "type": "keyword", + "ignore_above": 1024 + }, + "vm-pid": { + "type": "keyword", + "ignore_above": 1024 + }, + "watch": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "messages": { + "type": "text", + "norms": false + }, + "paths": { + "properties": { + "dev": { + "type": "keyword", + "ignore_above": 1024 + }, + "inode": { + "type": "keyword", + "ignore_above": 1024 + }, + "item": { + "type": "keyword", + "ignore_above": 1024 + }, + "mode": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "nametype": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj_domain": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj_level": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj_role": { + "type": "keyword", + "ignore_above": 1024 + }, + "obj_user": { + "type": "keyword", + "ignore_above": 1024 + }, + "objtype": { + "type": "keyword", + "ignore_above": 1024 + }, + "ogid": { + "type": "keyword", + "ignore_above": 1024 + }, + "ouid": { + "type": "keyword", + "ignore_above": 1024 + }, + "rdev": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "result": { + "type": "keyword", + "ignore_above": 1024 + }, + "sequence": { + "type": "long" + }, + "session": { + "type": "keyword", + "ignore_above": 1024 + }, + "summary": { + "properties": { + "actor": { + "properties": { + "primary": { + "type": "keyword", + "ignore_above": 1024 + }, + "secondary": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "how": { + "type": "keyword", + "ignore_above": 1024 + }, + "object": { + "properties": { + "primary": { + "type": "keyword", + "ignore_above": 1024 + }, + "secondary": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "warnings": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "beat": { + "properties": { + "hostname": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "timezone": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "destination": { + "properties": { + "hostname": { + "type": "keyword", + "ignore_above": 1024 + }, + "ip": { + "type": "ip" + }, + "path": { + "type": "keyword", + "ignore_above": 1024 + }, + "port": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "docker": { + "properties": { + "container": { + "properties": { + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "image": { + "type": "keyword", + "ignore_above": 1024 + }, + "labels": { + "type": "object" + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "error": { + "properties": { + "code": { + "type": "long" + }, + "message": { + "type": "text", + "norms": false + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword", + "ignore_above": 1024 + }, + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "module": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "fields": { + "type": "object" + }, + "file": { + "properties": { + "ctime": { + "type": "date" + }, + "device": { + "type": "keyword", + "ignore_above": 1024 + }, + "gid": { + "type": "keyword", + "ignore_above": 1024 + }, + "group": { + "type": "keyword", + "ignore_above": 1024 + }, + "inode": { + "type": "keyword", + "ignore_above": 1024 + }, + "mode": { + "type": "keyword", + "ignore_above": 1024 + }, + "mtime": { + "type": "date" + }, + "origin": { + "type": "text", + "norms": false, + "fields": { + "raw": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "owner": { + "type": "keyword", + "ignore_above": 1024 + }, + "path": { + "type": "text", + "norms": false, + "fields": { + "raw": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "selinux": { + "properties": { + "domain": { + "type": "keyword", + "ignore_above": 1024 + }, + "level": { + "type": "keyword", + "ignore_above": 1024 + }, + "role": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "setgid": { + "type": "boolean" + }, + "setuid": { + "type": "boolean" + }, + "size": { + "type": "long" + }, + "target_path": { + "type": "keyword", + "ignore_above": 1024 + }, + "type": { + "type": "keyword", + "ignore_above": 1024 + }, + "uid": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "geoip": { + "properties": { + "city_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "continent_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "country_iso_code": { + "type": "keyword", + "ignore_above": 1024 + }, + "location": { + "type": "geo_point" + }, + "region_name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "hash": { + "properties": { + "blake2b_256": { + "type": "keyword", + "ignore_above": 1024 + }, + "blake2b_384": { + "type": "keyword", + "ignore_above": 1024 + }, + "blake2b_512": { + "type": "keyword", + "ignore_above": 1024 + }, + "md5": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha1": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha224": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha256": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha384": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha3_224": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha3_256": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha3_384": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha3_512": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha512": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha512_224": { + "type": "keyword", + "ignore_above": 1024 + }, + "sha512_256": { + "type": "keyword", + "ignore_above": 1024 + }, + "xxh64": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "host": { + "properties": { + "architecture": { + "type": "keyword", + "ignore_above": 1024 + }, + "id": { + "type": "keyword", + "ignore_above": 1024 + }, + "ip": { + "type": "ip" + }, + "mac": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "os": { + "properties": { + "family": { + "type": "keyword", + "ignore_above": 1024 + }, + "platform": { + "type": "keyword", + "ignore_above": 1024 + }, + "version": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "kubernetes": { + "properties": { + "annotations": { + "type": "object" + }, + "container": { + "properties": { + "image": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "labels": { + "type": "object" + }, + "namespace": { + "type": "keyword", + "ignore_above": 1024 + }, + "node": { + "properties": { + "name": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "pod": { + "properties": { + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "uid": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "meta": { + "properties": { + "cloud": { + "properties": { + "availability_zone": { + "type": "keyword", + "ignore_above": 1024 + }, + "instance_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "instance_name": { + "type": "keyword", + "ignore_above": 1024 + }, + "machine_type": { + "type": "keyword", + "ignore_above": 1024 + }, + "project_id": { + "type": "keyword", + "ignore_above": 1024 + }, + "provider": { + "type": "keyword", + "ignore_above": 1024 + }, + "region": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "network": { + "properties": { + "direction": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "process": { + "properties": { + "args": { + "type": "keyword", + "ignore_above": 1024 + }, + "cwd": { + "type": "keyword", + "ignore_above": 1024 + }, + "exe": { + "type": "keyword", + "ignore_above": 1024 + }, + "name": { + "type": "keyword", + "ignore_above": 1024 + }, + "pid": { + "type": "keyword", + "ignore_above": 1024 + }, + "ppid": { + "type": "keyword", + "ignore_above": 1024 + }, + "title": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "source": { + "properties": { + "hostname": { + "type": "keyword", + "ignore_above": 1024 + }, + "ip": { + "type": "ip" + }, + "path": { + "type": "keyword", + "ignore_above": 1024 + }, + "port": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "tags": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "properties": { + "auid": { + "type": "keyword", + "ignore_above": 1024 + }, + "egid": { + "type": "keyword", + "ignore_above": 1024 + }, + "euid": { + "type": "keyword", + "ignore_above": 1024 + }, + "fsgid": { + "type": "keyword", + "ignore_above": 1024 + }, + "fsuid": { + "type": "keyword", + "ignore_above": 1024 + }, + "gid": { + "type": "keyword", + "ignore_above": 1024 + }, + "name_map": { + "properties": { + "auid": { + "type": "keyword", + "ignore_above": 1024 + }, + "egid": { + "type": "keyword", + "ignore_above": 1024 + }, + "euid": { + "type": "keyword", + "ignore_above": 1024 + }, + "fsgid": { + "type": "keyword", + "ignore_above": 1024 + }, + "fsuid": { + "type": "keyword", + "ignore_above": 1024 + }, + "gid": { + "type": "keyword", + "ignore_above": 1024 + }, + "sgid": { + "type": "keyword", + "ignore_above": 1024 + }, + "suid": { + "type": "keyword", + "ignore_above": 1024 + }, + "uid": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "selinux": { + "properties": { + "category": { + "type": "keyword", + "ignore_above": 1024 + }, + "domain": { + "type": "keyword", + "ignore_above": 1024 + }, + "level": { + "type": "keyword", + "ignore_above": 1024 + }, + "role": { + "type": "keyword", + "ignore_above": 1024 + }, + "user": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "sgid": { + "type": "keyword", + "ignore_above": 1024 + }, + "suid": { + "type": "keyword", + "ignore_above": 1024 + }, + "uid": { + "type": "keyword", + "ignore_above": 1024 + } + } + } + } + }, + "aliases": {} + } +} \ No newline at end of file diff --git a/x-pack/test/functional/es_archives/filebeat/kpi_hosts/data.json b/x-pack/test/functional/es_archives/filebeat/kpi_hosts/data.json new file mode 100644 index 0000000000000..847158e901338 --- /dev/null +++ b/x-pack/test/functional/es_archives/filebeat/kpi_hosts/data.json @@ -0,0 +1,133 @@ +{ + "type": "doc", + "value": { + "id": "Lw4l02gBqd-n62Sw_lxm", + "index": "filebeat-7.0.0-iot-2019.06", + "source": { + "@timestamp": "2019-02-09T16:45:06.331Z", + "@version": "1", + "agent": { + "ephemeral_id": "97412477-f94f-4f25-a21f-4103798683db", + "hostname": "raspberrypi", + "id": "4d3ea604-27e5-4ec7-ab64-44f82285d776", + "type": "filebeat", + "version": "7.0.0" + }, + "destination": { + "domain": "s3-iad-2.cf.dash.row.aiv-cdn.net", + "ip": "10.100.7.196", + "port": 57854 + }, + "ecs": { + "version": "1.0.0-beta2" + }, + "event": { + "dataset": "suricata.eve", + "end": "2019-02-09T16:45:06.331Z", + "kind": "event", + "module": "suricata", + "type": "fileinfo" + }, + "file": { + "path": "/dm/2$XTMWANo0Q2RZKlH-95UoAahZrOg~/8cdf/ad98/e000/4b0d-8f72-8faf9aa1a35a/c3d5b471-4e36-45e0-8ca7-d789366f3b31_audio_13.mp4", + "size": 48277 + }, + "fileset": { + "name": "eve" + }, + "flow": { + "locality": "public" + }, + "host": { + "architecture": "armv7l", + "containerized": false, + "hostname": "raspberrypi", + "id": "b19a781f683541a7a25ee345133aa399", + "name": "raspberrypi", + "os": { + "codename": "stretch", + "family": "", + "kernel": "4.14.50-v7+", + "name": "Raspbian GNU/Linux", + "platform": "raspbian", + "version": "9 (stretch)" + } + }, + "http": { + "request": { + "method": "get" + }, + "response": { + "body": { + "bytes": 48277 + }, + "status_code": 206 + } + }, + "input": { + "type": "log" + }, + "labels": { + "pipeline": "filebeat-7.0.0-suricata-eve-pipeline" + }, + "log": { + "file": { + "path": "/var/log/suricata/eve.json" + }, + "offset": 1734115622 + }, + "network": { + "name": "iot", + "protocol": "http", + "transport": "tcp" + }, + "service": { + "type": "suricata" + }, + "source": { + "as": { + "num": 16509, + "org": "Amazon.com, Inc." + }, + "domain": "server-54-239-220-184.ewr50.r.cloudfront.net", + "geo": { + "city_name": "Seattle", + "continent_name": "North America", + "country_iso_code": "US", + "location": { + "lat": 47.6103, + "lon": -122.3341 + }, + "region_iso_code": "US-WA", + "region_name": "Washington" + }, + "ip": "54.239.220.184", + "port": 80 + }, + "suricata": { + "eve": { + "fileinfo": { + "state": "CLOSED", + "stored": false, + "tx_id": 102 + }, + "flow_id": 311011499414922, + "http": { + "http_content_type": "video/mp4", + "protocol": "HTTP/1.1" + }, + "in_iface": "eth0" + } + }, + "tags": [ + "suricata" + ], + "url": { + "domain": "s3-iad-2.cf.dash.row.aiv-cdn.net", + "original": "/dm/2$XTMWANo0Q2RZKlH-95UoAahZrOg~/8cdf/ad98/e000/4b0d-8f72-8faf9aa1a35a/c3d5b471-4e36-45e0-8ca7-d789366f3b31_audio_13.mp4", + "path": "/dm/2$XTMWANo0Q2RZKlH-95UoAahZrOg~/8cdf/ad98/e000/4b0d-8f72-8faf9aa1a35a/c3d5b471-4e36-45e0-8ca7-d789366f3b31_audio_13.mp4" + } + }, + "type": "_doc" + } +} diff --git a/x-pack/test/functional/es_archives/filebeat/kpi_hosts/mappings.json b/x-pack/test/functional/es_archives/filebeat/kpi_hosts/mappings.json new file mode 100644 index 0000000000000..1059fa49582f8 --- /dev/null +++ b/x-pack/test/functional/es_archives/filebeat/kpi_hosts/mappings.json @@ -0,0 +1,5940 @@ +{ + "type": "index", + "value": { + "aliases": { + }, + "index": "filebeat-7.0.0-iot-2019.06", + "mappings": { + "_meta": { + "beat": "filebeat", + "version": "7.0.0" + }, + "date_detection": false, + "dynamic_templates": [ + { + "container.labels": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "container.labels.*" + } + }, + { + "fields": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "fields.*" + } + }, + { + "docker.container.labels": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "docker.container.labels.*" + } + }, + { + "kibana.log.meta": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "kibana.log.meta.*" + } + }, + { + "strings_as_keyword": { + "mapping": { + "ignore_above": 1024, + "type": "keyword" + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "@timestamp": { + "type": "date" + }, + "@version": { + "ignore_above": 1024, + "type": "keyword" + }, + "agent": { + "properties": { + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "apache": { + "properties": { + "access": { + "properties": { + "ssl": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "error": { + "properties": { + "module": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "apache2": { + "properties": { + "access": { + "properties": { + "geoip": { + "type": "object" + }, + "user_agent": { + "type": "object" + } + } + }, + "error": { + "type": "object" + } + } + }, + "auditd": { + "properties": { + "log": { + "properties": { + "a0": { + "ignore_above": 1024, + "type": "keyword" + }, + "addr": { + "type": "ip" + }, + "geoip": { + "type": "object" + }, + "item": { + "ignore_above": 1024, + "type": "keyword" + }, + "items": { + "ignore_above": 1024, + "type": "keyword" + }, + "laddr": { + "type": "ip" + }, + "lport": { + "type": "long" + }, + "new_auid": { + "ignore_above": 1024, + "type": "keyword" + }, + "new_ses": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_auid": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_ses": { + "ignore_above": 1024, + "type": "keyword" + }, + "rport": { + "type": "long" + }, + "sequence": { + "type": "long" + }, + "tty": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "certificate": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cisco": { + "properties": { + "access_list": { + "ignore_above": 1024, + "type": "keyword" + }, + "log": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "client": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + } + } + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "container": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "runtime": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "destination": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "num": { + "type": "long" + }, + "org": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "domain_top1m_rank": { + "type": "long" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + } + } + }, + "docker": { + "properties": { + "container": { + "properties": { + "labels": { + "type": "object" + } + } + } + } + }, + "ecs": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "elasticsearch": { + "properties": { + "audit": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "indices": { + "ignore_above": 1024, + "type": "keyword" + }, + "layer": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "realm": { + "ignore_above": 1024, + "type": "keyword" + }, + "request": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "params": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "realm": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "cluster": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "component": { + "ignore_above": 1024, + "type": "keyword" + }, + "deprecation": { + "type": "object" + }, + "gc": { + "properties": { + "heap": { + "properties": { + "size_kb": { + "type": "long" + }, + "used_kb": { + "type": "long" + } + } + }, + "jvm_runtime_sec": { + "type": "float" + }, + "old_gen": { + "properties": { + "size_kb": { + "type": "long" + }, + "used_kb": { + "type": "long" + } + } + }, + "phase": { + "properties": { + "class_unload_time_sec": { + "type": "float" + }, + "cpu_time": { + "properties": { + "real_sec": { + "type": "float" + }, + "sys_sec": { + "type": "float" + }, + "user_sec": { + "type": "float" + } + } + }, + "duration_sec": { + "type": "float" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "parallel_rescan_time_sec": { + "type": "float" + }, + "scrub_string_table_time_sec": { + "type": "float" + }, + "scrub_symbol_table_time_sec": { + "type": "float" + }, + "weak_refs_processing_time_sec": { + "type": "float" + } + } + }, + "stopping_threads_time_sec": { + "type": "float" + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + }, + "threads_total_stop_time_sec": { + "type": "float" + }, + "young_gen": { + "properties": { + "size_kb": { + "type": "long" + }, + "used_kb": { + "type": "long" + } + } + } + } + }, + "index": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "node": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "gc": { + "properties": { + "collection_duration": { + "properties": { + "ms": { + "type": "float" + } + } + }, + "observation_duration": { + "properties": { + "ms": { + "type": "float" + } + } + }, + "overhead_seq": { + "type": "long" + }, + "young": { + "properties": { + "one": { + "type": "long" + }, + "two": { + "type": "long" + } + } + } + } + }, + "stacktrace": { + "ignore_above": 1024, + "index": false, + "type": "keyword" + } + } + }, + "shard": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "slowlog": { + "properties": { + "extra_source": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "routing": { + "ignore_above": 1024, + "type": "keyword" + }, + "search_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_query": { + "ignore_above": 1024, + "type": "keyword" + }, + "stats": { + "ignore_above": 1024, + "type": "keyword" + }, + "took": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_hits": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_shards": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "types": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "error": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "norms": false, + "type": "text" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "long" + }, + "end": { + "type": "date" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "doc_values": false, + "ignore_above": 1024, + "index": false, + "type": "keyword" + }, + "outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "fields": { + "type": "object" + }, + "file": { + "properties": { + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "target_path": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "fileset": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "flow": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "haproxy": { + "properties": { + "backend_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "backend_queue": { + "type": "long" + }, + "bind_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes_read": { + "type": "long" + }, + "client": { + "type": "object" + }, + "connection_wait_time_ms": { + "type": "long" + }, + "connections": { + "properties": { + "active": { + "type": "long" + }, + "backend": { + "type": "long" + }, + "frontend": { + "type": "long" + }, + "retries": { + "type": "long" + }, + "server": { + "type": "long" + } + } + }, + "destination": { + "type": "object" + }, + "error_message": { + "norms": false, + "type": "text" + }, + "frontend_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "type": "object" + }, + "http": { + "properties": { + "request": { + "properties": { + "captured_cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "captured_headers": { + "ignore_above": 1024, + "type": "keyword" + }, + "raw_request_line": { + "ignore_above": 1024, + "type": "keyword" + }, + "time_wait_ms": { + "type": "long" + }, + "time_wait_without_data_ms": { + "type": "long" + } + } + }, + "response": { + "properties": { + "captured_cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "captured_headers": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "server_queue": { + "type": "long" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp": { + "properties": { + "connection_waiting_time_ms": { + "type": "long" + } + } + }, + "termination_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "time_backend_connect": { + "type": "long" + }, + "time_queue": { + "type": "long" + }, + "total_waiting_time_ms": { + "type": "long" + } + } + }, + "hash": { + "properties": { + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "host": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "containerized": { + "type": "boolean" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "codename": { + "ignore_above": 1024, + "type": "keyword" + }, + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "http": { + "properties": { + "request": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bytes": { + "type": "long" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bytes": { + "type": "long" + }, + "status_code": { + "type": "long" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "icinga": { + "properties": { + "debug": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "main": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "startup": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "icmp": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "iis": { + "properties": { + "access": { + "properties": { + "cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "type": "object" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "site_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sub_status": { + "type": "long" + }, + "user_agent": { + "type": "object" + }, + "win32_status": { + "type": "long" + } + } + }, + "error": { + "properties": { + "geoip": { + "type": "object" + }, + "queue_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason_phrase": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "input": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "iptables": { + "properties": { + "ether_type": { + "type": "long" + }, + "flow_label": { + "type": "long" + }, + "fragment_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment_offset": { + "type": "long" + }, + "icmp": { + "properties": { + "code": { + "type": "long" + }, + "id": { + "type": "long" + }, + "parameter": { + "type": "long" + }, + "redirect": { + "type": "ip" + }, + "seq": { + "type": "long" + }, + "type": { + "type": "long" + } + } + }, + "id": { + "type": "long" + }, + "incomplete_bytes": { + "type": "long" + }, + "input_device": { + "ignore_above": 1024, + "type": "keyword" + }, + "length": { + "type": "long" + }, + "output_device": { + "ignore_above": 1024, + "type": "keyword" + }, + "precedence_bits": { + "type": "short" + }, + "tcp": { + "properties": { + "ack": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "reserved_bits": { + "type": "short" + }, + "seq": { + "type": "long" + }, + "window": { + "type": "long" + } + } + }, + "tos": { + "type": "long" + }, + "ttl": { + "type": "long" + }, + "ubiquiti": { + "properties": { + "input_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "output_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_set": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "udp": { + "properties": { + "length": { + "type": "long" + } + } + } + } + }, + "kafka": { + "properties": { + "log": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "component": { + "ignore_above": 1024, + "type": "keyword" + }, + "trace": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "norms": false, + "type": "text" + } + } + } + } + } + } + }, + "kibana": { + "properties": { + "log": { + "properties": { + "meta": { + "type": "object" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "kubernetes": { + "properties": { + "annotations": { + "type": "object" + }, + "container": { + "properties": { + "image": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "namespace": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pod": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "labels": { + "properties": { + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "pipeline": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "offset": { + "type": "long" + }, + "original": { + "doc_values": false, + "ignore_above": 1024, + "index": false, + "type": "keyword" + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "logstash": { + "properties": { + "log": { + "properties": { + "log_event": { + "type": "object" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "thread": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "slowlog": { + "properties": { + "event": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "plugin_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "plugin_params": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "plugin_params_object": { + "type": "object" + }, + "plugin_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "thread": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "took_in_millis": { + "type": "long" + } + } + } + } + }, + "message": { + "norms": false, + "type": "text" + }, + "mongodb": { + "properties": { + "log": { + "properties": { + "component": { + "ignore_above": 1024, + "type": "keyword" + }, + "context": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "mysql": { + "properties": { + "error": { + "type": "object" + }, + "slowlog": { + "properties": { + "bytes_sent": { + "type": "long" + }, + "current_user": { + "ignore_above": 1024, + "type": "keyword" + }, + "filesort": { + "type": "boolean" + }, + "filesort_on_disk": { + "type": "boolean" + }, + "full_join": { + "type": "boolean" + }, + "full_scan": { + "type": "boolean" + }, + "innodb": { + "properties": { + "io_r_bytes": { + "type": "long" + }, + "io_r_ops": { + "type": "long" + }, + "io_r_wait": { + "properties": { + "sec": { + "type": "long" + } + } + }, + "pages_distinct": { + "type": "long" + }, + "queue_wait": { + "properties": { + "sec": { + "type": "long" + } + } + }, + "rec_lock_wait": { + "properties": { + "sec": { + "type": "long" + } + } + }, + "trx_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "killed": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_errno": { + "ignore_above": 1024, + "type": "keyword" + }, + "lock_time": { + "properties": { + "sec": { + "type": "float" + } + } + }, + "log_slow_rate_limit": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_slow_rate_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "merge_passes": { + "type": "long" + }, + "priority_queue": { + "type": "boolean" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "query_cache_hit": { + "type": "boolean" + }, + "rows_affected": { + "type": "long" + }, + "rows_examined": { + "type": "long" + }, + "rows_sent": { + "type": "long" + }, + "schema": { + "ignore_above": 1024, + "type": "keyword" + }, + "tmp_disk_tables": { + "type": "long" + }, + "tmp_table": { + "type": "boolean" + }, + "tmp_table_on_disk": { + "type": "boolean" + }, + "tmp_table_sizes": { + "type": "long" + }, + "tmp_tables": { + "type": "long" + } + } + }, + "thread_id": { + "type": "long" + } + } + }, + "netflow": { + "properties": { + "absolute_error": { + "type": "double" + }, + "address_pool_high_threshold": { + "type": "long" + }, + "address_pool_low_threshold": { + "type": "long" + }, + "address_port_mapping_high_threshold": { + "type": "long" + }, + "address_port_mapping_low_threshold": { + "type": "long" + }, + "address_port_mapping_per_user_high_threshold": { + "type": "long" + }, + "anonymization_flags": { + "type": "long" + }, + "anonymization_technique": { + "type": "long" + }, + "application_category_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_group_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_id": { + "type": "short" + }, + "application_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_sub_category_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "bgp_destination_as_number": { + "type": "long" + }, + "bgp_next_adjacent_as_number": { + "type": "long" + }, + "bgp_next_hop_ipv4_address": { + "type": "ip" + }, + "bgp_next_hop_ipv6_address": { + "type": "ip" + }, + "bgp_prev_adjacent_as_number": { + "type": "long" + }, + "bgp_source_as_number": { + "type": "long" + }, + "bgp_validity_state": { + "type": "short" + }, + "biflow_direction": { + "type": "short" + }, + "class_id": { + "type": "short" + }, + "class_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification_engine_id": { + "type": "short" + }, + "collection_time_milliseconds": { + "type": "date" + }, + "collector_certificate": { + "type": "short" + }, + "collector_ipv4_address": { + "type": "ip" + }, + "collector_ipv6_address": { + "type": "ip" + }, + "collector_transport_port": { + "type": "long" + }, + "common_properties_id": { + "type": "long" + }, + "confidence_level": { + "type": "double" + }, + "connection_sum_duration_seconds": { + "type": "long" + }, + "connection_transaction_id": { + "type": "long" + }, + "data_link_frame_section": { + "type": "short" + }, + "data_link_frame_size": { + "type": "long" + }, + "data_link_frame_type": { + "type": "long" + }, + "data_records_reliability": { + "type": "boolean" + }, + "delta_flow_count": { + "type": "long" + }, + "destination_ipv4_address": { + "type": "ip" + }, + "destination_ipv4_prefix": { + "type": "ip" + }, + "destination_ipv4_prefix_length": { + "type": "short" + }, + "destination_ipv6_address": { + "type": "ip" + }, + "destination_ipv6_prefix": { + "type": "ip" + }, + "destination_ipv6_prefix_length": { + "type": "short" + }, + "destination_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_transport_port": { + "type": "long" + }, + "digest_hash_value": { + "type": "long" + }, + "distinct_count_of_destinatio_nipa_ddress": { + "type": "long" + }, + "distinct_count_of_destination_ipv4_address": { + "type": "long" + }, + "distinct_count_of_destination_ipv6_address": { + "type": "long" + }, + "distinct_count_of_sourc_eipa_ddress": { + "type": "long" + }, + "distinct_count_of_source_ipv4_address": { + "type": "long" + }, + "distinct_count_of_source_ipv6_address": { + "type": "long" + }, + "dot1q_customer_dei": { + "type": "boolean" + }, + "dot1q_customer_destination_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "dot1q_customer_priority": { + "type": "short" + }, + "dot1q_customer_source_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "dot1q_customer_vlan_id": { + "type": "long" + }, + "dot1q_dei": { + "type": "boolean" + }, + "dot1q_priority": { + "type": "short" + }, + "dot1q_service_instance_id": { + "type": "long" + }, + "dot1q_service_instance_priority": { + "type": "short" + }, + "dot1q_service_instance_tag": { + "type": "short" + }, + "dot1q_vlan_id": { + "type": "long" + }, + "dropped_layer2_octet_delta_count": { + "type": "long" + }, + "dropped_layer2_octet_total_count": { + "type": "long" + }, + "dropped_octet_delta_count": { + "type": "long" + }, + "dropped_octet_total_count": { + "type": "long" + }, + "dropped_packet_delta_count": { + "type": "long" + }, + "dropped_packet_total_count": { + "type": "long" + }, + "dst_traffic_index": { + "type": "long" + }, + "egress_broadcast_packet_total_count": { + "type": "long" + }, + "egress_interface": { + "type": "long" + }, + "egress_interface_type": { + "type": "long" + }, + "egress_physical_interface": { + "type": "long" + }, + "egress_unicast_packet_total_count": { + "type": "long" + }, + "egress_vrfid": { + "type": "long" + }, + "encrypted_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "engine_id": { + "type": "short" + }, + "engine_type": { + "type": "short" + }, + "ethernet_header_length": { + "type": "short" + }, + "ethernet_payload_length": { + "type": "long" + }, + "ethernet_total_length": { + "type": "long" + }, + "ethernet_type": { + "type": "long" + }, + "export_interface": { + "type": "long" + }, + "export_protocol_version": { + "type": "short" + }, + "export_sctp_stream_id": { + "type": "long" + }, + "export_transport_protocol": { + "type": "short" + }, + "exported_flow_record_total_count": { + "type": "long" + }, + "exported_message_total_count": { + "type": "long" + }, + "exported_octet_total_count": { + "type": "long" + }, + "exporter": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_id": { + "type": "long" + }, + "timestamp": { + "type": "date" + }, + "uptime_millis": { + "type": "long" + }, + "version": { + "type": "long" + } + } + }, + "exporter_certificate": { + "type": "short" + }, + "exporter_ipv4_address": { + "type": "ip" + }, + "exporter_ipv6_address": { + "type": "ip" + }, + "exporter_transport_port": { + "type": "long" + }, + "exporting_process_id": { + "type": "long" + }, + "external_address_realm": { + "type": "short" + }, + "firewall_event": { + "type": "short" + }, + "flags_and_sampler_id": { + "type": "long" + }, + "flow_active_timeout": { + "type": "long" + }, + "flow_direction": { + "type": "short" + }, + "flow_duration_microseconds": { + "type": "long" + }, + "flow_duration_milliseconds": { + "type": "long" + }, + "flow_end_delta_microseconds": { + "type": "long" + }, + "flow_end_microseconds": { + "type": "date" + }, + "flow_end_milliseconds": { + "type": "date" + }, + "flow_end_nanoseconds": { + "type": "date" + }, + "flow_end_reason": { + "type": "short" + }, + "flow_end_seconds": { + "type": "date" + }, + "flow_end_sys_up_time": { + "type": "long" + }, + "flow_id": { + "type": "long" + }, + "flow_idle_timeout": { + "type": "long" + }, + "flow_key_indicator": { + "type": "long" + }, + "flow_label_ipv6": { + "type": "long" + }, + "flow_sampling_time_interval": { + "type": "long" + }, + "flow_sampling_time_spacing": { + "type": "long" + }, + "flow_selected_flow_delta_count": { + "type": "long" + }, + "flow_selected_octet_delta_count": { + "type": "long" + }, + "flow_selected_packet_delta_count": { + "type": "long" + }, + "flow_selector_algorithm": { + "type": "long" + }, + "flow_start_delta_microseconds": { + "type": "long" + }, + "flow_start_microseconds": { + "type": "date" + }, + "flow_start_milliseconds": { + "type": "date" + }, + "flow_start_nanoseconds": { + "type": "date" + }, + "flow_start_seconds": { + "type": "date" + }, + "flow_start_sys_up_time": { + "type": "long" + }, + "forwarding_status": { + "type": "short" + }, + "fragment_flags": { + "type": "short" + }, + "fragment_identification": { + "type": "long" + }, + "fragment_offset": { + "type": "long" + }, + "global_address_mapping_high_threshold": { + "type": "long" + }, + "gre_key": { + "type": "long" + }, + "hash_digest_output": { + "type": "boolean" + }, + "hash_flow_domain": { + "type": "long" + }, + "hash_initialiser_value": { + "type": "long" + }, + "hash_ipp_ayload_offset": { + "type": "long" + }, + "hash_ipp_ayload_size": { + "type": "long" + }, + "hash_output_range_max": { + "type": "long" + }, + "hash_output_range_min": { + "type": "long" + }, + "hash_selected_range_max": { + "type": "long" + }, + "hash_selected_range_min": { + "type": "long" + }, + "http_content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_message_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_reason_phrase": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_request_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_request_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_request_target": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_status_code": { + "type": "long" + }, + "http_user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code_ipv4": { + "type": "short" + }, + "icmp_code_ipv6": { + "type": "short" + }, + "icmp_type_code_ipv4": { + "type": "long" + }, + "icmp_type_code_ipv6": { + "type": "long" + }, + "icmp_type_ipv4": { + "type": "short" + }, + "icmp_type_ipv6": { + "type": "short" + }, + "igmp_type": { + "type": "short" + }, + "ignored_data_record_total_count": { + "type": "long" + }, + "ignored_layer2_frame_total_count": { + "type": "long" + }, + "ignored_layer2_octet_total_count": { + "type": "long" + }, + "ignored_octet_total_count": { + "type": "long" + }, + "ignored_packet_total_count": { + "type": "long" + }, + "information_element_data_type": { + "type": "short" + }, + "information_element_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "information_element_id": { + "type": "long" + }, + "information_element_index": { + "type": "long" + }, + "information_element_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "information_element_range_begin": { + "type": "long" + }, + "information_element_range_end": { + "type": "long" + }, + "information_element_semantics": { + "type": "short" + }, + "information_element_units": { + "type": "long" + }, + "ingress_broadcast_packet_total_count": { + "type": "long" + }, + "ingress_interface": { + "type": "long" + }, + "ingress_interface_type": { + "type": "long" + }, + "ingress_multicast_packet_total_count": { + "type": "long" + }, + "ingress_physical_interface": { + "type": "long" + }, + "ingress_unicast_packet_total_count": { + "type": "long" + }, + "ingress_vrfid": { + "type": "long" + }, + "initiator_octets": { + "type": "long" + }, + "initiator_packets": { + "type": "long" + }, + "interface_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "intermediate_process_id": { + "type": "long" + }, + "internal_address_realm": { + "type": "short" + }, + "ip_class_of_service": { + "type": "short" + }, + "ip_diff_serv_code_point": { + "type": "short" + }, + "ip_header_length": { + "type": "short" + }, + "ip_header_packet_section": { + "type": "short" + }, + "ip_next_hop_ipv4_address": { + "type": "ip" + }, + "ip_next_hop_ipv6_address": { + "type": "ip" + }, + "ip_payload_length": { + "type": "long" + }, + "ip_payload_packet_section": { + "type": "short" + }, + "ip_precedence": { + "type": "short" + }, + "ip_sec_spi": { + "type": "long" + }, + "ip_total_length": { + "type": "long" + }, + "ip_ttl": { + "type": "short" + }, + "ip_version": { + "type": "short" + }, + "ipv4_ihl": { + "type": "short" + }, + "ipv4_options": { + "type": "long" + }, + "ipv4_router_sc": { + "type": "ip" + }, + "ipv6_extension_headers": { + "type": "long" + }, + "is_multicast": { + "type": "short" + }, + "layer2_frame_delta_count": { + "type": "long" + }, + "layer2_frame_total_count": { + "type": "long" + }, + "layer2_octet_delta_count": { + "type": "long" + }, + "layer2_octet_delta_sum_of_squares": { + "type": "long" + }, + "layer2_octet_total_count": { + "type": "long" + }, + "layer2_octet_total_sum_of_squares": { + "type": "long" + }, + "layer2_segment_id": { + "type": "long" + }, + "layer2packet_section_data": { + "type": "short" + }, + "layer2packet_section_offset": { + "type": "long" + }, + "layer2packet_section_size": { + "type": "long" + }, + "line_card_id": { + "type": "long" + }, + "lower_cli_imit": { + "type": "double" + }, + "max_bieb_ntries": { + "type": "long" + }, + "max_entries_per_user": { + "type": "long" + }, + "max_export_seconds": { + "type": "date" + }, + "max_flow_end_microseconds": { + "type": "date" + }, + "max_flow_end_milliseconds": { + "type": "date" + }, + "max_flow_end_nanoseconds": { + "type": "date" + }, + "max_flow_end_seconds": { + "type": "date" + }, + "max_fragments_pending_reassembly": { + "type": "long" + }, + "max_session_entries": { + "type": "long" + }, + "max_subscribers": { + "type": "long" + }, + "maximum_ip_total_length": { + "type": "long" + }, + "maximum_layer2_total_length": { + "type": "long" + }, + "maximum_ttl": { + "type": "short" + }, + "message_md5_checksum": { + "type": "short" + }, + "message_scope": { + "type": "short" + }, + "metering_process_id": { + "type": "long" + }, + "metro_evc_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "metro_evc_type": { + "type": "short" + }, + "mib_capture_time_semantics": { + "type": "short" + }, + "mib_context_engine_id": { + "type": "short" + }, + "mib_context_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_index_indicator": { + "type": "long" + }, + "mib_module_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_identifier": { + "type": "short" + }, + "mib_object_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_syntax": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_value_bits": { + "type": "short" + }, + "mib_object_value_counter": { + "type": "long" + }, + "mib_object_value_gauge": { + "type": "long" + }, + "mib_object_value_integer": { + "type": "long" + }, + "mib_object_value_octet_string": { + "type": "short" + }, + "mib_object_value_oid": { + "type": "short" + }, + "mib_object_value_time_ticks": { + "type": "long" + }, + "mib_object_value_unsigned": { + "type": "long" + }, + "mib_object_valuei_pa_ddress": { + "type": "ip" + }, + "mib_sub_identifier": { + "type": "long" + }, + "min_export_seconds": { + "type": "date" + }, + "min_flow_start_microseconds": { + "type": "date" + }, + "min_flow_start_milliseconds": { + "type": "date" + }, + "min_flow_start_nanoseconds": { + "type": "date" + }, + "min_flow_start_seconds": { + "type": "date" + }, + "minimum_ip_total_length": { + "type": "long" + }, + "minimum_layer2_total_length": { + "type": "long" + }, + "minimum_ttl": { + "type": "short" + }, + "mobile_imsi": { + "ignore_above": 1024, + "type": "keyword" + }, + "mobile_msisdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "monitoring_interval_end_milli_seconds": { + "type": "date" + }, + "monitoring_interval_start_milli_seconds": { + "type": "date" + }, + "mpls_label_stack_depth": { + "type": "long" + }, + "mpls_label_stack_length": { + "type": "long" + }, + "mpls_label_stack_section": { + "type": "short" + }, + "mpls_label_stack_section10": { + "type": "short" + }, + "mpls_label_stack_section2": { + "type": "short" + }, + "mpls_label_stack_section3": { + "type": "short" + }, + "mpls_label_stack_section4": { + "type": "short" + }, + "mpls_label_stack_section5": { + "type": "short" + }, + "mpls_label_stack_section6": { + "type": "short" + }, + "mpls_label_stack_section7": { + "type": "short" + }, + "mpls_label_stack_section8": { + "type": "short" + }, + "mpls_label_stack_section9": { + "type": "short" + }, + "mpls_payload_length": { + "type": "long" + }, + "mpls_payload_packet_section": { + "type": "short" + }, + "mpls_top_label_exp": { + "type": "short" + }, + "mpls_top_label_ipv4_address": { + "type": "ip" + }, + "mpls_top_label_ipv6_address": { + "type": "ip" + }, + "mpls_top_label_prefix_length": { + "type": "short" + }, + "mpls_top_label_stack_section": { + "type": "short" + }, + "mpls_top_label_ttl": { + "type": "short" + }, + "mpls_top_label_type": { + "type": "short" + }, + "mpls_vpn_route_distinguisher": { + "type": "short" + }, + "multicast_replication_factor": { + "type": "long" + }, + "nat_event": { + "type": "short" + }, + "nat_instance_id": { + "type": "long" + }, + "nat_originating_address_realm": { + "type": "short" + }, + "nat_pool_id": { + "type": "long" + }, + "nat_pool_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat_quota_exceeded_event": { + "type": "long" + }, + "nat_threshold_event": { + "type": "long" + }, + "nat_type": { + "type": "short" + }, + "new_connection_delta_count": { + "type": "long" + }, + "next_header_ipv6": { + "type": "short" + }, + "not_sent_flow_total_count": { + "type": "long" + }, + "not_sent_layer2_octet_total_count": { + "type": "long" + }, + "not_sent_octet_total_count": { + "type": "long" + }, + "not_sent_packet_total_count": { + "type": "long" + }, + "observation_domain_id": { + "type": "long" + }, + "observation_domain_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "observation_point_id": { + "type": "long" + }, + "observation_point_type": { + "type": "short" + }, + "observation_time_microseconds": { + "type": "date" + }, + "observation_time_milliseconds": { + "type": "date" + }, + "observation_time_nanoseconds": { + "type": "date" + }, + "observation_time_seconds": { + "type": "date" + }, + "observed_flow_total_count": { + "type": "long" + }, + "octet_delta_count": { + "type": "long" + }, + "octet_delta_sum_of_squares": { + "type": "long" + }, + "octet_total_count": { + "type": "long" + }, + "octet_total_sum_of_squares": { + "type": "long" + }, + "opaque_octets": { + "type": "short" + }, + "original_exporter_ipv4_address": { + "type": "ip" + }, + "original_exporter_ipv6_address": { + "type": "ip" + }, + "original_flows_completed": { + "type": "long" + }, + "original_flows_initiated": { + "type": "long" + }, + "original_flows_present": { + "type": "long" + }, + "original_observation_domain_id": { + "type": "long" + }, + "p2p_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "packet_delta_count": { + "type": "long" + }, + "packet_total_count": { + "type": "long" + }, + "padding_octets": { + "type": "short" + }, + "payload_length_ipv6": { + "type": "long" + }, + "port_id": { + "type": "long" + }, + "port_range_end": { + "type": "long" + }, + "port_range_num_ports": { + "type": "long" + }, + "port_range_start": { + "type": "long" + }, + "port_range_step_size": { + "type": "long" + }, + "post_destination_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "post_dot1q_customer_vlan_id": { + "type": "long" + }, + "post_dot1q_vlan_id": { + "type": "long" + }, + "post_ip_class_of_service": { + "type": "short" + }, + "post_ip_diff_serv_code_point": { + "type": "short" + }, + "post_ip_precedence": { + "type": "short" + }, + "post_layer2_octet_delta_count": { + "type": "long" + }, + "post_layer2_octet_total_count": { + "type": "long" + }, + "post_mcast_layer2_octet_delta_count": { + "type": "long" + }, + "post_mcast_layer2_octet_total_count": { + "type": "long" + }, + "post_mcast_octet_delta_count": { + "type": "long" + }, + "post_mcast_octet_total_count": { + "type": "long" + }, + "post_mcast_packet_delta_count": { + "type": "long" + }, + "post_mcast_packet_total_count": { + "type": "long" + }, + "post_mpls_top_label_exp": { + "type": "short" + }, + "post_nadt_estination_ipv4_address": { + "type": "ip" + }, + "post_nadt_estination_ipv6_address": { + "type": "ip" + }, + "post_napdt_estination_transport_port": { + "type": "long" + }, + "post_napst_ource_transport_port": { + "type": "long" + }, + "post_nast_ource_ipv4_address": { + "type": "ip" + }, + "post_nast_ource_ipv6_address": { + "type": "ip" + }, + "post_octet_delta_count": { + "type": "long" + }, + "post_octet_total_count": { + "type": "long" + }, + "post_packet_delta_count": { + "type": "long" + }, + "post_packet_total_count": { + "type": "long" + }, + "post_source_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "post_vlan_id": { + "type": "long" + }, + "private_enterprise_number": { + "type": "long" + }, + "protocol_identifier": { + "type": "short" + }, + "pseudo_wire_control_word": { + "type": "long" + }, + "pseudo_wire_destination_ipv4_address": { + "type": "ip" + }, + "pseudo_wire_id": { + "type": "long" + }, + "pseudo_wire_type": { + "type": "long" + }, + "relative_error": { + "type": "double" + }, + "responder_octets": { + "type": "long" + }, + "responder_packets": { + "type": "long" + }, + "rfc3550_jitter_microseconds": { + "type": "long" + }, + "rfc3550_jitter_milliseconds": { + "type": "long" + }, + "rfc3550_jitter_nanoseconds": { + "type": "long" + }, + "rtp_sequence_number": { + "type": "long" + }, + "sampler_id": { + "type": "short" + }, + "sampler_mode": { + "type": "short" + }, + "sampler_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sampler_random_interval": { + "type": "long" + }, + "sampling_algorithm": { + "type": "short" + }, + "sampling_flow_interval": { + "type": "long" + }, + "sampling_flow_spacing": { + "type": "long" + }, + "sampling_interval": { + "type": "long" + }, + "sampling_packet_interval": { + "type": "long" + }, + "sampling_packet_space": { + "type": "long" + }, + "sampling_population": { + "type": "long" + }, + "sampling_probability": { + "type": "double" + }, + "sampling_size": { + "type": "long" + }, + "sampling_time_interval": { + "type": "long" + }, + "sampling_time_space": { + "type": "long" + }, + "section_exported_octets": { + "type": "long" + }, + "section_offset": { + "type": "long" + }, + "selection_sequence_id": { + "type": "long" + }, + "selector_algorithm": { + "type": "long" + }, + "selector_id": { + "type": "long" + }, + "selector_id_total_pkts_observed": { + "type": "long" + }, + "selector_id_total_pkts_selected": { + "type": "long" + }, + "selector_itd_otal_flows_observed": { + "type": "long" + }, + "selector_itd_otal_flows_selected": { + "type": "long" + }, + "selector_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_scope": { + "type": "short" + }, + "source_ipv4_address": { + "type": "ip" + }, + "source_ipv4_prefix": { + "type": "ip" + }, + "source_ipv4_prefix_length": { + "type": "short" + }, + "source_ipv6_address": { + "type": "ip" + }, + "source_ipv6_prefix": { + "type": "ip" + }, + "source_ipv6_prefix_length": { + "type": "short" + }, + "source_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_transport_port": { + "type": "long" + }, + "source_transport_ports_limit": { + "type": "long" + }, + "src_traffic_index": { + "type": "long" + }, + "sta_ipv4_address": { + "type": "ip" + }, + "sta_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "system_init_time_milliseconds": { + "type": "date" + }, + "tcp_ack_total_count": { + "type": "long" + }, + "tcp_acknowledgement_number": { + "type": "long" + }, + "tcp_control_bits": { + "type": "long" + }, + "tcp_destination_port": { + "type": "long" + }, + "tcp_fin_total_count": { + "type": "long" + }, + "tcp_header_length": { + "type": "short" + }, + "tcp_options": { + "type": "long" + }, + "tcp_psh_total_count": { + "type": "long" + }, + "tcp_rst_total_count": { + "type": "long" + }, + "tcp_sequence_number": { + "type": "long" + }, + "tcp_source_port": { + "type": "long" + }, + "tcp_syn_total_count": { + "type": "long" + }, + "tcp_urg_total_count": { + "type": "long" + }, + "tcp_urgent_pointer": { + "type": "long" + }, + "tcp_window_scale": { + "type": "long" + }, + "tcp_window_size": { + "type": "long" + }, + "template_id": { + "type": "long" + }, + "total_length_ipv4": { + "type": "long" + }, + "transport_octet_delta_count": { + "type": "long" + }, + "transport_packet_delta_count": { + "type": "long" + }, + "tunnel_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "udp_destination_port": { + "type": "long" + }, + "udp_message_length": { + "type": "long" + }, + "udp_source_port": { + "type": "long" + }, + "upper_cli_imit": { + "type": "double" + }, + "user_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "value_distribution_method": { + "type": "short" + }, + "virtual_station_interface_id": { + "type": "short" + }, + "virtual_station_interface_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_station_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_station_uuid": { + "type": "short" + }, + "vlan_id": { + "type": "long" + }, + "vpn_identifier": { + "type": "short" + }, + "vr_fname": { + "ignore_above": 1024, + "type": "keyword" + }, + "wlan_channel_id": { + "type": "short" + }, + "wlan_ssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "wtp_mac_address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "network": { + "properties": { + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "community_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "forwarded_ip": { + "type": "ip" + }, + "iana_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "transport": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "nginx": { + "properties": { + "access": { + "properties": { + "geoip": { + "type": "object" + }, + "user_agent": { + "type": "object" + } + } + }, + "error": { + "properties": { + "connection_id": { + "type": "long" + } + } + } + } + }, + "observer": { + "properties": { + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "organization": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "osquery": { + "properties": { + "result": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "calendar_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "unix_time": { + "type": "long" + } + } + } + } + }, + "postgresql": { + "properties": { + "log": { + "properties": { + "core_id": { + "type": "long" + }, + "database": { + "ignore_above": 1024, + "type": "keyword" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "process": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "ppid": { + "type": "long" + }, + "program": { + "ignore_above": 1024, + "type": "keyword" + }, + "start": { + "type": "date" + }, + "thread": { + "properties": { + "id": { + "type": "long" + } + } + }, + "title": { + "ignore_above": 1024, + "type": "keyword" + }, + "working_directory": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "redis": { + "properties": { + "log": { + "properties": { + "role": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "slowlog": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "cmd": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "properties": { + "us": { + "type": "long" + } + } + }, + "id": { + "type": "long" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "related": { + "properties": { + "ip": { + "type": "ip" + } + } + }, + "santa": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "decision": { + "ignore_above": 1024, + "type": "keyword" + }, + "disk": { + "properties": { + "bsdname": { + "ignore_above": 1024, + "type": "keyword" + }, + "bus": { + "ignore_above": 1024, + "type": "keyword" + }, + "fs": { + "ignore_above": 1024, + "type": "keyword" + }, + "model": { + "ignore_above": 1024, + "type": "keyword" + }, + "mount": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "volume": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + } + } + }, + "service": { + "properties": { + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "num": { + "type": "long" + }, + "org": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "domain_top1m_rank": { + "type": "long" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + } + } + }, + "stream": { + "ignore_above": 1024, + "type": "keyword" + }, + "suricata": { + "properties": { + "eve": { + "properties": { + "alert": { + "properties": { + "action": { + "path": "event.outcome", + "type": "alias" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "type": "long" + }, + "rev": { + "type": "long" + }, + "severity": { + "path": "event.severity", + "type": "alias" + }, + "signature": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_id": { + "type": "long" + } + } + }, + "app_proto": { + "path": "network.protocol", + "type": "alias" + }, + "app_proto_expected": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_proto_orig": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_proto_tc": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_proto_ts": { + "ignore_above": 1024, + "type": "keyword" + }, + "dest_ip": { + "path": "destination.ip", + "type": "alias" + }, + "dest_port": { + "path": "destination.port", + "type": "alias" + }, + "dns": { + "properties": { + "id": { + "type": "long" + }, + "rcode": { + "ignore_above": 1024, + "type": "keyword" + }, + "rdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "rrname": { + "ignore_above": 1024, + "type": "keyword" + }, + "rrtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "tx_id": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "properties": { + "status": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "fileinfo": { + "properties": { + "filename": { + "path": "file.path", + "type": "alias" + }, + "gaps": { + "type": "boolean" + }, + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "path": "file.size", + "type": "alias" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "stored": { + "type": "boolean" + }, + "tx_id": { + "type": "long" + } + } + }, + "flags": { + "type": "object" + }, + "flow": { + "properties": { + "age": { + "type": "long" + }, + "alerted": { + "type": "boolean" + }, + "bytes_toclient": { + "path": "destination.bytes", + "type": "alias" + }, + "bytes_toserver": { + "path": "source.bytes", + "type": "alias" + }, + "end": { + "type": "date" + }, + "pkts_toclient": { + "path": "destination.packets", + "type": "alias" + }, + "pkts_toserver": { + "path": "source.packets", + "type": "alias" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "start": { + "path": "event.start", + "type": "alias" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "flow_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "http": { + "properties": { + "hostname": { + "path": "url.domain", + "type": "alias" + }, + "http_content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_method": { + "path": "http.request.method", + "type": "alias" + }, + "http_refer": { + "path": "http.request.referrer", + "type": "alias" + }, + "http_user_agent": { + "path": "user_agent.original", + "type": "alias" + }, + "length": { + "path": "http.response.body.bytes", + "type": "alias" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "redirect": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "path": "http.response.status_code", + "type": "alias" + }, + "url": { + "path": "url.original", + "type": "alias" + } + } + }, + "icmp_code": { + "type": "long" + }, + "icmp_type": { + "type": "long" + }, + "in_iface": { + "ignore_above": 1024, + "type": "keyword" + }, + "pcap_cnt": { + "type": "long" + }, + "proto": { + "path": "network.transport", + "type": "alias" + }, + "smtp": { + "properties": { + "helo": { + "ignore_above": 1024, + "type": "keyword" + }, + "mail_from": { + "ignore_above": 1024, + "type": "keyword" + }, + "rcpt_to": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "src_ip": { + "path": "source.ip", + "type": "alias" + }, + "src_port": { + "path": "source.port", + "type": "alias" + }, + "ssh": { + "properties": { + "client": { + "properties": { + "proto_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "software_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "proto_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "software_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "stats": { + "properties": { + "app_layer": { + "properties": { + "flow": { + "properties": { + "dcerpc_tcp": { + "type": "long" + }, + "dcerpc_udp": { + "type": "long" + }, + "dns_tcp": { + "type": "long" + }, + "dns_udp": { + "type": "long" + }, + "failed_tcp": { + "type": "long" + }, + "failed_udp": { + "type": "long" + }, + "ftp": { + "type": "long" + }, + "http": { + "type": "long" + }, + "imap": { + "type": "long" + }, + "msn": { + "type": "long" + }, + "smb": { + "type": "long" + }, + "smtp": { + "type": "long" + }, + "ssh": { + "type": "long" + }, + "tls": { + "type": "long" + } + } + }, + "tx": { + "properties": { + "dcerpc_tcp": { + "type": "long" + }, + "dcerpc_udp": { + "type": "long" + }, + "dns_tcp": { + "type": "long" + }, + "dns_udp": { + "type": "long" + }, + "ftp": { + "type": "long" + }, + "http": { + "type": "long" + }, + "smb": { + "type": "long" + }, + "smtp": { + "type": "long" + }, + "ssh": { + "type": "long" + }, + "tls": { + "type": "long" + } + } + } + } + }, + "capture": { + "properties": { + "kernel_drops": { + "type": "long" + }, + "kernel_ifdrops": { + "type": "long" + }, + "kernel_packets": { + "type": "long" + } + } + }, + "decoder": { + "properties": { + "avg_pkt_size": { + "type": "long" + }, + "bytes": { + "type": "long" + }, + "dce": { + "properties": { + "pkt_too_small": { + "type": "long" + } + } + }, + "erspan": { + "type": "long" + }, + "ethernet": { + "type": "long" + }, + "gre": { + "type": "long" + }, + "icmpv4": { + "type": "long" + }, + "icmpv6": { + "type": "long" + }, + "ieee8021ah": { + "type": "long" + }, + "invalid": { + "type": "long" + }, + "ipraw": { + "properties": { + "invalid_ip_version": { + "type": "long" + } + } + }, + "ipv4": { + "type": "long" + }, + "ipv4_in_ipv6": { + "type": "long" + }, + "ipv6": { + "type": "long" + }, + "ipv6_in_ipv6": { + "type": "long" + }, + "ltnull": { + "properties": { + "pkt_too_small": { + "type": "long" + }, + "unsupported_type": { + "type": "long" + } + } + }, + "max_pkt_size": { + "type": "long" + }, + "mpls": { + "type": "long" + }, + "null": { + "type": "long" + }, + "pkts": { + "type": "long" + }, + "ppp": { + "type": "long" + }, + "pppoe": { + "type": "long" + }, + "raw": { + "type": "long" + }, + "sctp": { + "type": "long" + }, + "sll": { + "type": "long" + }, + "tcp": { + "type": "long" + }, + "teredo": { + "type": "long" + }, + "udp": { + "type": "long" + }, + "vlan": { + "type": "long" + }, + "vlan_qinq": { + "type": "long" + } + } + }, + "defrag": { + "properties": { + "ipv4": { + "properties": { + "fragments": { + "type": "long" + }, + "reassembled": { + "type": "long" + }, + "timeouts": { + "type": "long" + } + } + }, + "ipv6": { + "properties": { + "fragments": { + "type": "long" + }, + "reassembled": { + "type": "long" + }, + "timeouts": { + "type": "long" + } + } + }, + "max_frag_hits": { + "type": "long" + } + } + }, + "detect": { + "properties": { + "alert": { + "type": "long" + } + } + }, + "dns": { + "properties": { + "memcap_global": { + "type": "long" + }, + "memcap_state": { + "type": "long" + }, + "memuse": { + "type": "long" + } + } + }, + "file_store": { + "properties": { + "open_files": { + "type": "long" + } + } + }, + "flow": { + "properties": { + "emerg_mode_entered": { + "type": "long" + }, + "emerg_mode_over": { + "type": "long" + }, + "icmpv4": { + "type": "long" + }, + "icmpv6": { + "type": "long" + }, + "memcap": { + "type": "long" + }, + "memuse": { + "type": "long" + }, + "spare": { + "type": "long" + }, + "tcp": { + "type": "long" + }, + "tcp_reuse": { + "type": "long" + }, + "udp": { + "type": "long" + } + } + }, + "flow_mgr": { + "properties": { + "bypassed_pruned": { + "type": "long" + }, + "closed_pruned": { + "type": "long" + }, + "est_pruned": { + "type": "long" + }, + "flows_checked": { + "type": "long" + }, + "flows_notimeout": { + "type": "long" + }, + "flows_removed": { + "type": "long" + }, + "flows_timeout": { + "type": "long" + }, + "flows_timeout_inuse": { + "type": "long" + }, + "new_pruned": { + "type": "long" + }, + "rows_busy": { + "type": "long" + }, + "rows_checked": { + "type": "long" + }, + "rows_empty": { + "type": "long" + }, + "rows_maxlen": { + "type": "long" + }, + "rows_skipped": { + "type": "long" + } + } + }, + "http": { + "properties": { + "memcap": { + "type": "long" + }, + "memuse": { + "type": "long" + } + } + }, + "tcp": { + "properties": { + "insert_data_normal_fail": { + "type": "long" + }, + "insert_data_overlap_fail": { + "type": "long" + }, + "insert_list_fail": { + "type": "long" + }, + "invalid_checksum": { + "type": "long" + }, + "memuse": { + "type": "long" + }, + "no_flow": { + "type": "long" + }, + "overlap": { + "type": "long" + }, + "overlap_diff_data": { + "type": "long" + }, + "pseudo": { + "type": "long" + }, + "pseudo_failed": { + "type": "long" + }, + "reassembly_gap": { + "type": "long" + }, + "reassembly_memuse": { + "type": "long" + }, + "rst": { + "type": "long" + }, + "segment_memcap_drop": { + "type": "long" + }, + "sessions": { + "type": "long" + }, + "ssn_memcap_drop": { + "type": "long" + }, + "stream_depth_reached": { + "type": "long" + }, + "syn": { + "type": "long" + }, + "synack": { + "type": "long" + } + } + }, + "uptime": { + "type": "long" + } + } + }, + "tcp": { + "properties": { + "ack": { + "type": "boolean" + }, + "fin": { + "type": "boolean" + }, + "psh": { + "type": "boolean" + }, + "rst": { + "type": "boolean" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "syn": { + "type": "boolean" + }, + "tcp_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags_tc": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags_ts": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "timestamp": { + "path": "@timestamp", + "type": "alias" + }, + "tls": { + "properties": { + "fingerprint": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuerdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "notafter": { + "type": "date" + }, + "notbefore": { + "type": "date" + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_resumed": { + "type": "boolean" + }, + "sni": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tx_id": { + "type": "long" + } + } + } + } + }, + "syslog": { + "properties": { + "facility": { + "type": "long" + }, + "facility_label": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "type": "long" + }, + "severity_label": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "system": { + "properties": { + "auth": { + "properties": { + "groupadd": { + "type": "object" + }, + "ssh": { + "properties": { + "dropped_ip": { + "type": "ip" + }, + "geoip": { + "type": "object" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sudo": { + "properties": { + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "error": { + "ignore_above": 1024, + "type": "keyword" + }, + "pwd": { + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "useradd": { + "properties": { + "home": { + "ignore_above": 1024, + "type": "keyword" + }, + "shell": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "syslog": { + "type": "object" + } + } + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + }, + "traefik": { + "properties": { + "access": { + "properties": { + "backend_url": { + "ignore_above": 1024, + "type": "keyword" + }, + "frontend_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "properties": { + "city_name": { + "path": "source.geo.city_name", + "type": "alias" + }, + "continent_name": { + "path": "source.geo.continent_name", + "type": "alias" + }, + "country_iso_code": { + "path": "source.geo.country_iso_code", + "type": "alias" + }, + "location": { + "path": "source.geo.location", + "type": "alias" + }, + "region_iso_code": { + "path": "source.geo.region_iso_code", + "type": "alias" + }, + "region_name": { + "path": "source.geo.region_name", + "type": "alias" + } + } + }, + "request_count": { + "type": "long" + }, + "user_agent": { + "properties": { + "device": { + "path": "user_agent.device.name", + "type": "alias" + }, + "name": { + "path": "user_agent.name", + "type": "alias" + }, + "original": { + "path": "user_agent.original", + "type": "alias" + }, + "os": { + "path": "user_agent.os.full_name", + "type": "alias" + }, + "os_name": { + "path": "user_agent.os.name", + "type": "alias" + } + } + }, + "user_identifier": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "ignore_above": 1024, + "type": "keyword" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "audit": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "effective": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "filesystem": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "full_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "terminal": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user_agent": { + "properties": { + "device": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "major": { + "ignore_above": 1024, + "type": "keyword" + }, + "minor": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "major": { + "ignore_above": 1024, + "type": "keyword" + }, + "minor": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "patch": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zeek": { + "properties": { + "connection": { + "properties": { + "history": { + "ignore_above": 1024, + "type": "keyword" + }, + "local_orig": { + "type": "boolean" + }, + "local_resp": { + "type": "boolean" + }, + "missed_bytes": { + "type": "long" + }, + "orig_l2_addr": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "dns": { + "properties": { + "AA": { + "type": "boolean" + }, + "RA": { + "type": "boolean" + }, + "RD": { + "type": "boolean" + }, + "TC": { + "type": "boolean" + }, + "TTLs": { + "type": "double" + }, + "answers": { + "ignore_above": 1024, + "type": "keyword" + }, + "qclass": { + "type": "long" + }, + "qclass_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "qtype": { + "type": "long" + }, + "qtype_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "rcode": { + "type": "long" + }, + "rcode_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "rejected": { + "type": "boolean" + }, + "rtt": { + "type": "double" + }, + "saw_query": { + "type": "boolean" + }, + "saw_reply": { + "type": "boolean" + }, + "total_answers": { + "type": "long" + }, + "total_replies": { + "type": "long" + }, + "trans_id": { + "type": "long" + } + } + }, + "files": { + "properties": { + "analyzers": { + "ignore_above": 1024, + "type": "keyword" + }, + "depth": { + "type": "long" + }, + "duration": { + "type": "double" + }, + "entropy": { + "type": "double" + }, + "extracted": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_cutoff": { + "type": "boolean" + }, + "extracted_size": { + "type": "long" + }, + "filename": { + "ignore_above": 1024, + "type": "keyword" + }, + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_orig": { + "type": "boolean" + }, + "local_orig": { + "type": "boolean" + }, + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "missing_bytes": { + "type": "long" + }, + "overflow_bytes": { + "type": "long" + }, + "parent_fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "rx_host": { + "type": "ip" + }, + "seen_bytes": { + "type": "long" + }, + "session_ids": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "timedout": { + "type": "boolean" + }, + "total_bytes": { + "type": "long" + }, + "tx_host": { + "type": "ip" + } + } + }, + "http": { + "properties": { + "captured_password": { + "type": "boolean" + }, + "client_header_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "filename": { + "ignore_above": 1024, + "type": "keyword" + }, + "info_code": { + "type": "long" + }, + "info_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_filenames": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_mime_depth": { + "type": "long" + }, + "orig_mime_types": { + "ignore_above": 1024, + "type": "keyword" + }, + "proxied": { + "ignore_above": 1024, + "type": "keyword" + }, + "range_request": { + "type": "boolean" + }, + "resp_filenames": { + "ignore_above": 1024, + "type": "keyword" + }, + "resp_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "resp_mime_depth": { + "type": "long" + }, + "resp_mime_types": { + "ignore_above": 1024, + "type": "keyword" + }, + "server_header_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + }, + "trans_depth": { + "type": "long" + } + } + }, + "inner_vlan": { + "ignore_above": 1024, + "type": "keyword" + }, + "resp_l2_addr": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssl": { + "properties": { + "cert_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_chain_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_cert_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_cert_chain_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "established": { + "type": "boolean" + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_alert": { + "ignore_above": 1024, + "type": "keyword" + }, + "next_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "resumed": { + "type": "boolean" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "validation_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "settings": { + "index": { + "lifecycle": { + "name": "filebeat-7.0.0", + "rollover_alias": "filebeat-7.0.0" + }, + "mapping": { + "total_fields": { + "limit": "10000" + } + }, + "number_of_replicas": "0", + "number_of_shards": "1", + "query": { + "default_field": [ + "tags", + "message", + "agent.version", + "agent.name", + "agent.type", + "agent.id", + "agent.ephemeral_id", + "client.address", + "client.mac", + "client.domain", + "client.geo.continent_name", + "client.geo.country_name", + "client.geo.region_name", + "client.geo.city_name", + "client.geo.country_iso_code", + "client.geo.region_iso_code", + "client.geo.name", + "cloud.provider", + "cloud.availability_zone", + "cloud.region", + "cloud.instance.id", + "cloud.instance.name", + "cloud.machine.type", + "cloud.account.id", + "container.runtime", + "container.id", + "container.image.name", + "container.image.tag", + "container.name", + "destination.address", + "destination.mac", + "destination.domain", + "destination.geo.continent_name", + "destination.geo.country_name", + "destination.geo.region_name", + "destination.geo.city_name", + "destination.geo.country_iso_code", + "destination.geo.region_iso_code", + "destination.geo.name", + "ecs.version", + "error.id", + "error.message", + "error.code", + "event.id", + "event.kind", + "event.category", + "event.action", + "event.outcome", + "event.type", + "event.module", + "event.dataset", + "event.hash", + "event.timezone", + "file.path", + "file.target_path", + "file.extension", + "file.type", + "file.device", + "file.inode", + "file.uid", + "file.owner", + "file.gid", + "file.group", + "file.mode", + "group.id", + "group.name", + "host.hostname", + "host.name", + "host.id", + "host.mac", + "host.type", + "host.architecture", + "host.os.platform", + "host.os.name", + "host.os.full", + "host.os.family", + "host.os.version", + "host.os.kernel", + "host.geo.continent_name", + "host.geo.country_name", + "host.geo.region_name", + "host.geo.city_name", + "host.geo.country_iso_code", + "host.geo.region_iso_code", + "host.geo.name", + "http.request.method", + "http.request.body.content", + "http.request.referrer", + "http.response.body.content", + "http.version", + "log.level", + "network.name", + "network.type", + "network.iana_number", + "network.transport", + "network.application", + "network.protocol", + "network.direction", + "network.community_id", + "observer.mac", + "observer.hostname", + "observer.vendor", + "observer.version", + "observer.serial_number", + "observer.type", + "observer.os.platform", + "observer.os.name", + "observer.os.full", + "observer.os.family", + "observer.os.version", + "observer.os.kernel", + "observer.geo.continent_name", + "observer.geo.country_name", + "observer.geo.region_name", + "observer.geo.city_name", + "observer.geo.country_iso_code", + "observer.geo.region_iso_code", + "observer.geo.name", + "organization.name", + "organization.id", + "os.platform", + "os.name", + "os.full", + "os.family", + "os.version", + "os.kernel", + "process.name", + "process.args", + "process.executable", + "process.title", + "process.working_directory", + "server.address", + "server.mac", + "server.domain", + "server.geo.continent_name", + "server.geo.country_name", + "server.geo.region_name", + "server.geo.city_name", + "server.geo.country_iso_code", + "server.geo.region_iso_code", + "server.geo.name", + "service.id", + "service.name", + "service.type", + "service.state", + "service.version", + "service.ephemeral_id", + "source.address", + "source.mac", + "source.domain", + "source.geo.continent_name", + "source.geo.country_name", + "source.geo.region_name", + "source.geo.city_name", + "source.geo.country_iso_code", + "source.geo.region_iso_code", + "source.geo.name", + "url.original", + "url.full", + "url.scheme", + "url.domain", + "url.path", + "url.query", + "url.fragment", + "url.username", + "url.password", + "user.id", + "user.name", + "user.full_name", + "user.email", + "user.hash", + "user.group.id", + "user.group.name", + "user_agent.original", + "user_agent.name", + "user_agent.version", + "user_agent.device.name", + "user_agent.os.platform", + "user_agent.os.name", + "user_agent.os.full", + "user_agent.os.family", + "user_agent.os.version", + "user_agent.os.kernel", + "agent.hostname", + "error.type", + "cloud.project.id", + "kubernetes.pod.name", + "kubernetes.pod.uid", + "kubernetes.namespace", + "kubernetes.node.name", + "kubernetes.container.name", + "kubernetes.container.image", + "log.file.path", + "log.source.address", + "stream", + "input.type", + "syslog.severity_label", + "syslog.facility_label", + "process.program", + "log.flags", + "user_agent.os.full_name", + "fileset.name", + "apache.access.ssl.protocol", + "apache.access.ssl.cipher", + "apache.error.module", + "user.terminal", + "user.audit.id", + "user.audit.name", + "user.audit.group.id", + "user.audit.group.name", + "user.effective.id", + "user.effective.name", + "user.effective.group.id", + "user.effective.group.name", + "user.filesystem.id", + "user.filesystem.name", + "user.filesystem.group.id", + "user.filesystem.group.name", + "user.owner.id", + "user.owner.name", + "user.owner.group.id", + "user.owner.group.name", + "user.saved.id", + "user.saved.name", + "user.saved.group.id", + "user.saved.group.name", + "auditd.log.old_auid", + "auditd.log.new_auid", + "auditd.log.old_ses", + "auditd.log.new_ses", + "auditd.log.items", + "auditd.log.item", + "auditd.log.tty", + "auditd.log.a0", + "elasticsearch.component", + "elasticsearch.cluster.uuid", + "elasticsearch.cluster.name", + "elasticsearch.node.id", + "elasticsearch.node.name", + "elasticsearch.index.name", + "elasticsearch.index.id", + "elasticsearch.shard.id", + "elasticsearch.audit.layer", + "elasticsearch.audit.origin.type", + "elasticsearch.audit.realm", + "elasticsearch.audit.user.realm", + "elasticsearch.audit.user.roles", + "elasticsearch.audit.action", + "elasticsearch.audit.url.params", + "elasticsearch.audit.indices", + "elasticsearch.audit.request.id", + "elasticsearch.audit.request.name", + "elasticsearch.gc.phase.name", + "elasticsearch.gc.tags", + "elasticsearch.slowlog.logger", + "elasticsearch.slowlog.took", + "elasticsearch.slowlog.types", + "elasticsearch.slowlog.stats", + "elasticsearch.slowlog.search_type", + "elasticsearch.slowlog.source_query", + "elasticsearch.slowlog.extra_source", + "elasticsearch.slowlog.total_hits", + "elasticsearch.slowlog.total_shards", + "elasticsearch.slowlog.routing", + "elasticsearch.slowlog.id", + "elasticsearch.slowlog.type", + "haproxy.frontend_name", + "haproxy.backend_name", + "haproxy.server_name", + "haproxy.bind_name", + "haproxy.error_message", + "haproxy.source", + "haproxy.termination_state", + "haproxy.mode", + "haproxy.http.response.captured_cookie", + "haproxy.http.response.captured_headers", + "haproxy.http.request.captured_cookie", + "haproxy.http.request.captured_headers", + "haproxy.http.request.raw_request_line", + "icinga.debug.facility", + "icinga.main.facility", + "icinga.startup.facility", + "iis.access.site_name", + "iis.access.server_name", + "iis.access.cookie", + "iis.error.reason_phrase", + "iis.error.queue_name", + "iptables.fragment_flags", + "iptables.input_device", + "iptables.output_device", + "iptables.tcp.flags", + "iptables.ubiquiti.input_zone", + "iptables.ubiquiti.output_zone", + "iptables.ubiquiti.rule_number", + "iptables.ubiquiti.rule_set", + "kafka.log.component", + "kafka.log.class", + "kafka.log.trace.class", + "kafka.log.trace.message", + "kibana.log.tags", + "kibana.log.state", + "logstash.log.module", + "logstash.log.thread", + "text", + "logstash.slowlog.module", + "logstash.slowlog.thread", + "text", + "logstash.slowlog.event", + "text", + "logstash.slowlog.plugin_name", + "logstash.slowlog.plugin_type", + "logstash.slowlog.plugin_params", + "text", + "mongodb.log.component", + "mongodb.log.context", + "mysql.slowlog.query", + "mysql.slowlog.schema", + "mysql.slowlog.current_user", + "mysql.slowlog.last_errno", + "mysql.slowlog.killed", + "mysql.slowlog.log_slow_rate_type", + "mysql.slowlog.log_slow_rate_limit", + "mysql.slowlog.innodb.trx_id", + "netflow.type", + "netflow.exporter.address", + "netflow.source_mac_address", + "netflow.post_destination_mac_address", + "netflow.destination_mac_address", + "netflow.post_source_mac_address", + "netflow.interface_name", + "netflow.interface_description", + "netflow.sampler_name", + "netflow.application_description", + "netflow.application_name", + "netflow.class_name", + "netflow.wlan_ssid", + "netflow.vr_fname", + "netflow.metro_evc_id", + "netflow.nat_pool_name", + "netflow.p2p_technology", + "netflow.tunnel_technology", + "netflow.encrypted_technology", + "netflow.observation_domain_name", + "netflow.selector_name", + "netflow.information_element_description", + "netflow.information_element_name", + "netflow.virtual_station_interface_name", + "netflow.virtual_station_name", + "netflow.sta_mac_address", + "netflow.wtp_mac_address", + "netflow.user_name", + "netflow.application_category_name", + "netflow.application_sub_category_name", + "netflow.application_group_name", + "netflow.dot1q_customer_source_mac_address", + "netflow.dot1q_customer_destination_mac_address", + "netflow.mib_context_name", + "netflow.mib_object_name", + "netflow.mib_object_description", + "netflow.mib_object_syntax", + "netflow.mib_module_name", + "netflow.mobile_imsi", + "netflow.mobile_msisdn", + "netflow.http_request_method", + "netflow.http_request_host", + "netflow.http_request_target", + "netflow.http_message_version", + "netflow.http_user_agent", + "netflow.http_content_type", + "netflow.http_reason_phrase", + "osquery.result.name", + "osquery.result.action", + "osquery.result.host_identifier", + "osquery.result.calendar_time", + "postgresql.log.timestamp", + "postgresql.log.database", + "postgresql.log.query", + "redis.log.role", + "redis.slowlog.cmd", + "redis.slowlog.key", + "redis.slowlog.args", + "santa.action", + "santa.decision", + "santa.reason", + "santa.mode", + "santa.disk.volume", + "santa.disk.bus", + "santa.disk.serial", + "santa.disk.bsdname", + "santa.disk.model", + "santa.disk.fs", + "santa.disk.mount", + "certificate.common_name", + "certificate.sha256", + "hash.sha256", + "suricata.eve.event_type", + "suricata.eve.app_proto_orig", + "suricata.eve.tcp.tcp_flags", + "suricata.eve.tcp.tcp_flags_tc", + "suricata.eve.tcp.state", + "suricata.eve.tcp.tcp_flags_ts", + "suricata.eve.fileinfo.sha1", + "suricata.eve.fileinfo.state", + "suricata.eve.fileinfo.sha256", + "suricata.eve.fileinfo.md5", + "suricata.eve.dns.type", + "suricata.eve.dns.rrtype", + "suricata.eve.dns.rrname", + "suricata.eve.dns.rdata", + "suricata.eve.dns.rcode", + "suricata.eve.flow_id", + "suricata.eve.email.status", + "suricata.eve.http.redirect", + "suricata.eve.http.protocol", + "suricata.eve.http.http_content_type", + "suricata.eve.in_iface", + "suricata.eve.alert.category", + "suricata.eve.alert.signature", + "suricata.eve.ssh.client.proto_version", + "suricata.eve.ssh.client.software_version", + "suricata.eve.ssh.server.proto_version", + "suricata.eve.ssh.server.software_version", + "suricata.eve.tls.issuerdn", + "suricata.eve.tls.sni", + "suricata.eve.tls.version", + "suricata.eve.tls.fingerprint", + "suricata.eve.tls.serial", + "suricata.eve.tls.subject", + "suricata.eve.app_proto_ts", + "suricata.eve.flow.state", + "suricata.eve.flow.reason", + "suricata.eve.app_proto_tc", + "suricata.eve.smtp.rcpt_to", + "suricata.eve.smtp.mail_from", + "suricata.eve.smtp.helo", + "suricata.eve.app_proto_expected", + "system.auth.ssh.method", + "system.auth.ssh.signature", + "system.auth.sudo.error", + "system.auth.sudo.tty", + "system.auth.sudo.pwd", + "system.auth.sudo.user", + "system.auth.sudo.command", + "system.auth.useradd.home", + "system.auth.useradd.shell", + "traefik.access.user_identifier", + "traefik.access.frontend_name", + "traefik.access.backend_url", + "zeek.session_id", + "zeek.connection.state", + "zeek.connection.history", + "zeek.connection.orig_l2_addr", + "zeek.resp_l2_addr", + "zeek.vlan", + "zeek.inner_vlan", + "zeek.dns.query", + "zeek.dns.qclass_name", + "zeek.dns.qtype_name", + "zeek.dns.rcode_name", + "zeek.dns.answers", + "zeek.http.status_msg", + "zeek.http.info_msg", + "zeek.http.filename", + "zeek.http.tags", + "zeek.http.proxied", + "zeek.http.client_header_names", + "zeek.http.server_header_names", + "zeek.http.orig_fuids", + "zeek.http.orig_mime_types", + "zeek.http.orig_filenames", + "zeek.http.resp_fuids", + "zeek.http.resp_mime_types", + "zeek.http.resp_filenames", + "zeek.files.fuid", + "zeek.files.session_ids", + "zeek.files.source", + "zeek.files.analyzers", + "zeek.files.mime_type", + "zeek.files.filename", + "zeek.files.parent_fuid", + "zeek.files.md5", + "zeek.files.sha1", + "zeek.files.sha256", + "zeek.files.extracted", + "zeek.ssl.version", + "zeek.ssl.cipher", + "zeek.ssl.curve", + "zeek.ssl.server_name", + "zeek.ssl.next_protocol", + "zeek.ssl.cert_chain", + "zeek.ssl.cert_chain_fuids", + "zeek.ssl.client_cert_chain", + "zeek.ssl.client_cert_chain_fuids", + "zeek.ssl.issuer", + "zeek.ssl.client_issuer", + "zeek.ssl.validation_status", + "zeek.ssl.subject", + "zeek.ssl.client_subject", + "zeek.ssl.last_alert", + "fields.*" + ] + }, + "refresh_interval": "5s" + } + } + } +} \ No newline at end of file From a3c2aebb9ffe95a497ac54944486b2c8cc849c09 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Tue, 20 Apr 2021 11:38:16 +0200 Subject: [PATCH 80/82] [ML] Functional tests - stabilize anomaly charts embeddables test (#97452) This PR stabilizes the anomaly charts embeddables test by adding a retry. --- .../apps/ml_embeddables_in_dashboard.ts | 6 +----- .../anomaly_charts_dashboard_embeddables.ts | 6 +----- .../services/ml/dashboard_embeddables.ts | 17 ++++++++++++++++- .../ml/dashboard_job_selection_table.ts | 9 +++++++-- x-pack/test/functional/services/ml/index.ts | 6 +++++- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts b/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts index 51875c683346e..de44984a50c5b 100644 --- a/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts +++ b/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts @@ -58,7 +58,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); const PageObjects = getPageObjects(['common', 'timePicker', 'dashboard']); - const dashboardAddPanel = getService('dashboardAddPanel'); const a11y = getService('a11y'); /* this is the wrapping service around axe */ describe('machine learning embeddables anomaly charts', function () { @@ -96,10 +95,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('can open job selection flyout', async () => { await PageObjects.dashboard.clickCreateDashboardPrompt(); await ml.dashboardEmbeddables.assertDashboardIsEmpty(); - await dashboardAddPanel.clickEditorMenuButton(); - await dashboardAddPanel.clickEmbeddableFactoryGroupButton('ml'); - await dashboardAddPanel.clickAddNewEmbeddableLink('ml_anomaly_charts'); - await ml.dashboardJobSelectionTable.assertJobSelectionTableExists(); + await ml.dashboardEmbeddables.openJobSelectionFlyout(); await a11y.testAppSnapshot(); }); diff --git a/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts b/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts index 0aee183c1a4a5..d4eb45619b7f7 100644 --- a/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts +++ b/x-pack/test/functional/apps/ml/embeddables/anomaly_charts_dashboard_embeddables.ts @@ -58,7 +58,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); const PageObjects = getPageObjects(['common', 'timePicker', 'dashboard']); - const dashboardAddPanel = getService('dashboardAddPanel'); describe('anomaly charts', function () { this.tags(['mlqa']); @@ -87,10 +86,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('can open job selection flyout', async () => { await PageObjects.dashboard.clickCreateDashboardPrompt(); await ml.dashboardEmbeddables.assertDashboardIsEmpty(); - await dashboardAddPanel.clickEditorMenuButton(); - await dashboardAddPanel.clickEmbeddableFactoryGroupButton('ml'); - await dashboardAddPanel.clickAddNewEmbeddableLink('ml_anomaly_charts'); - await ml.dashboardJobSelectionTable.assertJobSelectionTableExists(); + await ml.dashboardEmbeddables.openJobSelectionFlyout(); }); it('can select jobs', async () => { diff --git a/x-pack/test/functional/services/ml/dashboard_embeddables.ts b/x-pack/test/functional/services/ml/dashboard_embeddables.ts index d0e100a57075a..db5c3f35a2e14 100644 --- a/x-pack/test/functional/services/ml/dashboard_embeddables.ts +++ b/x-pack/test/functional/services/ml/dashboard_embeddables.ts @@ -8,14 +8,17 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; import { MlCommonUI } from './common_ui'; +import { MlDashboardJobSelectionTable } from './dashboard_job_selection_table'; export function MachineLearningDashboardEmbeddablesProvider( { getService }: FtrProviderContext, - mlCommonUI: MlCommonUI + mlCommonUI: MlCommonUI, + mlDashboardJobSelectionTable: MlDashboardJobSelectionTable ) { const retry = getService('retry'); const testSubjects = getService('testSubjects'); const find = getService('find'); + const dashboardAddPanel = getService('dashboardAddPanel'); return { async assertAnomalyChartsEmbeddableInitializerExists() { @@ -91,5 +94,17 @@ export function MachineLearningDashboardEmbeddablesProvider( async assertAnomalyChartsExists() { await testSubjects.existOrFail(`mlExplorerChartsContainer`); }, + + async openJobSelectionFlyout() { + await retry.tryForTime(60 * 1000, async () => { + await dashboardAddPanel.clickEditorMenuButton(); + await testSubjects.existOrFail('dashboardEditorContextMenu', { timeout: 2000 }); + + await dashboardAddPanel.clickEmbeddableFactoryGroupButton('ml'); + await dashboardAddPanel.clickAddNewEmbeddableLink('ml_anomaly_charts'); + + await mlDashboardJobSelectionTable.assertJobSelectionTableExists(); + }); + }, }; } diff --git a/x-pack/test/functional/services/ml/dashboard_job_selection_table.ts b/x-pack/test/functional/services/ml/dashboard_job_selection_table.ts index b9fe43b000baf..f372928d92a50 100644 --- a/x-pack/test/functional/services/ml/dashboard_job_selection_table.ts +++ b/x-pack/test/functional/services/ml/dashboard_job_selection_table.ts @@ -6,8 +6,13 @@ */ import expect from '@kbn/expect'; +import { ProvidedType } from '@kbn/test/types/ftr'; import { FtrProviderContext } from '../../ftr_provider_context'; +export type MlDashboardJobSelectionTable = ProvidedType< + typeof MachineLearningDashboardJobSelectionTableProvider +>; + export function MachineLearningDashboardJobSelectionTableProvider({ getService, }: FtrProviderContext) { @@ -16,8 +21,8 @@ export function MachineLearningDashboardJobSelectionTableProvider({ return { async assertJobSelectionTableExists(): Promise { - await retry.tryForTime(5000, async () => { - await testSubjects.existOrFail('mlCustomSelectionTable'); + await retry.tryForTime(20 * 1000, async () => { + await testSubjects.existOrFail('mlCustomSelectionTable', { timeout: 2000 }); }); }, diff --git a/x-pack/test/functional/services/ml/index.ts b/x-pack/test/functional/services/ml/index.ts index fe46263f50266..05d369d890289 100644 --- a/x-pack/test/functional/services/ml/index.ts +++ b/x-pack/test/functional/services/ml/index.ts @@ -60,7 +60,11 @@ export function MachineLearningProvider(context: FtrProviderContext) { const customUrls = MachineLearningCustomUrlsProvider(context); const dashboardJobSelectionTable = MachineLearningDashboardJobSelectionTableProvider(context); - const dashboardEmbeddables = MachineLearningDashboardEmbeddablesProvider(context, commonUI); + const dashboardEmbeddables = MachineLearningDashboardEmbeddablesProvider( + context, + commonUI, + dashboardJobSelectionTable + ); const dataFrameAnalytics = MachineLearningDataFrameAnalyticsProvider(context, api); const dataFrameAnalyticsCreation = MachineLearningDataFrameAnalyticsCreationProvider( From b227b8fc8653e81dee91479ebc7a936f32171c06 Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Tue, 20 Apr 2021 11:48:14 +0200 Subject: [PATCH 81/82] [Lens] fix amsterdam theme issues (#97237) * adding border to the toolbar buttons * Weird ranges/filters shadows/borders fixed * suggestion shadows fixed * adjusting border radius on workspace * add new layer button * adjust styles for filter by just like for filter agg * don't show outer style for selecting the field item * fix color button * add padding to the button * v8 conditional * fix v7 * Update toolbar_button.scss Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/toolbar_button/toolbar_button.scss | 5 ++++ .../config_panel/config_panel.scss | 17 +++++++---- .../config_panel/config_panel.tsx | 4 ++- .../editor_frame/suggestion_panel.scss | 3 +- .../editor_frame/suggestion_panel.tsx | 2 ++ .../workspace_panel_wrapper.scss | 5 +++- .../dimension_panel/filtering.tsx | 30 +++++++++---------- .../indexpattern_datasource/field_item.scss | 8 ++++- .../definitions/shared_components/buckets.tsx | 2 +- 9 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/plugins/kibana_react/public/toolbar_button/toolbar_button.scss b/src/plugins/kibana_react/public/toolbar_button/toolbar_button.scss index f290b3c7c5f89..8a4545672de3c 100644 --- a/src/plugins/kibana_react/public/toolbar_button/toolbar_button.scss +++ b/src/plugins/kibana_react/public/toolbar_button/toolbar_button.scss @@ -2,8 +2,13 @@ line-height: $euiButtonHeight; // Keeps alignment of text and chart icon background-color: $euiColorEmptyShade; + // todo: once issue https://github.com/elastic/eui/issues/4730 is merged, this code might be safe to remove // Some toolbar buttons are just icons, but EuiButton comes with margin and min-width that need to be removed min-width: 0; + @include kbnThemeStyle('v8') { + border-width: $euiBorderWidthThin; + border-style: solid; + } &[class*='--text'] { // Lighten the border color for all states diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss index a58b5c21e7724..6629b44075831 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.scss @@ -1,7 +1,14 @@ +.lnsConfigPanel__addLayerBtnWrapper { + padding-bottom: $euiSize; +} + .lnsConfigPanel__addLayerBtn { - color: transparentize($euiColorMediumShade, .3); - // Remove EuiButton's default shadow to make button more subtle - // sass-lint:disable-block no-important - box-shadow: none !important; - border-color: $euiColorLightShade; + @include kbnThemeStyle('v7') { + // sass-lint:disable-block no-important + background-color: transparent !important; + color: transparentize($euiColorMediumShade, .3) !important; + border-color: $euiColorLightShade !important; + box-shadow: none !important; + } + } diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index 393c7363dc03f..d52fd29e7233a 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -134,7 +134,7 @@ export function LayerPanels( ) : null )} {activeVisualization.appendLayer && visualizationState && ( - + { const id = generateId(); dispatch({ diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss index b3e6f68b0a68c..b9f233d2b2950 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss @@ -27,6 +27,7 @@ margin-right: $euiSizeS; margin-left: $euiSizeXS / 2; margin-bottom: $euiSizeXS / 2; + box-shadow: none !important; // sass-lint:disable-line no-important &:focus { @include euiFocusRing; @@ -40,7 +41,7 @@ .lnsSuggestionPanel__button-isSelected { background-color: $euiColorLightestShade !important; // sass-lint:disable-line no-important - border-color: $euiColorMediumShade; + border-color: $euiColorMediumShade !important; // sass-lint:disable-line no-important &:not(:focus) { box-shadow: none !important; // sass-lint:disable-line no-important diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx index 9284b1dcc273d..e5acd2a2f47fd 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx @@ -130,6 +130,8 @@ const SuggestionPreview = ({
    + {/* Empty for spacing */} - + + + { + updateLayer(setFilter(columnId, layer, undefined)); + }} + iconType="cross" + /> + } @@ -112,19 +125,6 @@ export function Filtering({ /> - - { - updateLayer(setFilter(columnId, layer, undefined)); - }} - iconType="cross" - /> - ); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss index 19f5b91975202..a652a18752949 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.scss @@ -17,8 +17,14 @@ &:focus, &:focus-within, + .kbnFieldButton__button:focus:focus-visible, &.kbnFieldButton-isActive { - animation: none !important; // sass-lint:disable-line no-important + @include kbnThemeStyle('v7') { + animation: none !important; // sass-lint:disable-line no-important + } + @include kbnThemeStyle('v8') { + outline: none !important; // sass-lint:disable-line no-important + } } &:focus .kbnFieldButton__name span, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx index 38666185eda0e..b2cfc0e5a7c2c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/shared_components/buckets.tsx @@ -51,7 +51,7 @@ const BucketContainer = ({ isNotRemovable, }: BucketContainerProps) => { return ( - + {/* Empty for spacing */} From 4faff46b5391ee95b94970f5ad2b2c171f97d25e Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+Dmitriynj@users.noreply.github.com> Date: Tue, 20 Apr 2021 12:53:25 +0300 Subject: [PATCH 82/82] [Timelion] Fixes bug with escape colons in field names in the metric/split parameter (#96770) * [Timelion] add colons support in field names for metric * [Timelion] support percent for metric * [Timelion] get rid of array indexes * [Timelion] get rid of lodash methods * [Timelion] support colons in split. fix expression suggestions * [Timelion] escape colons for metric * [Timelion] use metric types common constants * [Timelion] support one symbol field name * [Timelion] resolve duplicate imports * [Timelion] remove console logs Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/vis_type_timelion/common/types.ts | 1 + .../timelion_expression_input_helpers.ts | 7 ++- .../public/helpers/arg_value_suggestions.ts | 14 ++++-- .../server/series_functions/es/es.test.js | 47 +++++++++++++++++-- .../series_functions/es/lib/build_request.js | 14 +++--- .../es/lib/create_date_agg.js | 36 +++++++++----- 6 files changed, 89 insertions(+), 30 deletions(-) diff --git a/src/plugins/vis_type_timelion/common/types.ts b/src/plugins/vis_type_timelion/common/types.ts index f3f2a74a711a9..8ce4bd8b45f0d 100644 --- a/src/plugins/vis_type_timelion/common/types.ts +++ b/src/plugins/vis_type_timelion/common/types.ts @@ -16,6 +16,7 @@ export interface TimelionFunctionArgsSuggestion { export interface TimelionFunctionArgs { name: string; help?: string; + insertText?: string; multi?: boolean; types: TimelionFunctionArgsTypes[]; suggestions?: TimelionFunctionArgsSuggestion[]; diff --git a/src/plugins/vis_type_timelion/public/components/timelion_expression_input_helpers.ts b/src/plugins/vis_type_timelion/public/components/timelion_expression_input_helpers.ts index 7c24eaa5902b4..6c3cd8058627a 100644 --- a/src/plugins/vis_type_timelion/public/components/timelion_expression_input_helpers.ts +++ b/src/plugins/vis_type_timelion/public/components/timelion_expression_input_helpers.ts @@ -244,10 +244,9 @@ export function getSuggestion( break; case SUGGESTION_TYPE.ARGUMENT_VALUE: - const param = suggestion.name.split(':'); - - if (param.length === 1 || param[1]) { - insertText = `${param.length === 1 ? insertText : param[1]},`; + const defaultText = (suggestion as TimelionFunctionArgs).insertText; + if (defaultText) { + insertText = `${defaultText},`; } command = { diff --git a/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts b/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts index 0a989858706df..d8ec46eba004f 100644 --- a/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts +++ b/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts @@ -51,6 +51,7 @@ export function getArgValueSuggestions() { return (await indexPatterns.find(search, size)).map(({ title }) => ({ name: title, + insertText: title, })); }, async metric(partial: string, functionArgs: TimelionExpressionFunction[]) { @@ -81,7 +82,14 @@ export function getArgValueSuggestions() { containsFieldName(valueSplit[1], field) && !indexPatternsUtils.isNestedField(field) ) - .map((field) => ({ name: `${valueSplit[0]}:${field.name}`, help: field.type })); + .map((field) => { + const suggestionValue = field.name.replaceAll(':', '\\:'); + return { + name: `${valueSplit[0]}:${suggestionValue}`, + help: field.type, + insertText: suggestionValue, + }; + }); }, async split(partial: string, functionArgs: TimelionExpressionFunction[]) { const indexPattern = await getIndexPattern(functionArgs); @@ -105,7 +113,7 @@ export function getArgValueSuggestions() { containsFieldName(partial, field) && !indexPatternsUtils.isNestedField(field) ) - .map((field) => ({ name: field.name, help: field.type })); + .map((field) => ({ name: field.name, help: field.type, insertText: field.name })); }, async timefield(partial: string, functionArgs: TimelionExpressionFunction[]) { const indexPattern = await getIndexPattern(functionArgs); @@ -121,7 +129,7 @@ export function getArgValueSuggestions() { containsFieldName(partial, field) && !indexPatternsUtils.isNestedField(field) ) - .map((field) => ({ name: field.name })); + .map((field) => ({ name: field.name, insertText: field.name })); }, }, }; diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index 566001ce44182..3ace745604660 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -123,13 +123,35 @@ describe('es', () => { const emptyScriptedFields = []; test('adds a metric agg for each metric', () => { - config.metric = ['sum:beer', 'avg:bytes', 'percentiles:bytes']; + config.metric = [ + 'sum:beer', + 'avg:bytes', + 'percentiles:bytes', + 'cardinality:\\:sample', + 'sum:\\:beer', + 'percentiles:\\:\\:bytes:1.2,1.3,2.7', + 'percentiles:\\:bytes\\:123:20.0,50.0,100.0', + 'percentiles:a:2', + ]; agg = createDateAgg(config, tlConfig, emptyScriptedFields); expect(agg.time_buckets.aggs['sum(beer)']).toEqual({ sum: { field: 'beer' } }); expect(agg.time_buckets.aggs['avg(bytes)']).toEqual({ avg: { field: 'bytes' } }); expect(agg.time_buckets.aggs['percentiles(bytes)']).toEqual({ percentiles: { field: 'bytes' }, }); + expect(agg.time_buckets.aggs['cardinality(:sample)']).toEqual({ + cardinality: { field: ':sample' }, + }); + expect(agg.time_buckets.aggs['sum(:beer)']).toEqual({ sum: { field: ':beer' } }); + expect(agg.time_buckets.aggs['percentiles(::bytes)']).toEqual({ + percentiles: { field: '::bytes', percents: [1.2, 1.3, 2.7] }, + }); + expect(agg.time_buckets.aggs['percentiles(:bytes:123)']).toEqual({ + percentiles: { field: ':bytes:123', percents: [20.0, 50.0, 100.0] }, + }); + expect(agg.time_buckets.aggs['percentiles(a)']).toEqual({ + percentiles: { field: 'a', percents: [2] }, + }); }); test('adds a scripted metric agg for each scripted metric', () => { @@ -158,6 +180,13 @@ describe('es', () => { expect(typeof agg.time_buckets.aggs.count.bucket_script).toBe('object'); expect(agg.time_buckets.aggs.count.bucket_script.buckets_path).toEqual('_count'); }); + + test('has a special `count` metric with redundant field which use a script', () => { + config.metric = ['count:beer']; + agg = createDateAgg(config, tlConfig, emptyScriptedFields); + expect(typeof agg.time_buckets.aggs.count.bucket_script).toBe('object'); + expect(agg.time_buckets.aggs.count.bucket_script.buckets_path).toEqual('_count'); + }); }); }); @@ -305,10 +334,10 @@ describe('es', () => { describe('config.split', () => { test('adds terms aggs, in order, under the filters agg', () => { - config.split = ['beer:5', 'wine:10']; + config.split = ['beer:5', 'wine:10', ':lemo:nade::15', ':jui:ce:723::45']; const request = fn(config, tlConfig, emptyScriptedFields); - const aggs = request.params.body.aggs.q.aggs; + let aggs = request.params.body.aggs.q.aggs; expect(aggs.beer.meta.type).toEqual('split'); expect(aggs.beer.terms.field).toEqual('beer'); @@ -317,6 +346,18 @@ describe('es', () => { expect(aggs.beer.aggs.wine.meta.type).toEqual('split'); expect(aggs.beer.aggs.wine.terms.field).toEqual('wine'); expect(aggs.beer.aggs.wine.terms.size).toEqual(10); + + aggs = aggs.beer.aggs.wine.aggs; + expect(aggs).toHaveProperty(':lemo:nade:'); + expect(aggs[':lemo:nade:'].meta.type).toEqual('split'); + expect(aggs[':lemo:nade:'].terms.field).toEqual(':lemo:nade:'); + expect(aggs[':lemo:nade:'].terms.size).toEqual(15); + + aggs = aggs[':lemo:nade:'].aggs; + expect(aggs).toHaveProperty(':jui:ce:723:'); + expect(aggs[':jui:ce:723:'].meta.type).toEqual('split'); + expect(aggs[':jui:ce:723:'].terms.field).toEqual(':jui:ce:723:'); + expect(aggs[':jui:ce:723:'].terms.size).toEqual(45); }); test('adds scripted terms aggs, in order, under the filters agg', () => { diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js b/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js index a4aa4f73547e4..a30b197e46067 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/lib/build_request.js @@ -48,17 +48,17 @@ export default function buildRequest(config, tlConfig, scriptedFields, timeout) let aggCursor = aggs.q.aggs; - _.each(config.split, function (clause) { - clause = clause.split(':'); - if (clause[0] && clause[1]) { - const termsAgg = buildAggBody(clause[0], scriptedFields); - termsAgg.size = parseInt(clause[1], 10); - aggCursor[clause[0]] = { + (config.split || []).forEach((clause) => { + const [field, arg] = clause.split(/:(\d+$)/); + if (field && arg) { + const termsAgg = buildAggBody(field, scriptedFields); + termsAgg.size = parseInt(arg, 10); + aggCursor[field] = { meta: { type: 'split' }, terms: termsAgg, aggs: {}, }; - aggCursor = aggCursor[clause[0]].aggs; + aggCursor = aggCursor[field].aggs; } else { throw new Error('`split` requires field:limit'); } diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/lib/create_date_agg.js b/src/plugins/vis_type_timelion/server/series_functions/es/lib/create_date_agg.js index 09ae4d8ef3467..55538fbff4e79 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/lib/create_date_agg.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/lib/create_date_agg.js @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import _ from 'lodash'; import { buildAggBody } from './agg_body'; -import { search } from '../../../../../../plugins/data/server'; +import { search, METRIC_TYPES } from '../../../../../data/server'; + const { dateHistogramInterval } = search.aggs; export default function createDateAgg(config, tlConfig, scriptedFields) { @@ -29,29 +29,39 @@ export default function createDateAgg(config, tlConfig, scriptedFields) { }; dateAgg.time_buckets.aggs = {}; - _.each(config.metric, function (metric) { - metric = metric.split(':'); - if (metric[0] === 'count') { + (config.metric || []).forEach((metric) => { + const metricBody = {}; + const [metricName, metricArgs] = metric.split(/:(.+)/); + if (metricName === METRIC_TYPES.COUNT) { // This is pretty lame, but its how the "doc_count" metric has to be implemented at the moment // It simplifies the aggregation tree walking code considerably - dateAgg.time_buckets.aggs[metric] = { + metricBody[metricName] = { bucket_script: { buckets_path: '_count', script: { source: '_value', lang: 'expression' }, }, }; - } else if (metric[0] && metric[1]) { - const metricName = metric[0] + '(' + metric[1] + ')'; - dateAgg.time_buckets.aggs[metricName] = {}; - dateAgg.time_buckets.aggs[metricName][metric[0]] = buildAggBody(metric[1], scriptedFields); - if (metric[0] === 'percentiles' && metric[2]) { - let percentList = metric[2].split(','); + } else if (metricName && metricArgs) { + const splittedArgs = metricArgs.split(/(.*[^\\]):/).filter(Boolean); + const field = splittedArgs[0].replace(/\\:/g, ':'); + const percentArgs = splittedArgs[1]; + const metricKey = metricName + '(' + field + ')'; + + metricBody[metricKey] = { [metricName]: buildAggBody(field, scriptedFields) }; + + if (metricName === METRIC_TYPES.PERCENTILES && percentArgs) { + let percentList = percentArgs.split(','); percentList = percentList.map((x) => parseFloat(x)); - dateAgg.time_buckets.aggs[metricName][metric[0]].percents = percentList; + metricBody[metricKey][metricName].percents = percentList; } } else { throw new Error('`metric` requires metric:field or simply count'); } + + dateAgg.time_buckets.aggs = { + ...dateAgg.time_buckets.aggs, + ...metricBody, + }; }); return dateAgg;

    @1jJCWNs4p*YMQ|Vo;s(Z$9 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≤LKxg81Dx>^yv>kM1DFUvEq)CkUW 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�q@ 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